站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题方法override的小问题(权限访问符对override的影响)

方法override的小问题(权限访问符对override的影响)

摘要: 方法override的小问题(权限访问符对override的影响)


class Base{
private void hi() throws FileNotFoundException { .... }
}

class Sub extends Base {
private void hi() throws Exception { .... }
}

上面的代码,子类Sub override了父类Base的hi()方法,但比父类抛出了更广的异常,应该报错为什么实际上没有异常?

把Base和Sub的hi方法的private都改为public, 这次出现compile error,子类抛出了比父类更广的异常,所以报错了。

不明白为什么加了private就不行了?大虾指教。还有关于override(覆盖)和hidden(隐藏),这两个概念有点分不清。再次感谢。


class Base{
private void hi() throws FileNotFoundException { .... }
}

class Sub extends Base {
private void hi() throws Exception { .... }
}
这样写,子类的hi()方法访问权限与父类一样,并非覆写(override),而是隐藏掉了父类的方法



有深度,关注


to killme2008:
你说的权限访问符一样,就隐藏这个说法不对。

我觉得:
父类所有的private成员,包括方法和属性,对子类来说都是not visible(不可见的),相当于子类完全不知道父类的private成员一样,所以子类可以随意抛出异常而不报错。


private方法根本不能被子类所见,更别说被子类override了。
你的子类中只是碰巧也有个与父类中的hi()方法同名的方法罢了,它与父类中的那个hi()没有任何联系。


同意


同意 Dan1980()

父类里面的私有的方法子类是无法访问的,
所以,Sub子类的hi()方法只是恰好和父类的hi()同名而已.


這個沒什麽好討論的
Dan1980()說的正理


private无法override而且private方法在编译的时候,有可能被某些编译器编译成inline函数,也就是根本不存在这个函数,而是把其中的代码“贴”在调用处。


我理解错了

Dan1980()为正解

至于"隐藏",主要是指变量,简单例子:
class Base {
public String className = "Base";
}

class Derived extends Base {
private String className = "Derived";
}

public class PrivateMatter {
public static void main(String[] args) {
System.out.println(new Derived().className);
}
}
编译出错
子类可以对父类的实例方法进行覆写,可对于实例变量(而且包括类变量,静态方法,final静态变量),子类只能隐藏父类中的相同名称的变量,而不是覆写。根据new Derived()的编译期类型为子类Derived,调用子类的className属性,可此属性是声明为private的,所以无法编译通过。
过去读《java puzzlers》写的文章
http://blog.csdn.net/killme2008/archive/2006/05/14/728172.aspx


private 的话对于Sub 来讲,它肯本不知道 父类还有个hi方法.


private方法都是内联的,对子类不可见,也就没有所谓的override了


private方法是final 所以不存在什么覆写的问题,因为子类根本看不见父类的方法!


blackpark(暖咖啡)

我同意你的看法


↑返回目录
前一篇: JAVA连接ORACLE8I时报错:java.sql.SQLException: Io 异常
后一篇: 请教在SQLSERVER2000L里,语句select * from (select * from news) 为什么有错?谢谢