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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Test extends Reflex {
private void write() {
  System.out.println("Test");
  }
}
public class Reflex {
private void write() {
  System.out.println("Main");
  }
public static void main(String[] args) {
   Reflex main = new Test();
   main.write();
  
}
}
打印:
Main
如果把write方法的private改成public则打印:Text


解释说private格式被自动觉得是final格式,还是不懂,上面的内部类中的方法又不能修饰成final,这句话该如何解释呢?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 赵玮_Tom 于 2012-5-6 20:38 编辑

大哥,你这里的两个方法根本就不存在覆写关系,两个方法都是私有的嘛。main调用自己的write()方法,肯定打印自己的内容。而改成public后,才存在覆写关系。这跟final好像没关系吧
回复 使用道具 举报
改为public 后,子类方法权限小于父类方法权限,所以并没有覆盖。
编译时期,引用为父类,调用write方法,为父类方法。因为父类中有write方法,所以编译可以通过。同时调用的也为父类的方法。
笔记可以看一下:
覆盖:
1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。

2,静态只能覆盖静态。

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
他确实说是一个Java骗局,Thanking in Java 里提到的,解释是:
因为private格式被自动觉得是final格式。而且对导出的类识坍篱的。是以//正在那类环境下,Test下的write便是一个齐新的格式,Main中的格式正在子类中格式没有恰好睹,是以也没有能被重载//只要非private 格式才气够被覆盖
回复 使用道具 举报
他确实是一个Java骗局,是Thanking in Java 里提到的,不过解释不详细,只说:
因为private格式被自动觉得是final格式。而且对导出的类识坍篱的。是以//正在那类环境下,Test下的write便是一个齐新的格式,Main中的格式正在子类中格式没有恰好睹,是以也没有能被重载//只要非private 格式才气够被覆盖

我的疑问是 上面的内部类中的方法又不能修饰成final,”private格式被自动觉得是final格式“这句话该如何解释呢?
回复 使用道具 举报
这个问题我也晕菜 了
回复 使用道具 举报
朋友,我学得不多:
你的代码我想之前的解释已经够清楚了
什么java骗局,Thanking in Java 什么解释不知道你想说什么。
你的疑问中的内部类,也没找到
private格式被自动觉得是final格式。。这句话我想解释是 :当内部类在成员位置上,就可以被成员修饰符所修饰,private:将内部类在外部类中进行封装,final类是不能被继承的。
回复 使用道具 举报
要实现多态,必须满足两个条件:
1,父类的应用要指向子类的对象
2,子类要复写父类中的方法。
分析一下你的程序
Test 继承了Reflex ,但你父类的方法被private所修饰。那么,意思就是说。这个方法是父类所独有的,不对外提供。
而你子类中的private void write() {....}也只能叫做你子类的独有方法,并没有实现复写。达不到前面所说的多态的概念,并不存在多太。
而至于为什么说  private格式被自动觉得是final格式,上面的同学都一说的很清楚了 。
你的问题是对多态的了解还不够,建议在看下毕老师的关于多态的视频。应该就很容易理解了。
回复 使用道具 举报
黄秋 黑马帝 2012-5-7 05:03:44
9#
静态的也覆盖不了,一般的是可以覆盖:
  1. class Test extends Reflex {
  2.          static void write() {
  3.           System.out.println("Test");
  4.         }         
  5. }

  6. class Reflex {
  7.         static void write() {
  8.                 System.out.println("Main");
  9.         }
  10.         public static void main(String[] args) {
  11.                 Reflex main = new Test();
  12.                 main.write();  
  13.         }
  14. }
复制代码
是否静态的方法,是类的属性,不存在覆盖的问题?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马