public class Shape {
private int i=10;
public Shape(){
i = 20;
print();
}
public Shape(int m){
i = m;
print();
}
public void print(){
System.out.println("This shape=>"+i);
}
}
public class Circle extends Shape{
private int i = 20;
public void print(){
System.out.println("this circle=>"+i);
}
public Circle(){
this.i = 30;
print();
super.print();
}
public static void main(String[] args){
Shape shap = new Circle();
}
}
请问输出什么结果呢?
其实此类问题就是父类和子类,实例化变量顺序的问题。
答案结果是:
this circle=>0
this circle=>30
This is shape 20
new操作明确一点首先调用的是父类的构造方法:
引用
public Shape(){
i = 20;
print();
}
在调用print()时,print被重写,去调用子类的Circle的print()方法。
Java代码
public void print(){ //Circle
System.out.println("this circle=>"+i);
}
public void print(){ //Circle
System.out.println("this circle=>"+i);
}
Circle 的i还没被被赋值,在加载类的时候整型变量均被赋值为0。所以输出 “this circle=>0”
'''''''''''如果你把shape里的print()方法改为private,
'''''''因为没有被重写,不存在多态。这时调用的为父类Shape中的print方法。
赋值顺序应该是:
父类的类变量,父类的构造函数,子类的类变量,子类构造函数
如果父类的方法被子类重写了,父类中也将调用子类的方法。
private int i=10;
public Shape(){
i = 20;
print();
}
public Shape(int m){
i = m;
print();
}
public void print(){
System.out.println("This shape=>"+i);
}
}
public class Circle extends Shape{
private int i = 20;
public void print(){
System.out.println("this circle=>"+i);
}
public Circle(){
this.i = 30;
print();
super.print();
}
public static void main(String[] args){
Shape shap = new Circle();
}
}
请问输出什么结果呢?
其实此类问题就是父类和子类,实例化变量顺序的问题。
答案结果是:
this circle=>0
this circle=>30
This is shape 20
new操作明确一点首先调用的是父类的构造方法:
引用
public Shape(){
i = 20;
print();
}
在调用print()时,print被重写,去调用子类的Circle的print()方法。
Java代码
public void print(){ //Circle
System.out.println("this circle=>"+i);
}
public void print(){ //Circle
System.out.println("this circle=>"+i);
}
Circle 的i还没被被赋值,在加载类的时候整型变量均被赋值为0。所以输出 “this circle=>0”
'''''''''''如果你把shape里的print()方法改为private,
'''''''因为没有被重写,不存在多态。这时调用的为父类Shape中的print方法。
赋值顺序应该是:
父类的类变量,父类的构造函数,子类的类变量,子类构造函数
如果父类的方法被子类重写了,父类中也将调用子类的方法。