代码-Java的重写和重载函数调用的问题

问题描述

Java的重写和重载函数调用的问题

代码一:
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(B obj){
return ("B and B"); }
public String show(A obj){
return ("B and A"); }
}
class C extends B{}
class D extends B{}

A a1 = new A();

A a2 = new B();

B b = new B();

C c = new C();

D d = new D();

System.out.println(a2.show(b)); //①
System.out.println(a2.show(c)); //②

代码二:
class A {

public void MethodA(){...}
public virtual void MethodB(){...}
}

class B extends A{
public new void MethodA(){...}
public override void MethodB(){...}
}
//其中,B类重写了A类的普通方法MethodA,也重写了A类的虚拟方法MethodB,则:
A a = new B();
a.MethodA();//③ 将会调用A类的MethodA方法
a.MethodB();//④ 将会调用B类的MethodB方法

问题1:代码一:
①②运行的结果都是调用B类的show(A obj),输出B and A。不太明白为什么会返回这个,我自己的理解是①是父类引用指向子类对象,因为a2是A类型,所以先从A类的方法里看,A类的方法里没有show(B obj) 所以去B类里找方法,又因为B类里的show(B obj)是重载,而show(A obj)是重写,重载的部分不能调用,所以只能调用show(A obj)。这样的理解对吗?
问题2:代码二:
为什么代码二中③将会调用A类的MethodA方法,④将会调用B类的MethodB方法?重写之后不是应该都调用B类里的MethodA和MethodB方法吗?有人提到是因为普通方法和虚方法在编译和运行时的绑定问题,普通方法和虚方法又是什么?

解决方案

代码一中:A中没有show(B,obj),而B是A的子类对象调用的是A中show(A obj),而因为A是用B构造的,且B中重写了A中的show(A obj),因此调用的时候回调用B中的show(A obj),千万不要想当然的理解为A就是B对象,然后调用B的show(B obj);还有就是

代码二中:你贴的是C++的吧,java中用abstract类修饰虚函数,修改成这样:

 abstract class E {
    public void MethodA() {
        System.out.println("A-->MethodA");
    }

    public abstract void MethodB();
}

class F extends E {
    public void MethodA() {
        System.out.println("B-->MethodA");
    }

    public void MethodB() {
        System.out.println("B-->MethodB");
    }
}

测试代码如下:

E e = new F();
        e.MethodA();
        e.MethodB();

输出结果如下:

B-->MethodA
B-->MethodB

因此跟你说的结果不一致,因为B已经重写了A的MethodA方法,调用的时候还是会调用B的MethodA方法。MethodB没有问题。

解决方案二:

http://blog.csdn.net/trojanpizza/article/details/6561646

解决方案三:

你前面代码是不是没写全~里面的b是咋回事

解决方案四:

还有c,没有定义~如果是采用了向上转型,a2调用的应该是b中定义的show

解决方案五:

要理解这两个东东,还需要明白多态的概念

时间: 2024-09-08 00:29:26

代码-Java的重写和重载函数调用的问题的相关文章

怎样很好的将java中的构造重载学好(初学者)

问题描述 怎样很好的将java中的构造重载学好(初学者) 现在初学,但是在写代码的时候总是无法使用构造重载这种方法,并且在写代码的时候老是思绪混乱应该怎莫办??????? 解决方案 java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析 1 普通方法的重载 普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利

java方法重写和super关键字

//java方法重写和super关键字 //在继承中,其实就是子类定义了和父类同名的方法 //就是方法,属性都是相通的 //重写限制: //被子类重写的方法不能拥有比父类方法更加严格的权限 //super:强行调用父类方法的执行 /*重载和重写的区别? * 重载是发生在一个类中 对权限没有要求 而且重载的方法参数可以不同 * 重写发生在继承汇总 被子类重写的方法不能拥有比父类方法更加严格的权限,重写的方法中参数名字完全相同 * */ class A{ public void tell(){ Sy

java方法重写实例分析_java

本文实例讲述了java方法重写,分享给大家供大家参考.具体分析如下: 一.方法的重写概述: 1.在子类中可以根据需要对从基类中继承来的方法进行重写. 2.重写的方法和被重写的方法必须具有相同方法名称.参数列表和返回类型. 3.重写方法不能使用比被重写的方法更严格的访问权限. 二.程序代码如下: class Person{ private int age; private String name; public void setAge(int age){ this.age = age; } pub

JAVA关于重写和返回的问题

问题描述 JAVA关于重写和返回的问题 public class Item { public String id; public String name; public void setId(String id){ this.id=id; } public void setName(String name){ this.name=name; } public String getId(){ return id; } public String getName(){ return name; }

java equals 方法的重载和复写

问题描述 java equals 方法的重载和复写 public class Person { private String name; public Person(String name){ this.name = name; } public String getName() { return name; } public boolean equals(Object other) { Person person = (Person)other; System.out.println("执行复

java 里面重写update方法,paint

问题描述 java 里面重写update方法,paint 如题 java 里面重写update方法,重写的update里面没有调用paint方法,系统还会调用paint方法吗

对象-java中重写equals方法为什么不直接在里面比较hashcode()?

问题描述 java中重写equals方法为什么不直接在里面比较hashcode()? 看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同. 那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?

const-关于c++中的重载函数调用

问题描述 关于c++中的重载函数调用 如果一个非const对象调用重载函数,而重载函数均为const该如何调用. 如果一个const对象调用重载函数,而重载函数均为非const又该嗯么样呢? 解决方案 const对象调用const函数,非const对象调用非const函数 const对象指针调用const函数,非const对象指针调用非const函数 如果const对象/指针 调用非const函数的话,编译就会报错了. 而相反,非const对象/指针是可以调用const函数的 解决方案二: co

源代码-按书上写了一段代码java异常处理,不知道为什么不能运行,求大神指教

问题描述 按书上写了一段代码java异常处理,不知道为什么不能运行,求大神指教 源代码如下: package com.Sixping.Ncre; import java.io.*; public class ExceptionCatch { public static void main(String[] args) { try { FileNotFoundException fis = new FileNotFoundException("text"); System.out.pri