新手没关系哈。都是新手过来的。
这个问题并不是你说的那样的。
因为我们注意到,在此例所写的几个子类里面,并没有显示的构造器(也就是你没有自己写构造器),那么编译的时候,就会为你自动写一个无参数的公有构造器(这个构造器并不是继承于你的直接父类)。因此不存在说实例化的时候会调用父类的构造器。
其次呢,你说的
动物爱吃饭
动物呼吸
动物爱睡觉
这三个的方法我们可以看到,他们也不是构造器,而是普通方法,也就是说必须显示地进行调用,才会执行,如 tiger.eat(); 要有这么一句他才会执行。
而上述代码里,只是分别调用了三个实例的breath()方法,当然不会有eat和sleep啦。
再次,如果你要实现比如tiger.breath();而输出是:
动物在呼吸。
老虎是用肺呼吸的。
这样的话,你在tiger中代码就需要写成:
void breath(){
super.breath();
System.out.println("老虎是用肺呼吸的");
}
super.breath();这句话是指,调用父类的breath()方法。
继承类的一般初始化过程:静态变量初始化、按照级别高低的顺序运行父类的构造方法、实例变量初始化、运行继承类的构造方法。
你的父类Animal没有写构造方法,那么就是默认的无参构造方法:
public Animal(){
}
所以你的程序里没有输出任何内容,你可以在Animal添加如下内容在试试:
public Animal(){
System.out.println("Animal 类 构造方法 执行");
}
eat()、breath()、sleep()为成员方法,子类可以重写或者使用这些成员方法,但是在调用子类的同名方法时,父类的这些方法并不会执行。
欢迎追问
你也说了子类对象在实例化时先去调用父类中的无参构造方法(而不是成员方法),你的eat,sleep,breathe是成员方法不是构造方法,你可以这样写public Animal{输出一句话},然后new子类的时候这样new:Animal tiger = new Tiger(),此时才会执行父类的构造方法。
只是构造出了父类的对象,如果你构造方法写了这些System.out.println("动物爱吃饭");
等,就如你所说了;而这里程序运行是对的...
当父类与子类中方法名一样时,使用的是子类的方法