最近在自学Java,看的书是《Java核心技术卷1基础知识》,其中有一段是这样写的,
我写了段代码想把这段实现一下验证以便加强记忆,但是并没有像书里说的报错啊。代码如下:
public class RunTime {
public static void main(String[] args) {
B b = new B();
b.print();
}
}
class A
{
}
class B extends A
{
public void print()
{
System.out.println("111111111111");
}
}
请帮我看看分析一下我的代码为什么没有验证书上的内容呗。
超类A,你没有显示的声明构造方法,所以它有默认的构造方法
因为你的父类和子类都没有自定义的构造方法,所以都是默认的构造函数。
class A
{
public A(int a) { }
}
这么写,那么因为没有默认的A()无参数构造函数,就会报错了。
class B extends A
{
public B() { super(1); }
}
则可以编译
Java类中,如果没有 声明任何 构造方法,java类会默认 生成 无参数构造方法,但是,如果 类中 有声明 有参构造方法,那么Java类就不会再创建无参数的构造方法,这时,如果还要使用无参构造方法,就需要 显式的声明 无参构造方法
如果没有显式声明构造器的话,默认提供一个无参数的构造器,所以class A不符合“超类没有不带参数的构造器”这个条件
如果没有显式声明构造器的话,默认提供一个无参数的构造器。默認了
如果你的A里面没有声明其他的带参构造器的话,默认是有一个不带参的构造器的。所以你这样写是符合规则的,如果你的A写了一个带参的构造器,你的B
没有显示调用的话,才会报错
首先,一个类如果不写构造函数,编译的时候jvm会默认添加无参构造函数。所以你的 class A是有无参构造函数的。其次class A和class B是继承关系,所以在创建B类对象的时候,就会执行隐式三步中的第一部super(),也就是调用父类的无参构造函数。然而你的class A中是存在无参构造函数的,所以没有问题。如果要验证你所讲的问题,在class A中添加无参构造函数(这样jvm在编译的时候,就不会再自动添加无参构造函数了),你的答案会得到验证。要了解隐式三步可以参考:http://blog.csdn.net/static_coder/article/details/54631613
A里面有默认的无参的构造器啊,不是说B没有显示的调用A的构造器,就会调用A的无参构造器么。。。