java-JAVA多态问题,求指教。谦虚滴不要

问题描述

JAVA多态问题,求指教。谦虚滴不要

package test;

public class Test1{

public static void main(String arg[]){

        A a1 = new A();
    A a2 = new B();
    B b = new B();
    C c = new C();
    D d = new D();
    System.out.println(a1.show(b));
    System.out.println(a1.show(c));
    System.out.println(a1.show(d));
    System.out.println(a2.show(b));
    System.out.println(a2.show(c));
    System.out.println(a2.show(d));   //A-D
    System.out.println(b.show(b));
    System.out.println(b.show(c));
    System.out.println(b.show(d));  

}

}

class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}

class B extends A{

public String show(A obj){
       return ("B and A");
}
public String show(B obj){
    return ("B and B");
}

}
class C extends B{

 public String show(C obj){
     return ("C and C");
  }
  public String show(B obj){
         return ("B and C");
  }

}
class D extends B{

 public String show(D obj){
     return ("D and D");
  }
  public String show(B obj){
         return ("B and D");
  }

}
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D

为什么第4个输出不是B and B而是 B and A明明入参就是B类啊,现实让我懵逼。求解答

解决方案

函数调用哪个版本,不是看它的变量类型,而是看它的实际类型(new后面跟着的)。

为什么这样,请先看我 http://ask.csdn.net/questions/215841 的回答。

因此我们需要通过基类类型调用,如果调用的是基类类型,那么函数重写还有什么意义呢。

解决方案二:

如果在子类中定义某方法与其父类有**相同的名称和参数**,我们说该方法被重写 (Overriding)。

类A中的方法show(A obj) 跟类B中的方法show(B obj)因为参数不同(虽然是有继承关系,但也必须是相同才行),
所以类B中的这个方法并不是对类A中方法的重写,它们之间并没有关系。

A a2 = new B();这样定义的a2对象,只有show(D obj)和show(A obj)方法,并且类B中的show(A obj)方法对A中的show(A obj)方法重写了,我们在调用的时候,就会走类B中的show(A obj)方法,所以输出是B and A

时间: 2024-09-17 10:12:29

java-JAVA多态问题,求指教。谦虚滴不要的相关文章

mybatis-myBatis中的莫名其妙的java.lang.NullPointerException,求指教

问题描述 myBatis中的莫名其妙的java.lang.NullPointerException,求指教 xml: <!-- ognl访问静态方法的表达式 为@class@method(args),以下为调用Ognl.isNotEmpty()方法,还有其它方法如isNotBlank()可以使用,具体请查看Ognl类 --> AND SRLNO = '${h_srlno}' AND URGEDATE = '${h_date}' </where> </sql> <s

java 网站发布 域名-如何发布网站?求指教,感激不尽!

问题描述 如何发布网站?求指教,感激不尽! 自己用java写了个网站,想要放到网上去,应该要怎样做?有没有这方面有经验的人士帮忙解答一下?谢谢. 解决方案 1.买域名2.买空间我就知道这么多..只能帮你到这了 解决方案二: 可以用公有云计算平台,像是新浪SAE,费用不贵,用起来简单,是Java的话直接打war包上传上去就好了. 解决方案三: 可以用自已电脑配合花生壳搭建一台服务器(网上例子有很大). 还有就是花费去购买空间,也有一些免费的,不过得自已去找了! 解决方案四: 想自己控制自己的项目,

音频-我用java写了一个小游戏,想插入背景音乐但不太会,求指教

问题描述 我用java写了一个小游戏,想插入背景音乐但不太会,求指教 package text; import java.io.*; import javax.sound.sampled.*; public class text { public static void main(String[] args) { // TODO Auto-generated method stub //创建一个实例 AePlayWave apw = new AePlayWave("G:\照片\Sleep Awa

java基础问题求指教谢谢

问题描述 java基础问题求指教谢谢 形如 A a=new A();-------------1 a=new A();--------------2 辣么,a到底指的是哪个对象?1还是2? 五楼的说法对么? 解决方案 只用new关键字是为了创建一个对象,你使用了两次new关键字进行创建,会在内存中创建两个A的对象,a是你声明的一个引用,在程序中以最后一次的指向为准,这里是指向最后一个. 解决方案二: new 最后一个对象时,内存又为它分配了新的地址,所以a只想最后一个 解决方案三: a 在最后被

耦合-求指教,关于JAVA接口,这样理解对不对?

问题描述 求指教,关于JAVA接口,这样理解对不对? 把接口看作是电脑上的USB接口,USB接口里有一种方法定义了一种规范,外部的usb设备比如usb鼠标,usb风扇在这个规范下具体实现了鼠标和扇风的功能,这样,人类可以使用usb这一种东西来调用usb接口外部的不同功能,需要改动的时候,只需要把能够实现所需要的功能的usb设备的线接到usb接口上就行了,而不用去做大量改动. 这么理解有什么偏差吗?求指教 解决方案 你可以有不同的理解,这没有任何问题. 当然,我觉得更接近编程思维的理解是,接口是一

Myeclipse导入java项目出现问题,求指教!

问题描述 Myeclipse导入java项目出现问题,求指教! 昨天导入同时的web项目,框架是SSI,由于数据库改用我自己的,所以在Spring配置文件中将数据源中的数据库名和密码改成了自己的,结果出现错误,说用户名密码错误. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying databa

关于java问题-新手求指教:如何描述项目

问题描述 新手求指教:如何描述项目 才开始学java不久,刚学完核心java,做了一个web服务器模拟的项目.要怎么样去详细的描述啊.求大神指教-- 解决方案 还可以说是这个项目的亮点和难点,你是如何解决的等等. 解决方案二: 新手,求指教.新手求指教---------------------- 解决方案三: 做的什么 叫什么名字 可以达到什么目的 大概使用了什么技术 大概就这些 解决方案四: 同楼上,还有,你有了哪些收获 解决方案五: 介绍项目的开发历程,一些技术点 解决方案六: 做的什么项目

java 线程池 程序顺序-java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教)

问题描述 java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教) 粘贴的大致代码如下: public static void main(String[] args) { int thread=0; ExecutorService pool = Executors.newFixedThreadPool(15);// 创建一个线程池 for (int i =666; i <= 888; i++) { for (int j = 0; j < 19; j++) { MyClass t

helloworld-求教java Struct大神!!!配置一个HelloWorld出现了以下问题,求指教!!!

问题描述 求教java Struct大神!!!配置一个HelloWorld出现了以下问题,求指教!!! 解决方案 原因应该是编译java时生成的class文件,在运行时用到的JRE和class文件版本不一致造成的. 1 如果是一般的java程序: 可以在MyEclipse中修改JRE的路径和版本.在Window->Preferences中, 修改完之后,最好重新编译一下,选Project->Clean... 选项,然后选择是所有的项目都要重新编译,还是只重新编译指定的项目,然后就应该没问题了.