java 面向对象经典试题_Java经典的一道面向对象面试题

请写出最后输出的结果

.public class A {

String name ="A";

public A() {

print();

}

public void print(){

System.out.println("name");

}

}public class B extends A{

String name="B";

public B() {

print();

}

public void print(){

System.out.println(name);

}

public static void main(String[] args) {

new B();

}

}

一些人觉得 输出的结果为:

A

B

其思路为: 当子类的构造函数被调用时,

其会隐式的调用其父类的构造函数(通过super() 函数调用),

于是父类的构造函数会调用 print()方法

,因此打印的为A

然后父类的构造函数执行完后 回到子类的构造函数

再初始化 子类的成员变量

最后调用子类的print()方法打印 B

但是当我们在运行这个程序的时候 我们却发现 输出的结果为

null

B

那么问题究竟出在哪里呢?

接下来我们分析一下整个执行的过程,也就是new B();这个操作背后到底做了什么

1.首先 进入 B 的构造函数

2.为 B 的成员变量分配内存(此时还没有进行初始化)

3. A 的构造函数被隐式的调用

4. 为A的成员变量分配内存(相当于 String name 仅仅是在内存中占个位置)

5.初始化A的成员变量 即 name = "A";

6.调用 print()方法

7.执行B的print()方法

8.输出null

9.再回到B的构造函数

10.初始化B的成员变量 name="B";

11.调用 print()方法

12.执行B的print()方法

13.输出B个人觉得 以上有两点需要注意的

第一点:就是当进入父类的构造函数中调用print()方法的时候 其实调用的是子类的print()方法

因为父类的构造器中的方法是在子类中调用的 而且子类重写了print()方法 所以当然调用的是子类的方法

第二点:就是

String name ="B";

public B() {

print();

}

这段代码在执行的过程中其实是这样的

String name;

public B() {

super();

name="B";

print();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值