您的位置:首页 > 编程语言 > Java开发

五、JAVA中类的探究-父类构造器

2015-06-09 18:02 316 查看

二、父类构造器

(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的缘故
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: