Java中的继承和构造函数

Clo*_*loo -6 java inheritance constructor

在以下示例中:

class A {  
    private int a;
    private int b;
    private int c;

    public A(int a, int b , int c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

class B extends A {
    public B() {
         super(1,2,3);         
    }
Run Code Online (Sandbox Code Playgroud)
  1. 是否该语句super(1,2,3)class B创建私有领域一样,在A类的私有字段?或者使用此语句是否违法,因为B不能继承A的私有字段?
  2. 我们假设我们没有在类B中使用超级构造函数,那么通常计算机将调用类A的默认构造函数.我们知道私有字段不是在Java中继承的,那么默认构造函数在这种状态下初始化的是什么?

Sha*_*dge 8

你不能这样打电话super():

 class B extends A {
      super(1,2,3);
   }
Run Code Online (Sandbox Code Playgroud)

super()OR this()应该是构造函数中的第一个语句.首先纠正你的这个基本错误,然后再继续.super()默认情况下使用,即使您没有明确使用它.

class B extends A {
    B (){
       super(1,2,3);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法.在发布问题之前,请先阅读有关构造函数和Java语言基础知识的内容.

编辑

我没有注意到有人编辑了你的问题要添加super(1,2,3)到构造函数中,现在回答你的问题如下:

B类中的语句super(1,2,3)是否创建了与A类中的私有字段相同的私有字段?或者使用此语句是否违法,因为B不能继承A的私有字段?

不,通过调用super(1,2,3)你正在做的就是将3个整数值传递给基类构造函数public A(int a, int b , int c)之后你将这些值分配给基类的私有实例变量,你不是为类B创建一个单独的字段,如果那样的话你问的是什么,并且没有B类仍然无法直接访问基类实例变量(通过直接声明我的意思是继承或制作实例,还有其他方法,如setter/getters等)

我们假设我们没有在类B中使用超级构造函数,那么通常计算机将调用类A的默认构造函数.我们知道私有字段不是在Java中继承的,那么默认构造函数在这种状态下初始化的是什么?

不,如果您不在B类中使用构造函数super(int, int, int)来匹配基类构造函数的参数,(int a, int b , int c)那么您的代码甚至不会编译.默认构造函数将调用Base类的no-args构造函数,但由于Base类没有默认构造函数,因此您将收到编译错误!