重载:子类方法访问属性不能比父类方法高

来源:互联网 发布:java方法格式 编辑:程序博客网 时间:2024/05/23 21:49

报错:

class A{ public test(){}}

class B extends A{ protected test(){}}

b = new B();

b.test();

Fatal error: Access level to *** must be public

规定:子类方法访问属性不能比父类方法高

为什么呢?>>>>>>>>

转帖:

1.从思想上去理解
继承关系可以表述为 is-a 的关系,也就是说如果B继承A,那么
A,B的关系为 B is a A,从字面上理解就是说: B类是一个A类(实际上,B类除了是一个A类之后还会比A多一些东西)
从上面的关系可以得知,B必须包含A的所有东西(包括成员变量,成员方法,等等)
那么,从外界看来,如果A有一个public的test方法,B就应该要有一个public的方法,为什么呢?
因为,比如在一个C类(不和A B在同一个包)里面去看A和B,如果能调用A的test,而不能调用B的test,就会给C这个类觉得,B不是A,所以B必须要有一个public的test方法.
因此,子类覆盖的成员访问权限不能低于父类.

2.从安全的角度去考虑:
同样是B继承A. 如果A有一个public的test方法,而B覆盖的时候是一个protected的test方法,那么
在B所在的包外就不能用B的实例对象来调用test方法了(因为B的test是protected的).
但是,如果你用这种方法就可以绕过这个protected的访问权限了:
A a = new B();
a.test();
因为A的test是public的,所以a.test()是可以的,但是

根据多态的性质,引用a实际上指向的内存是一个B类的对象,当运行时,a.test()实际上是会执行B类的test方法,这样就绕过了B类的protected的访问权限了.因此这样是不安全的.

   父类:
public class Supclass
{
    public void print()
     {
        System.out.println("this is 父类print()方法"+"——此时对象"+this.toString());
     }
}
   子类:

public class Subclass extends Supclass
{
        public void print()
     {
        System.out.println("this is 子类print()方法"+"——此时对象"+this.toString());
     }
    public static void main(String[] args)
     {
        Supclass sup=new Subclass();
        sup.print();
        System.out.println("此时对象"+sup.toString());
     }
}

    结果:this is 子类print()方法——此时对象是Subclass@126b249
          此时对象是Subclass@126b249


原创粉丝点击