您的位置:首页 > 其它

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

2012-01-30 11:06 330 查看
报错:

class A{ public test(){}}

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

b = new B();

b.test();

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


“[b]规定:子类方法访问属性不能比父类方法高”[/b]

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

转帖:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐