java构造函数如何工作?

时间:2018-05-29 12:23:51

标签: java inheritance superclass

我有以下程序:

class A{
    int b = 50;
}

class B extends A{
    int b = 20;
}

public class Maini{
    public static void main(String[] args){
        A a = new B();
        System.out.println(a.b);
    }
}

结果是50,我想知道为什么? 在我运行代码之前,我很确定结果应该是20。

6 个答案:

答案 0 :(得分:3)

这与构造函数的工作原理无关。

请注意,类b中的成员变量B不会覆盖类b中的成员变量A。只能覆盖非静态,非私有方法。成员变量无法覆盖。

如果你有一个类B的实例,那么它实际上有两个名为b的成员变量:一个在对象的超类(A)部分,另一个在子类部分(B)。

您在对象的b部分中看到值50(即A的值)的原因是因为a中的变量main方法属于A类型。如果您将其更改为B,那么您将获得20:

B a = new B();  // instead of A a = ...;

答案 1 :(得分:1)

声明

A a = new B();

您正在A类型的对象中调用Bs构造函数

在你的程序中,你没有给B构造函数,所以看起来是A。

在A中,int b的值为50,对象的类型为A,因此该值选为50

如果你在B中有一个构造函数,例如

B() { b = 20;}

该值为20。

答案 2 :(得分:0)

当您编写A a = new B()时,对象a的类型为A。这就是你获得b = 50的原因。如果您想获得b = 20,则需要将a声明为B

希望它足够清楚。

最佳

答案 3 :(得分:0)

你认为你正在创建一个B,但你没有为B类编写任何构造函数,所以它看起来是super()构造函数,它是它的父母(A)。所以你现在有一个A的对象。如果你很好奇为什么A对象isi被创建,而没有构造函数。调用它的超级构造函数也是Java的Object Class的构造函数。

我希望我能说清楚这一点。

答案 4 :(得分:0)

使用支持intellitrace的IDE以获得更好的编码体验。 首先,如果你没有强加它,你将拥有一个默认构造函数。 其次,您要定义“A”类型的对象而不是“B”。如果你想输出为20那么你就要包含这个B(){int b = 20;}。

答案 5 :(得分:0)

在这段代码中,Sniplet在Any类中没有构造函数 因此JVM将在所有类中创建无参数默认构造函数。

当你正在运行时。

在下面的代码中 a 指的是 A类,其对象是 B类

<body>
    <iframe src="chrome-extension://hclbghnhiklgejahckgmpldjgfgleofc/index.html"></iframe>
</body>

所以这里的对象 a 将具有 A类的变量值。 和B类对象值作为其调用类B的默认构造函数(A a = new B(); ) 如果A类和B类具有相同的方法,如下例:

new B();

然后class A{ int b = 50; void method(){ System.out.println("Method of A class"); } } class B extends A{ int b = 20; void method(){ System.out.println("Method of B class"); } } public class Maini{ public static void main(String[] args){ A a = new B(); System.out.println(a.b); a.method(); } } 将打印

50
B类方法


因为 a B类的对象。