子类可以重写父类的private方法吗

“private是私有的,其他类是不能访问的,子类也不可以访问,所以你可以重新实现父类的该方法,不会有冲突,但是你重新实现的方法,不叫重写也不叫重载,是一个该子类新增的方法,和子类的一般扩展方法一样”

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
B

 

 

 

 

你可能感兴趣的:(Java,多态,java)