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

报错:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值