重载:子类方法访问属性不能比父类方法高
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
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
相关文章推荐
- 子类会继承父类的私有方法和私有属性,只是不能直接访问
- 子类继承父类的私有属性和方法但是不能访问父类私有属性和方法
- 关于子类无法访问父类protected属性和方法的问题
- 为什么子类中不能访问另一个包中父类中的protected方法?
- 为何Java中子类重写方法的访问权限不能低于父类中权限
- 为何Java中子类重写方法的访问权限不能低于父类中权限
- 为什么子类中不能访问另一个包中父类中的protected方法?
- 20140424 父类指针指向子类 子类指针指向父类 父类指针不能访问子类成员(虚函数例外)
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 2018/01/08JAVA 基础 / 接口与继承:调用父类/子类的类方法、对象方法,访问父类的类属性、对象属性的方式汇总
- 子类不能对父类private方法重写
- 关于protected在子类创建父类对象无法访问父类protected方法或成员
- 子类和父类中方法和变量访问权限
- 子类重写父类的方法时声明抛出异常不能比父类范围大(转)
- php 子类如何访问父类的静态方法
- C# 父类的属性赋值给子类的方法
- Java多态中重载方法参数分别为父类和子类时的疑惑
- 子类和父类定义相同的方法和属性的解析:
- java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
- JAVA在子类中访问父类的私有属性