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

二、父类构造器


(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的缘故



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值