二、父类构造器
(1)隐式调用和显式调用
代码如下
class Lingle
{
{
System.out.println("Lingle的非静态初始化块:");
}
public Lingle()
{
System.out.println("Lingle的无参数构造器");
}
public Lingle(String grandson)
{
// 使用this调用另一个重载的、无参数构造器!
this();
System.out.println("Lingle带有grandson参数的构造器,grandson参数:" + grandson);
}
}
class Manxc extends Lingle
{
{
System.out.println("\nManxc的非静态初始化块:");
}
public Manxc(String grandson)
{
super(grandson);
System.out.println("Manxc带一个参数的构造器,grandson参数:" + grandson);
}
public Manxc(String grandson, int age)
{
// 使用this调用另一个重载的构造器
this(grandson);
System.out.println("Manxc带两个参数的构造器,其age参数:" + age);
}
}
class LiuChang extends Manxc
{
{
System.out.println("\nLiuChang的非静态初始化块:");
}
public LiuChang()
{
// 显示调用父类的两个参数的构造器
super("刘畅", 8);
System.out.println("LiuChang无参数构造器");
}
public LiuChang(double score)
{
this();
System.out.println("LiuChang的带score参数的构造器,score参数:" + score);
}
}
public class StaticInitTest
{
public static void main(String[] args)
{
new LiuChang(59);
}
}
运行结果
Lingle的非静态初始化块:
Lingle的无参数构造器
Lingle带有grandson参数的构造器,grandson参数:刘畅
Manxc的非静态初始化块:
Manxc带一个参数的构造器,grandson参数:刘畅
Manxc带两个参数的构造器,其age参数:8
LiuChang的非静态初始化块:
LiuChang无参数构造器
LiuChang的带score参数的构造器,score参数:59.0
学习心得
值得注意的是:super和this都是调用构造器的第一行代码 因此构造器中的super调用和this 调用最多只能使用其中之一 而且最多只能调用一次
(2)访问子类对象的实例变量
代码如下
class Base
{
private int i = 2;
public Base()
{
this.display();
}
public void display()
{
System.out.println(i);
}
}
class Derived extends Base
{
private int i = 22;
public Derived()
{
i = 222;
}
public void display()
{
System.out.println(i);
}
}
public class StaticInitTest
{
public static void main(String[] args)
{
new Derived();
}
}
运行结果
0
学习心得
居然不是2或者22或者222!
——————————
JAVA对象不是由构造器创建的 构造器只是对JAVA对象实例变量执行初始化
在执行构造器代码之前 该对象所占的内存已经被分配 这些内存中存的值都默认是空值(基本类型默认空值0 引用类型默认空值Null)
其实是执行Derived类构造器之前会先执行Base类 调用this.display()时要注意this代表什么
其实是Derived()构造器隐式调用了Base()构造器的代码 this代表的是Derived对象
用this.getclass()来看:
class Base
{
private int i = 2;
public Base()
{
System.out.println(this.i);
this.display();
System.out.println(this.getClass());
// this.sub();
}
public void display()
{
System.out.println(i);
}
}
输出结果:
2
0
class Derived
果然this引用代表的是Derived对象
但是在Derived中增加sub() 执行this.sub()则不能通过编译
public void sub()
{
i++;
}
这是因为this的编译时类型是Base的缘故