黑马程序员技术交流社区
标题:
多态请教,据说是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
静态的也覆盖不了,一般的是可以覆盖:
class Test extends Reflex {
static void write() {
System.out.println("Test");
}
}
class Reflex {
static void write() {
System.out.println("Main");
}
public static void main(String[] args) {
Reflex main = new Test();
main.write();
}
}
复制代码
是否静态的方法,是类的属性,不存在覆盖的问题?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2