关于Java中的默认构造方法

最近在自学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");
    }
}

请帮我看看分析一下我的代码为什么没有验证书上的内容呗。

10个回答

class A
{
public A(int a) { }
}
这么写,那么因为没有默认的A()无参数构造函数,就会报错了。

超类A,你没有显示的声明构造方法,所以它有默认的构造方法

因为你的父类和子类都没有自定义的构造方法,所以都是默认的构造函数。

class B extends A
{
public B() { super(1); }
}
则可以编译

如果没有显式声明构造器的话,默认提供一个无参数的构造器,所以class A不符合“超类没有不带参数的构造器”这个条件

Java类中,如果没有 声明任何 构造方法,java类会默认 生成 无参数构造方法,但是,如果 类中 有声明 有参构造方法,那么Java类就不会再创建无参数的构造方法,这时,如果还要使用无参构造方法,就需要 显式的声明 无参构造方法

如果没有显式声明构造器的话,默认提供一个无参数的构造器。默認了

如果你的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的无参构造器么。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问