A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张淼 中级黑马   /  2012-9-20 08:35  /  1634 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对以下代码不做其它任何修改,可以将public, protected private中的哪个访问控制符合法的修饰第3行的myMethod() ?如果第3行保留原样,则哪个关键字可以合法的修饰第8行的myMethod()
1.    class HumptyDumpty
2.    {
3.           void myMethod() {}
4.    }
5.
6.    class HankyPanky extends HumptyDumpty
7.    {
8.           void myMethod() {}
9.    }
A.    3行中加入private 或不做改动。第8行中加入protected public或不做改动。
B.     3行中加入publicprotected。第8行中加入private 或不做改动。
C.     3行中加入protectedpublic或不做改动。第8行中加入private 或不做改动。
3行中加入public。第8行中加入private

本题的答案为A,子类在继承父类时,子类方法的权限修饰符的权限不能低于父类中方法的修饰符。我对答案没有异议,但是在理解上有一些不清楚。
子类继承父类,子类的构造中默认有super(),说明子类在运行过程中需要调用父类中的成员。
按这样的理解,父类中的方法需要被子类调用,而子类中的内容父类不需要调用,那应该是父类中方法的权限大于子类啊,为什么要求子类的权限反而要大于父类中的权限,请帮忙分析其中的底层执行过程。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
A.    第3行中加入private 或不做改动。第8行中加入protected 或public或不做改动就是父类中方法的权限大于子类啊,
protected 或public权限大于private
子类和父类中方法和变量访问权限 1。一个覆写方法的访问修饰符所提供的访问权限与被覆写方法的访问修饰符所提供的访问权限相比,至少要
一样多
2。但是。对一个域来说,当它要隐藏另一个域时,如果隐藏域的访问修饰符提供的访问权限比被隐藏域的少,
尽管这么做不可取的,但是它确实是合法的
class Base
{
public String className = "Base";
public void pr()
{
  
}
}
class Derived extends Base
{
private String className = "Derived";//尽管变量可见性小了,但是却是合法的,因为这个时候,子类并没有从父类继承className变量,而是隐藏了父类的同名方法

/*下面这个就不能运行
private void pr()
{

}
*/
}
public class PrivateClass
{
public static void main(String[ ] args)
{
  System.out.println(((Base)new Derived()).className);
}
}
尽管Base 有一个公共域className,但是这个域没有被继承到Derived 类中,因为它被Derived.className
隐藏了。但是通过强制类型转换也可以访问到父类被隐藏的方法。
需要说明的是如果子类有一个pr()方法,父类也有一个pr()方法,你生存了子类的一个实例,但是你企图用强制类型转换来让它调用父类的方法,这个是做不到的(除了在子类内部,通过使用super 关键字方法)。然而被隐藏的变量却是可以的

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马