创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用,为什么重写时调用的时子类呢?
为什么在父类构造函数中调用的是子类的方法:
在构造函数中调用方法是隐藏了this,而通过子类来调用父类构造函数时,this.getClass()是class test.Tiger,所以调用的方法是tiger的roar。
public class Animal{
Animal(){
roar();
System.out.println(this.getClass());
}
public void roar() {
System.out.println("normal roar!!");
}
public static void main(String[] args) {
Animal t = new Tiger();
}
}
class Tiger extends Animal{
Tiger(){
}
@Override
public void roar(){
System.out.println("Tiger roar!");
}
}
还有一种就是多态,其实第一种也算是多态。Animal a = new Tiger() ; a. Tiger()第一种其实和这种是类似的。
重载是不会影响父类调用其本身的方法。因为虽然使用的是子类的this,但是该方法在子类中没有被重写则继续调用。
public class Basic{
public void add(int i)
{System.out.println("Basic add");}
public Basic()
{ add('a');}//会转变为add((int)'a');
}
public class A extends Basic{
public void add(int i)
{ System.out.println("A add"); }
}
public class B extends Basic{
public void add(char i)
{System.out.println("B add");}
}
public class Main{
public static void main(String[] args)
{
A a = new A();//A add
B b = new B();//Basic add
}
}