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的构造器");
	}
}