java 多态产生的疑问

对于标准的多态示例程序
Class A {
public void test(){
System.out.println("A");
}
}
Public Class B extends A{
//@override 有无都不会报错
public void test(){
System.out.println("B");
}
public static void main(String[] arguments){
    A a=new B();
    a.test();
}
}
/*output:
B
*///:~
这个程序很好的示意了向上转型后A对B实例的test的调用。
然而并不是所有的类型的方法都能够支持多态。对于是private的方法,我们应该格外注意。
 1

package cn.edu.neu.deepweb407.gui;

public class A {
private  void test(){
 System.out.println("A");
}

public static void main(String[] arg1s) {
 A a=new B();
 a.test();
}
}
class B extends A{
 public void test(){
  System.out.println("B");
 }
}

16/*output:
17A
18*/
//:~
这个结论是,a.test()调用的是A类的方法test。因为B中的test方法并不是覆盖了A类的方法。因此,A调用的只是他自身的test方法。大家注意的是,尽量不要在子类中声明和父类私有方法相同名称的方法。

posted on 2012-07-10 17:27 scorpio小蝎 阅读(398) 评论(7)  编辑  收藏

评论

# re: java 多态产生的疑问 2012-07-11 09:06 rubyliu12

你这个也太扯淡了吧
你代码里B有继承A吗?没继承的话A a=new B();这样编译能通过?
最后A类是私有的test的方法的话
A a=new B();
a.test();可以这么写?不知道楼主是这么编译和运行及得出的结论。看楼主的其他文章感觉也不是刚出道的菜鸟啊。
  回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 09:43 scorpio小蝎

@rubyliu12
谢谢指正,代码贴错了,已修改。   回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 09:56 scorpio小蝎

@rubyliu12
A类中 private test() 的方法由于main方法是在A类中 所以可以调用。这只是个demo。其实际意义是,如果A类中public方法调用了A类的private方法,而由于子类重写了A类的private方法,将会出现如题所述的问题。有问题欢迎指教   回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 09:59 scorpio小蝎

class A {
private void test(){
System.out.println("A");
}
public void get(){
test();
}
}
public class B extends A{
//@override 不能有,因为private的方法被自动认为是final的且不能被访问。
public void test(){
System.out.println("B");
}

public static void main(String[] args) {
A a=new B();
a.get();
}
}  回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 10:00 rubyliu12

而由于子类重写了A类的private方法?
private的方法是私有的存在被子类重写这样的说话。  回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 10:08 scorpio小蝎

@rubyliu12
按照概念来讲,不能叫做重写,因该叫做子类新增了方法,但是形式上以及方法名是一模一样的,很多新人都不会注意这点,为了区分才提出的。  回复  更多评论   

# re: java 多态产生的疑问 2012-07-11 10:09 scorpio小蝎

@rubyliu12 这句话里有提到,并不是真正意义的覆盖“这个结论是,a.test()调用的是A类的方法test。因为B中的test方法并不是覆盖了A类的方法。因此,A调用的只是他自身的test方法。大家注意的是,尽量不要在子类中声明和父类私有方法相同名称的方法。”不过你这个问题提的很不错,这样子大家看得更清楚了
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2012年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔分类

随笔档案

友情链接

搜索

最新评论

阅读排行榜

评论排行榜