public class A {
int a=1;
public A (){
System.out.println(a);
}
}
public class B extends A{
int a=4;
public B(){
System.out.println(a);
}
}
public class Text {
public static void main(String[] args) {
A a=new A();
B b=new B();
System.out.println("A中a的值"+a.a);
System.out.println("B中a的值"+b.a);
}
}
结果
1
1
4
A中a的值1
B中a的值4
为什么结果是这个样子,构造函数不是在实例化的时候才被执行吗???
我想你现在是不是正在学习java的OOP。
面向对象的继承关系。
类A是父类,类B是子类,
1.当我们用A a=new A();时
首先程序会先调用类A的无参的构造函数。就会输出"1".
2.当我们用B b=new B();时
首先程序会先调用类B的父类(即类A)的无参的构造函数,就会输出"1",
再调用自身类( 即类B)的无参的构造函数。就会输出"4";
3.当我们用System.out.println("A中a的值"+a.a);时
程序会根据你所创建的对象(A)中去寻中a字段.然后将值输出在控制台.就会输出"A中a的值1"
4。当我们用System.out.println("B中a的值"+b.a);
程序会根据你所创建的对象(B)中去寻找a字段,然后将值输出在控制台.就会输出"B中a的值4"
给你点提示,在javaoop当中,调用子类时,程序首先会去调用该类的父类的构造函数,然后再调用自身的构 造函数。我想你主要是这点没明白。
还有就是要注意的是调用一个类时。该类有无参的构造函数。程序会首先调用该类的无参的构造函数.
如果没有给无参的构造函数.系统会默认添加。但是前提条件是你并没有给该类提供有参的构造函数。
以上说法只对new 类();有效.
加油吧。javaOOP是很重要的也是有点难度的。希望你能够多练习、多思考。这样就能很快的掌握这门知识
程序执行步骤:
new A(); ->初始化类A里的全局变量 ->执行类A的构造函数(输出 1 ) ->new B(); -> 初始化类B的全局变量 ->由于类B继承了类A,JVM隐含执行类A的初始化,执行其构造(又输出一个 1) ->执行类B的构造函数(输出 4 )-> 继续输出 (A中a的值1)和( B中a的值4)
public B(){
System.out.println(a);
}
有一部分缺省了,这个缺省段在子类构造函数第一行没有调用父类任何构造函数时默认添加:
public B(){
super();
System.out.println(a);
}
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息