重载:子类方法访问属性不能比父类方法高
来源:互联网 发布: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
- 重载:子类方法访问属性不能比父类方法高
- 子类会继承父类的私有方法和私有属性,只是不能直接访问
- 继承、访问控制符、子类重载父类的方法、子类调用父类的方法
- 子类重写父类的方法时声明抛出异常不能比父类范围大
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 子类重写父类的方法时声明抛出异常不能比父类范围大
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 方法覆盖子类不能抛出比父类范围更大的异常
- c++ 子类“重载”父类的方法
- Java 中子类重写父类的方法时声明抛出异常不能比父类范围大
- 子类重写父类的方法时声明抛出异常不能比父类范围大(转)
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- 面向对象 子类中 < 重载 重写 >父类的方法
- 为什么子类中不能访问另一个包中父类中的protected方法?
- 为什么子类中不能访问另一个包中父类中的protected方法?
- 子类为什么不能重写父类的静态方法
- 自定义 UIColor baseView 父类子类方法名 不能重复
- 子类为什么不能重写父类的静态方法
- 如何正确卸载Java
- Eclipse is running in a JRE, but a JDK is required Some Maven plugins may not work when……
- asp过滤SQL注入
- 图说“什么是数据挖掘”
- Android_JNI浅析(2)
- 重载:子类方法访问属性不能比父类方法高
- iPhone开发进阶--- 利用ModalViewController切换View
- 函数名: getenv()
- Windows Phone 学习笔记(1)-环境搭建
- 学jQuery笔记
- Start From Android 4.x
- Android开发入门之路(初学者必读)
- 解决SharePoint_Config_log.ldf文件过大问题
- 从U-Boot源码看C语言对汇编代码中的符号引用