黑马程序员技术交流社区

标题: 多态请教,据说是Java骗局,看了还是迷糊 [打印本页]

作者: 张小锋    时间: 2012-5-6 20:23
标题: 多态请教,据说是Java骗局,看了还是迷糊
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,这句话该如何解释呢?
作者: 赵玮_Tom    时间: 2012-5-6 20:29
本帖最后由 赵玮_Tom 于 2012-5-6 20:38 编辑

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

2,静态只能覆盖静态。

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

作者: 张小锋    时间: 2012-5-6 20:38
他确实说是一个Java骗局,Thanking in Java 里提到的,解释是:
因为private格式被自动觉得是final格式。而且对导出的类识坍篱的。是以//正在那类环境下,Test下的write便是一个齐新的格式,Main中的格式正在子类中格式没有恰好睹,是以也没有能被重载//只要非private 格式才气够被覆盖
作者: 张小锋    时间: 2012-5-6 20:42
他确实是一个Java骗局,是Thanking in Java 里提到的,不过解释不详细,只说:
因为private格式被自动觉得是final格式。而且对导出的类识坍篱的。是以//正在那类环境下,Test下的write便是一个齐新的格式,Main中的格式正在子类中格式没有恰好睹,是以也没有能被重载//只要非private 格式才气够被覆盖

我的疑问是 上面的内部类中的方法又不能修饰成final,”private格式被自动觉得是final格式“这句话该如何解释呢?
作者: 安路凤    时间: 2012-5-6 20:43
这个问题我也晕菜 了
作者: 邓斌    时间: 2012-5-6 21:09
朋友,我学得不多:
你的代码我想之前的解释已经够清楚了
什么java骗局,Thanking in Java 什么解释不知道你想说什么。
你的疑问中的内部类,也没找到
private格式被自动觉得是final格式。。这句话我想解释是 :当内部类在成员位置上,就可以被成员修饰符所修饰,private:将内部类在外部类中进行封装,final类是不能被继承的。
作者: 陈忠    时间: 2012-5-7 02:42
要实现多态,必须满足两个条件:
1,父类的应用要指向子类的对象
2,子类要复写父类中的方法。
分析一下你的程序
Test 继承了Reflex ,但你父类的方法被private所修饰。那么,意思就是说。这个方法是父类所独有的,不对外提供。
而你子类中的private void write() {....}也只能叫做你子类的独有方法,并没有实现复写。达不到前面所说的多态的概念,并不存在多太。
而至于为什么说  private格式被自动觉得是final格式,上面的同学都一说的很清楚了 。
你的问题是对多态的了解还不够,建议在看下毕老师的关于多态的视频。应该就很容易理解了。
作者: 黄秋    时间: 2012-5-7 05:03
静态的也覆盖不了,一般的是可以覆盖:
  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. }
复制代码
是否静态的方法,是类的属性,不存在覆盖的问题?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2