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