0 0

关于java子类重写父类的方法的问题5

大家好我的问题是这样的,请看下面的源码:

class A {
public void fun1() {
System.out.println(" A fun1 is calling!!!");
}

public void fun2() {
fun1();
}

}

class B extends A{
public void fun1() {
System.out.println(" B fun1 is calling!!!");
}
}

public class Test {

public static void main(String[] args) {

new B().fun1();
new B().fun2();
}

}
运行后的结果为:
B fun1 is calling!!!
B fun1 is calling!!!

对于new B().fun1()很容易理解,这个是直接调用子类重写父类的方法,
但是对于new B().fun2(),是调用了从A继承来的方法fun2(),正如fun2()放里面看到的,又调用fun1()方法,最后输出的结果为重写后B类fun1()的结果而不是父类A里面fun1()的结果,请大家给出比较有说服力的分析。
2013年5月10日 14:37

11个答案 按时间排序 按投票排序

0 0

很简单的说,过程是这样,当实例化 B类时,发现fun2 没有重载则原封拷贝一个,发现fun2调用了fun1,但是在给B做fun1实现时,发现fun1被B重载了,于是用B.fun1替换A的fun1,道理很简单,子类方法覆盖了父类方法,其实在java中B类定义不存在父类内容,只有按照oo规则重新整理了一份B类定义!!

2013年5月12日 23:10
0 0

其实很简单,你调用的B类继承了A类,B中也有了A类的public fun2(),应该可以理解了吧?

2013年5月12日 14:00
0 0

class A {
public void fun1() {
System.out.println(" A fun1 is calling!!!");
}

public void fun2() {
fun1();
}

}

class B extends A{
public void fun1() {
System.out.println(" B fun1 is calling!!!");
}
}

public class Test {

public static void main(String[] args) {
  classA a=new classB();
    a.fun1();
}
  呵呵  这个红色地方调用什么方法 打印什么了?

}
































还是打印子类里面的  哈哈

2013年5月11日 01:40
0 0

嗯 热心的同学很多啊。
楼主应该是想要知道jvm的解析重写的原理。
这里你可以看看jvm解析这部分字节码时,是用的动态分派和子类重写父类方法表的指向。
它会告诉你,在查找动态分派的方法时,他会先在当前类找方法,否则找父类依次类推。最终还不能找到,那么抛出异常了,通常是NoSuchMethodException。
子类重写了父类,在子类的方法表里。那么重写的方法地址都会指向子类的入口地址,未重写的仍然指向父类的。

2013年5月11日 00:10
0 0

thinking in java,里面关于继承和多态讲得很详细,可以看看!

2013年5月10日 23:53
0 0

B重写了A的fun1方法,相当于在B中A的fun1方法被屏蔽了,所以newB().fun2()调用fun1方法时,调用的是自身重写后的fun1.

2013年5月10日 17:50
0 0

这样就更清楚了
public class A {
public void fun1() {
System.out.println(" A fun1 is calling!!!");
}

public void fun2() {
System.out.println(this.getClass().getName());
this.
fun1();
}
}

2013年5月10日 15:46
0 0

你在A类的fun2方法中加一句打印,就知道是什么意思了。
public class A {
public void fun1() {
System.out.println(" A fun1 is calling!!!");
}

public void fun2() {
System.out.println(this.getClass().getName());
fun1();
}
}

2013年5月10日 15:44
0 0

B类,其实是这样的
class B{
public void fun1() {
System.out.println(" B fun1 is calling!!!");
}
public void fun2() {
fun1();

}

2013年5月10日 15:40
0 0

是这样的啊

2013年5月10日 15:38
0 0

因为B重写了A的fun1,newB后调用fun2(),fun2()里调用的是B的fun1正常啊!!

2013年5月10日 15:33

相关推荐

    java子类重写父类的方法.doc

    Java 子类重写父类的方法详细解析 Java 中子类重写父类的方法是面向对象编程的核心概念之一。子类可以重写父类的方法,以改变或扩展父类的行为。但是,子类重写父类的方法需要遵守一定的规则,以避免编译器错误和...

    Java编程关于子类重写父类方法问题的理解

    主要介绍了Java编程关于子类重写父类方法问题的理解,分享了有关子类重写父类的实例,具有一定参考价值,需要的朋友可以了解下。

    java子类调用父类的方法中包含子类重写的实例方法

    在本篇文章里小编给大家整理了关于java子类调用父类的方法中包含子类重写的实例方法以及相关知识点,需要的朋友们可以学习下。

    java中的继承(子类调用父类构造方法还不懂).doc

    在 Java 中,使用 `extends` 关键字可以实现继承关系,子类可以继承父类的属性和方法,并可以重写父类的方法。使用 `super` 关键字可以引用父类的成分,访问父类中定义的属性和方法。 在 Java 中,可以使用多态性来...

    Java编程子类能否重写父类的静态方法探索

    关于子类能否重写父类的静态方法,对像我这种初级的编程爱好者来说仍是值得讨论的一件事,下面我们通过具体实例,对此问题进行简单的探索。

    java子类继承父类实例-披萨的选择实现代码

    主要介绍了java子类继承父类实例-披萨的选择实现代码,具有一定借鉴价值,需要的朋友可以参考下。

    简单的java类的重写还有父子类的练习(多种图形面积求取)

    简单的java类的重写还有父子类的练习,今天花了半个小时利用父类子类的代码重写和继承的相关知识写了一个图形的面积和周长的计算的代码,可选图形哦,在此和大家分享一下。

    ChildClass.java

    如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; ## Java 父类强转子类 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

    JAVA重写和重载.pdf

    例如,子类可以重写父类的方法,例如`bark()`方法,但具有相同的方法名、返回类型和参数表。 区别 * 重载是指在同一个类中的多态性,而重写是指父类与子类之间的多态性。 * 重载的方法名相同,但参数类型和个数...

    java 重载,重写以及继承,多态的区别

    重载是指同一个类中的多个同名方法,重写是指子类对父类方法的重新实现,继承是指子类继承父类的成员变量和方法,而多态是指父类可以调用子类的方法。 在实际开发中,重载、重写、继承和多态都是非常重要的概念,...

    java 类的继承 基础理解

    2. 方法的重写:子类继承父类的方法,需要重写父类中的方法以符合新的需求。 3. 对象的实例化:可以使用父类的对象名来实例化子类,例如 `Car myCar = new CarBrand()`。 在 Java 中,继承是实现代码重用和继承关系...

    java的继承总结.doc

    子类重写方法时的访问修饰符可以大于或者等于父类方法的访问修饰符。重写后的方法会被优先调用。 六、自动转型 自动转型是指子类对象可以被转型为父类对象,实现方法的调用。自动转型的格式如下: ```java 父类名 ...

    Java中方法重载与重写的区别

     方法的重写是子类对父类的方法进行改造。  方法重写必须满足下列条件。  (1)子类的方法的名称及参数必须和所重写的方法完全相同。  (2)子类的方法返回类型必须和所重写的方法相同。  (3)子类方法不...

    Java零基础-继承.md

    熟悉使用@Override注解重写父类方法和使用super关键字调用父类方法。 阅读建议: 建议读者在阅读前具备Java的基础知识,包括类、对象、方法和成员变量等概念。 在阅读过程中,尝试编写简单的Java程序,创建并使用...

    java定义父类和子类.doc

    同时,我们也可以看到 Java 的一些基本语法元素,如类、对象、继承、多态性、方法重写等,这些元素都是 Java 编程语言的基础。 继承机制的优点: * 代码复用:继承机制允许我们定义一个通用的父类,并让子类继承其...

    java中重载与重写的区别.pdf

    Java 中重载与重写的区别 Java 中的重载(Overloading)和重写(Overriding)是两个不同的概念,它们都是 Java 语言中实现多态性的...方法重载允许同一个方法名对应多个方法体,而方法重写允许子类重写父类中的方法。

    java子类以及用正则表达式读取网页中的标签的类

    然后编写一个该类的子类,要求子类重写方法f(),而且重写的方法将返回两个整数的最小公倍数。要求:在重写的方法的方法体中首先调用被隐藏的方法返回a和b的最大公约数m,然后将(a*b)/m返回;在应用的程序的主类中...

    Java笔试题大汇总

    对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 6 自定义表格类中的model部分应实现的接口是___A___。 A、...

    Java程序设计课件:第四章 继承与多态.ppt

    子类可以继承父类的成员变量和方法,并且可以重写父类的方法。父类使用访问权限保护成员变量和方法,可以控制子类的访问权限。在同一个包中,子类可以继承父类的非 private 修饰的成员变量和方法,而在不同包中,...

Global site tag (gtag.js) - Google Analytics