`
随便小屋
  • 浏览: 106501 次
  • 性别: 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 // 父类 public class Animal { protected String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + ...

    Java 继承 小程序

    在Java编程语言中,继承是面向对象编程的一个核心特性,它允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为。这个概念极大地提高了代码的重用性和模块化,使得我们可以构建复杂的类层次结构。在...

    关于JAVA继承的讲解

    Java 继承是面向对象编程中的一个重要概念,它允许一个类(子类)从另一个类(父类)中继承属性和方法,从而实现代码的复用和类的层次结构。这种方式使得子类能够继承父类的特性,同时可以添加自己的特性和功能,而...

    Java 实现继承实例代码

    这个例子展示了Java继承的核心概念,包括: 1. 使用`extends`关键字创建子类。 2. 访问和覆盖父类的方法。 3. 添加子类特有的方法。 4. 多态性的应用。 通过学习这个实例,开发者能够更好地理解和运用Java的继承...

    经典java继承例子

    Java继承支持单继承,即一个子类只能直接继承一个父类。但通过接口,我们可以实现多继承的效果,因为一个类可以实现多个接口。 在实际应用中,我们通常会重写父类的方法,以满足子类的特定需求。这是通过使用`@...

    java继承类实例

    在这个特定的程序中,我们看到了一个关于Java继承的实例,它演示了子类对象初始化时涉及的各个步骤,包括构造方法、初始化值、父类构造方法以及父类的初始化值。 首先,我们有一个名为`Parent`的父类,它有两个实例...

    Java面向对象之继承练习题.doc

    1. **类的继承**:在Java中,继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个`Music`类作为其他音乐相关类的基类。 2. **构造方法**:构造方法用于...

    java继承部分课件

    - 类可以实现多个接口,但只能继承一个父类。 **final关键字与继承:** - `final`类不能被继承。 - `final`方法不能被子类覆盖。 - `final`变量一旦初始化就不能改变。 通过这个课件,你将能够深入了解Java继承的...

    利用Java继承机制

    在本例中,我们将使用Java继承机制编写一个抽象的图形类Shape,并编写两个子类矩形类和三角形类,分别实现计算面积和显示面积的方法。 Abstract Class Shape 首先,我们定义一个抽象的图形类Shape,它有两个抽象...

    java继承作业.pdf

    Java继承作业.pdf 在本文中,我们将讨论Java继承的基本概念和实现方法,並以三个实例来演示继承的应用。 一、new A 和 A a=new A()的区别 在Java中,new关键字用于创建对象,而A a=new A()是将对象赋值给变量a。...

    java关于继承的思维导图(Xmind)

    - Java语言实行单一继承,即一个类只能直接继承一个父类。这样有助于避免复杂的继承关系导致的混乱。如果需要多重继承的效果,可以使用接口(interface)。 3. **构造器与继承** - 子类在实例化时,会先调用父类...

    java继承例题

    1. 单继承:Java只支持单继承,即一个类只能继承一个超类。 2. 多层继承:Java支持多层继承,即一个类可以继承另一个类,该类又可以继承另一个类,以此类推。 3.继承变量和方法:子类继承了超类的成员变量和成员方法...

    Java 继承和方法重写

    Java 采用单一继承策略,即一个类只能直接继承一个父类,但可以通过接口实现多重继承的效果。 3. **访问权限**: - **公有(public)**:子类可以访问父类的所有公有成员。 - **保护(protected)**:子类在同一...

    Java继承实例源代码

    在这个"Java继承实例源代码"的压缩包中,包含的文件可能提供了关于Java继承和多态性的实际应用示例。 首先,我们来看“继承”这一概念。在Java中,通过使用关键字`extends`,一个类可以声明其为另一个类的子类。...

    JAVA继承的相关知识点

    下面我们将深入探讨JAVA继承的相关知识点。 1. **继承的概念**: - 继承体现了类之间的层次结构,子类继承父类,表示子类是父类的一个特例,具备父类的所有特性但可能有所扩展。 - Java中声明继承使用`extends`...

    Java设计一个银行帐户类(继承与多态)

    实验中提到的“一个类只能继承一个父类”是Java单继承特性,但Java支持接口的多实现,可以模拟多重继承的效果。在创建子类时,父类的构造函数会先被执行,确保父类的初始化,然后执行子类的构造函数。 总的来说,这...

    Java 接口与继承

    2. 尽管Java在类继承上是单继承的,但可以通过实现多个接口来实现多重继承的效果,接口是Java中另一种形式的继承,它允许一个类实现多个接口。 3. 子类继承了父类的所有非私有成员变量和方法,但不包括构造函数。...

    java继承学习教案.pptx

    java继承学习教案.pptx

    java继承和多态ppt

    java 继承和多态PPT教程

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

Global site tag (gtag.js) - Google Analytics