public class A {
public A() {
init();
}
protected void init() {
} public void print() {
System.out.print("1");
}
}
public class B extends A{
private String b1=null;
protected void init() {
this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();
a.print();
}
}
结果是0null why?
面试题类
public A() {
init();
}
protected void init() {
} public void print() {
System.out.print("1");
}
}
public class B extends A{
private String b1=null;
protected void init() {
this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();
a.print();
}
}
结果是0null why?
面试题类
解决方案 »
- 我现在做的java web 项目 怎么没看到main()函数
- 多线程同步问题 新开一贴 标题还是要长...................................
- JAVA编程问题!!
- 缓冲区是干什么的。JVM是怎么管理缓冲区的。
- 大哥大姐帮帮忙!
- 关于Panel的一个问题!!!
- 如何学习好java?
- File类的getLastModify()得到的是长型整数,如何才能得到一个已知文件日期?
- 谁知道怎么样用swing实现类似win2000打开文件窗口左边一个竖排的按钮组?
- 小白第一次发帖,遇难题 求解救
- java如何获取sqlcode
- Spring JdbcTemplate能否实现连接池重置?
显示调用:
class B extends A {
private String b1 = null; //注意这里
public B() {
super();
} protected void init() {
this.b1 = "0";
print();
} public void print() {
System.out.print(b1);
} public static void main(String[] args) {
A a = new B();
a.print();
}
}
另外下次发帖记得用代码块高亮功能,不然看着很累
调用父类的构造方法
public A() {
init();
}
执行其中的init();时,因子类重写了该方法,所在实际上执行的是子类B的init()方法
于是,输出0
再执行B类的构造方法
接着初始化B类的成员private String b1 = null;
再接着执行a.print();,此时执行的是B类重写的print()方法
public void print() {
System.out.print(b1);
}
于是输出了null
不知道我说清楚没有。
我想既然输出的不一样,应该输出的b值属于不用的实例对象一个是子类一个是父类
我感觉我这么想是错误的 但是我也只能想到这里了 我刚学java不久
super();
}
调用完super()之后还会调用private String b1 = null;这条语句么
再执行a.print();而调用的还是子类复写的print();方法,所以输出null,
在这里有一个误区,即调用父类的构造时,执行init();方法中的b1并非是执行a.print();时的b1,这两个b1不是同一个属性,所以虽然在执行A a =new B();时以为b1赋值0,但并不影响执行a.print();时的b1的值,
public class B extends A{
private String b1="Hello World";
protected void init() {
//this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();
a.print();
}}
输出:nullHello World
在以上的程序中,我把init()方法中的赋值语句不要,输出的b1为null,而并非是Hello World,而执行a.print();时输出Hello World,所以这两
个b1并不是同一个属性,
那这个this.b1是什么呢
不知道这样的解释是否清楚,
我擦,我先自抽9999999下。误人子弟,大罪无边。
A.super() 是隐式调用的,就是被new B();自动调用的。其他的楼上解释过了。。
会调用父类的构造方法,因为父类构造方法中调用了init方法,但是子类复写了init方法所以调用了子类的init方法。子类init中调用print方法也是调用的子类中的。。b1在子类的init方法中被赋值为0.所以会输出0.。
在执行完父类构造函数的时候会执行到 private String b1=null; 所以此时b1=null了。
a.print();
执行依然是子类复写了的print方法。。所以这个地方就输出null咯。
1.父类静态变量
2.父类静态块
3.子类静态变量
4.子类静态块
5.父类非静态变量
6.父类非静态块
7.父类构造函数
8.子类非静态变量
9.子类非静态块
10.子类构造函数由于在父类构造函数(7)中调用子类覆盖的方法init,B类中b1被赋值为0,这个没问题。
在子类非静态变量初始化的时候(8),b1又被重新赋值为null,所以在语句A a =new B();
执行完之后,B类中b1的值为null.
所以结果为0null
super();
}
调用完super()之后还会调用private String b1 = null;这条语句么自己 debug下!