疯狂java讲义第五章补充习题第8题答案

8、(1)创建一个类,在类中声明类初始化块,并在其中打印字符串,再在实例初始化块和构造器中做相同操作,进行new多个实例,看看输出如何。比如做出四代继承,然后只是创造最小的那个辈分的类的实例,看看输出,都包括静态初始化块,实例初始化块,和构造器;

(2)强化:创建这个类的子类,同样操作,并new多个实例,这个子类有多个构造器,有参数构造器通过this()调用这个子类的无参数构造器。
当我想要既通过super调用父类的有参数构造器,又想要看看this()调用本类的无参数构造器,看看是不是也会调用到父类构造器的时候,发现,就遇到了super和this的冲突,所幸结果是确定的,调用本类的无参数构造器,也会调用父类的无参数构造器。只有在方法中调用了super才会调用对应的有参数构造器

我 又试了一下,在子类的空构造器中调用super,但是并不会调用两次父类的无参数构造器,所以其实空构造器中隐式的写了super(),你显式写super()只是覆盖了隐式的super()并不会调用两次,又由于super()一定要是第一条语句,也无法使用两次super();

通过以上的实验,我发现,super和this只能放在第一条语句中,其实是java的设计者,为了实现如下的两个效果:
子类只能调用一次父类的构造器
子类只能调用父类的一种构造器
但是也带来了其他的效果。子类不能同时调用子类的重载的构造器,和父类的构造器。

(3)再强化:再创建一个子类的子类,在构造器中使用super(“哈哈”)调用父类的有参数构造器。new多个实例。查看输出。

遇到无法扩展构造器的情况,只有一个,就是父类没有提供默认构造器,子类也就无法从写默认构造器。但是只有有参数,其他的构造器的创建并不会报错

(1)

public class Main
{
	public static void main(String[] args)
	{
		One one1 = new One();
		

		One one2 = new One();
		
	}
}
class One
{
	//静态初始化块
	static 
	{
		System.out.println("One的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("One的实例初始化块");
	}
	//构造器
	public One()
	{
		System.out.println("One的构造器");
	}
}

(2)

public class Main
{
	public static void main(String[] args)
	{
		Four four = new Four();
		
	}
}

class One
{
	//静态初始化块
	static 
	{
		System.out.println("One的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("One的实例初始化块");
	}
	//构造器
	public One()
	{
		System.out.println("One的构造器");
	}
}
class Two extends One
{
	//静态初始化块
	static 
	{
		System.out.println("Two的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Two的实例初始化块");
	}
	//构造器
	public Two()
	{
		System.out.println("Two的构造器");
	}
}
class Three extends Two
{
	//静态初始化块
	static 
	{
		System.out.println("Three的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Three的实例初始化块");
	}
	//构造器
	public Three()
	{
		System.out.println("Three的构造器");
	}
}
class Four extends Three
{
	//静态初始化块
	static 
	{
		System.out.println("Four的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Four的实例初始化块");
	}
	//构造器
	public Four()
	{
		System.out.println("Four的构造器");
	}
}

(3)

public class Main
{
	public static void main(String[] args)
	{
		Three three = new Three("英雄联盟");
		
	}
}

class One
{
	//静态初始化块
	static 
	{
		System.out.println("One的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("One的实例初始化块");
	}
	//构造器
	public One()
	{
		System.out.println("One的构造器");
	}
	//构造器2
	public One(String info)
	{
		System.out.println(info);
	}
}
class Two extends One
{
	//静态初始化块
	static 
	{
		System.out.println("Two的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Two的实例初始化块");
	}
	
	
}
class Three extends Two
{
	//静态初始化块
	static 
	{
		System.out.println("Three的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Three的实例初始化块");
	}
	//构造器1
	public Three()
	{
		System.out.println("Three的构造器");
	}
	//构造器2
	public Three(String info)
	{
		System.out.println(info);
	}
}
class Four extends Three
{
	//静态初始化块
	static 
	{
		System.out.println("Four的静态初始化块");
	}
	//实例初始化块
	{
		System.out.println("Four的实例初始化块");
	}
	//构造器
	public Four()
	{
		System.out.println("Four的构造器");
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流cpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值