`
随便小屋
  • 浏览: 102669 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

关于Java继承的一个小问题。。。

    博客分类:
  • JAVA
阅读更多

今天看Java 编程思想的时候遇见一个问题,运行的结果和自己想想的完全不一样。先把代码贴出来!

//CanFight接口
interface Canfight {
    void fight();
}
//ActionCharacter类
class ActionCharacter {
    public void fight() {
        System.out.println("Fight from ActionCharacter");
    }
}
//Hero类继承ActionCharacter类实现Canfight接口
class Hero extends ActionCharacter implements Canfight {
    public void swin() {}
    public void fly() {}
}

public class Adventure {
	//参数为Canfight,向上转型,调用fight方法
    public static void t(Canfight x) {
        x.fight();
    }
    //参数为ActionCharacter类型,向上转型,调用fight方法
    public static void w(ActionCharacter x) {
        x.fight();
    }

    public static void main(String[] srgs) {
        Hero h = new Hero();
        t(h);
        w(h);
    }
}

/*运行结果
 Fight from ActionCharacter
 Fight from ActionCharacter
 */
 

 在main方法中,调用t方法时,Hero的对象h向上转型为一个Canfight,然后在调用Canfight的fight方法,由于fight方法没有具体的实现,我认为应该不会有输出或者编译器报错。

 

事实结果应该是 Hero继承ActionCharacter,在运行时,将Hero中所有在ActionCharacter中能用到的东西全部复制到ActionCharacter中,这样在ActionCharacter类中就有了一个fight方法的具体实现。从另外一个角度讲就是在ActionCharacter类中有了接口Canfight中的fight方法的实现。

 

我自己分析的是这样的,希望大神给出指点。。。

0
3
分享到:
评论
10 楼 inspires 2014-10-16  
这是多态的特性,跟继承关系不大,也没有什么复制不复制的。
9 楼 thc1987 2014-10-16  
可以简单的理解成
当调用x.fight()时,在Hero中找有没有fight()方法,如果有就执行,如果没有就在其父类中找,如果有就执行.
8 楼 elliotann 2014-10-15  
我的理解,当接口中,声明了一个方法,而继承中,实现了这个方法,3楼说的也没错,这种调用方法确实是同一内在的引用,所以打印一样
7 楼 jackyin5918 2014-10-15  
fsplove520 写道
就是LZ说的 向上转型

向上转型是说,在函数调用时,接收 形参的子类作为参数(实参).但是 假如子类方法覆盖了 父类的同名方法,则实际调用的还是子类的方法,不会调用父类的方法. 即,向上转型不会真正的把子类对象转换成父类对象(更不会转型成一个接口了,所以 "Hero的对象h向上转型为一个Canfight" 这个是错的).  这里就用到了多态的概念. 楼主这种用法确实是向上转型,但是 了解了 多态的概念,应该就不会出现文中楼主所述的困惑了. 说3楼的 高大上, 是因为,楼主看了3楼的回答不但不能理解,反而会更加困惑. 比如,在Hero里面再实现一个
public void fight() { 
        System.out.println("Fight from Hero"); 
    }
这样,楼主可能有会困惑了.
6 楼 fsplove520 2014-10-15  
就是LZ说的 向上转型
5 楼 fsplove520 2014-10-15  
jackyin5918 写道
"在main方法中,调用t方法时,Hero的对象h向上转型为一个Canfight,然后在调用Canfight的fight方法,由于fight方法没有具体的实现,我认为应该不会有输出或者编译器报错。" -- 楼主的理解不正确,这里不是转型

这里用到的概念应该是多态. 可以简单理解成: 函数的参数(形参) 是一个接口类型. 调用函数时,传递的 实参 是 形参的 具体实现类, 则调用的是实参 本身类型的方法. 比如 interface C { methodC; }
class A implemet C { println("A"); }
class B implemet C { println("B"); }
上面接口C的两个实现类A B, 如果一个参数(形参)是C类型的,A和B的示例都可以作为实参,
然后调用的分别是 A和B的println 方法.

ps 3楼放出 内存管理模型 这个 也太高大上了吧


其实我要说的就是 父类引用指向子类对象 ,这也没啥高大上吧
4 楼 jackyin5918 2014-10-15  
"在main方法中,调用t方法时,Hero的对象h向上转型为一个Canfight,然后在调用Canfight的fight方法,由于fight方法没有具体的实现,我认为应该不会有输出或者编译器报错。" -- 楼主的理解不正确,这里不是转型

这里用到的概念应该是多态. 可以简单理解成: 函数的参数(形参) 是一个接口类型. 调用函数时,传递的 实参 是 形参的 具体实现类, 则调用的是实参 本身类型的方法. 比如 interface C { methodC; }
class A implemet C { println("A"); }
class B implemet C { println("B"); }
上面接口C的两个实现类A B, 如果一个参数(形参)是C类型的,A和B的示例都可以作为实参,
然后调用的分别是 A和B的println 方法.

ps 3楼放出 内存管理模型 这个 也太高大上了吧
3 楼 fsplove520 2014-10-15  
小哥,你这样理解完全是错误的!可能你对内存分配管理方面还不太了解。在这个过程中,不管是ActionCharacter x 还是 Canfight x 他们都是都是指向同一份内存的引用,故2个x.fight(); 都是跑的同一个函数内存栈。

你可以试着打印下这3个变量,看看输出对象是不是一样的。
2 楼 devilyard 2014-10-15  
Hero继承了ActionCharacter,当然ActionCharacter 中的public方法使用子类Hero也是可以调用的,你可以认为Hero自己有了一个fight方法,当Hero再实现一个Canfight接口的时候自然也就有了一个实现。
1 楼 cs6641468 2014-10-15  
肯定是这样的,不然编译阶段就报错了。

相关推荐

    java_中关于_继承_的一个小例子.

    java_中关于_继承_的一个小例子,java_中关于_继承_的一个小例子.rar

    Java 继承 小程序

    Java中对继承的练习,一个很小的程序,为初学者提供参考

    Java 实现继承实例代码

    本人研究Java有段时间了,现在把Java实现继承实例的代码上传,希望共同交流 qq 418586040

    java继承作业.pdf

    java继承作业.pdf

    java 继承泛型类示例

    java 继承泛型类示例 java 继承泛型类示例 java 继承泛型类示例

    java继承学习教案.pptx

    java继承学习教案.pptx

    关于JAVA继承的讲解

    这个对于初学都很有帮助的,不懂的可以来看看。这是我做JAVA的经验之谈。

    利用Java继承机制

    利用Java继承机制。编写一个抽象的图形类Shape,里面有方法getArea()计算面积以及方法displayArea()显示面积,编写子类矩形类和三角型类分别实现两个方法。

    java继承部分课件

    第一次传东西,大家多多支持呀。一本部分java继承的课件

    经典java继承例子

    非常适合初学者的java继承学习 很经典因为我也是初学者!哈哈

    java继承和多态ppt

    java 继承和多态PPT教程

    java继承类实例

    自己设计的一个程序,展现有继承结构的子类对象的初始化过程(包含构造方法、初始化值、父类构造方法、父类的初始化值的环节)

    java继承课件

    java继承课件,主要用于初学者自学java继承课件,主要用于初学者自学java继承课件,主要用于初学者自学java继承课件,主要用于初学者自学java继承课件,主要用于初学者自学

    6.java继承的概念.zip

    6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip6.java继承的概念.zip...

    7.java继承的语法.zip

    7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip7.java继承的语法.zip...

    Java 继承和方法重写

    Java 继承知识点的相关学习。

    java继承程序

    java 继承 程序 学习java 必须要学习的知识,搞懂了 你java就入门了

    JAVA继承的相关知识点

    Java中的继承作为Java面向对象三大特性之一,在知识点上而言,还是很多的,而且java的继承与覆盖基本是java笔试中常出的题,也比较绕,下面欧#柏泰#克和大家一起来学习下JAVA继承的相关知识点吧:

    Java继承习题

    java继承习题精选 包含可很多习题 同时也副有正确答案

Global site tag (gtag.js) - Google Analytics