package com.wxhx.java.other;public class Test5 extends BB
{
public static void main(String[] args)
{
Test5 a = new Test5(5);
} private int radius = 1; public void draw()
{
System.out.println("A.draw(),radius =" + radius);
} public Test5(int radius)
{
this.radius = radius;
System.out.println("A constructor");
}
}class BB
{
private int radius = 10; public void draw()
{
System.out.println("B.draw(),radius =" + radius);
} public BB()
{
System.out.println("B constructor");
draw();
}
public BB(int x)
{
System.out.println("B constructor param");
draw();
}
}/*
* (a) B constructor。
A.draw(),radius =0
A constructor //
(b) B constructor。
B.draw(),radius =0
A constructor
(c) B constructor。
A.draw(),radius =10
A constructor
(d) B constructor。
A.draw(),radius =1
A constructor
*/输出的内容以及为甚么?????????
{
public static void main(String[] args)
{
Test5 a = new Test5(5);
} private int radius = 1; public void draw()
{
System.out.println("A.draw(),radius =" + radius);
} public Test5(int radius)
{
this.radius = radius;
System.out.println("A constructor");
}
}class BB
{
private int radius = 10; public void draw()
{
System.out.println("B.draw(),radius =" + radius);
} public BB()
{
System.out.println("B constructor");
draw();
}
public BB(int x)
{
System.out.println("B constructor param");
draw();
}
}/*
* (a) B constructor。
A.draw(),radius =0
A constructor //
(b) B constructor。
B.draw(),radius =0
A constructor
(c) B constructor。
A.draw(),radius =10
A constructor
(d) B constructor。
A.draw(),radius =1
A constructor
*/输出的内容以及为甚么?????????
生成一个类的对象的时候首先调用父类的构造函数,输出B constructor
接着执行draw()方法,但由于此方法被子类所覆盖,所以执行的是子类的draw()方法,输出A.draw(),radius =0 (注意这里并没执行到private int radius = 1; 或者private int radius = 10;所以radius被jvm初始化为0)
最后执行子类的构造函数,输出A constructor
System.out.println("A.draw(),radius ="+radius);
} public Test5(int radius){
this.radius=radius;
System.out.println("A constructor");
} public static void main(String[] args){
Test5 a=new Test5(5);
}
}
class BB{ private int radius=10; public BB(){
System.out.println("B constructor");
draw();
} public BB(int x){
System.out.println("B constructor param");
draw();
} public void draw(){
System.out.println("B.draw(),radius ="+radius);
}
}帖代码要好看些。
{
private int i=2;
public Test()
{
draw();
}
public void draw()
{
System.out.println(i);
}
public static void main(String[] args)
{
new Test();
}
}
这个为什么就知道输出2,而不输出0呢?
上一题是由父类的构造调用的,这时Test类的成员还没有被赋值。
在堆中存在两个对象,test5对象和BB对象,同时test5持有一个BB的引用,两个对象中各有一个radius实例
1.main函数调用test5的带参构造函数,而构造函数第一行默认调用基类的同参数的构造函数,这时候test5中的radius初始化为0
2.BB调用自己带参构造函数,初始化化自己的radius=10,输出B constructor,调用draw();但是由于draw()方法的重写,根据多态的动态绑定,
它将调用test5中的draw(),所以输出A.draw(),radius=,因为此时test5中的构造函数还没执行,所以它的radius为默认值0,所以输出0
3.返回执行test5 的构造函数,初始化radius=5,输出A constructor
执行顺序为:
创建类时:先初始化父类的成员,在构造类
创建子类时:先创建父类,在创建子类
因此,
1:BB.radium=10
2: BB()
3: Test5.draw(但调用的没有赋值的Test5.radium,因此为0)
4:Test5.radium=1;
5: Test5()
你的意思是Test5 a=new Test5(5);在构造方法之前Test5类被载入java虚拟机、private int radius=1;应该被执行、
即打印出来的应该是:
B constructor
A.draw(),radius =1
A constructor
radius,则说明radius被声明了,同时它也被初始化了,所以radius的值是10,(我是这样理解的)所以不存在什么没有赋值的确良Test5.radium.
初始化是按照下面的顺序完成的。
(1)设置成员的值为默认的初始值(0、false、null)。
(2)调用对象的构造方法(但是还没有执行构造方法体)。
(3)调用父类的构造方法。
(4)使用初始化程序和初始块初始化成员。
(5)执行构造方法体。