子类不能对父类private方法重写

看到这样一段代码php

public class A {
    private void print() {
        System.out.println("A");
    }
    public static void main(String[] args) {
        A a = new B();
        a.print();
        B b = new B();
        b.print();
        new B().print();
    }
}

class B extends A {
    public void print() {    
        System.out.println("B");
    }
}

结果是
A
B
B
在java中,private的变量和方法对在类外是不可见的,固然更谈不上重写,B类中看似是重写了父类A中的print方法,但因为父类中为private,因此B类中的print与A类中的print方法并没有任何关系,能够认为是一个全新的方法。
举个可能不恰当的例子,继承时,父类方法在能被子类“看到”的状况下,父类的方法能够想象成直接被copy到了子类中,若是子类不想要用这个父类方法的实现,就要去重写,至关于覆盖掉了copy过来的方法,那怎么就算覆盖呢?
方法的做用,就算经过调用某个方法,会达到一些效果或者获得一(个)些值,在重写这个概念中,子类不想要父类方法的达到的效果或者值,就要去修改,即覆盖。因此覆盖也就必须是方法参数,方法名,返回值都要和父类相同才能算是覆盖。设想,若是三个要素任一个不符合,就会产生一个和想要覆盖的那个方法不一样的新方法,这个新方法是属于当前子类的,原来本想覆盖的那个类也没有被覆盖,依旧存在。(在更改的参数的状况下会成为重载,在只改变了返回值的状况下会报错,具体请查看重载的内容)
再回到这个代码,父类中的方法是private的,即子类是“看不到”的,因此也就没有被“copy”到子类中,因此看似是重写,其实是一个属于子类的新的方法,只不过“刚好”和父类中的方法重名了。
再想多态的要求,子类本身新增的方法在多态的状况下是不能使用的,是不可见的,因此当调用print方法时,编译器看到子类没有父类中的那个方法或者其重写,就会选择调用父类的方法。若是将父类的private改成高一级的可视性,子类就能够“看到”了,也就“copy”过来了,输出为
B
B
Bjava