继承 重载/重写方法后,父类调用重写方法为什么是调用子类的方法,而重载则不会

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用,为什么重写时调用的时子类呢?

为什么在父类构造函数中调用的是子类的方法:

在构造函数中调用方法是隐藏了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
    }
}
上一篇:i7 1195G7性能怎么样?相当于什么水平


下一篇:并行效果&迭代器