java 中的多重继承

Java中的接口不仅仅是一种更纯粹的抽象类,它的目标比这更高。因为接口是根本没有任具体实现的。也就是说,没有任何与接口相关的存储;因此,也就无法阻止多个接口的组合。这一点是很有价值的,因为你有时候需要去表示“一个X是一个a和一个b以及一个c”。在C++中,组合多个类的接口的行为被称作为多重继承。它可能会使你背负很沉重的包袱,因为每个类都有一个具体实现。在java中,你可以执行相同的行为,但是只有一个类可以有具体的实现;因此通过组合多个接口,c++的问题不会在java中发生:

下面展示一个具体类组合数个接口之后产生的一个新类:


package interfaces;

interface CanFight{
void fight();
}

interface CanSwim{
void swim();
}

interface CanFly{
void fly();
}

interface CanClimb{
void climb();
}
class ActionCharacter{
public void fight(){
System.out.println(" can fight");
};
}

class Hero extends ActionCharacter
implements CanFight, CanSwim, CanFly,CanClimb{
public void swim(){
System.out.println("hero can swim");
};
public void fly(){
System.out.println("hero can fly");
};
public void climb(){
System.out.println("hero can climb");
}
}

public class Adventure {
public static void t(CanFight x){x.fight();}
public static void u(CanSwim x){x.swim();}
public static void v(CanFly x){x.fly();}
public static void f(CanClimb x){x.climb();}
public static void w(ActionCharacter x){x.fight();}
public static void main(String [] args){
Hero h = new Hero();
t(h);
u(h);
v(h);
w(h);
f(h);
}

}

运行结果:

can fight
hero can swim
hero can fly
can fight
hero can climb

可以看到,Hero组合了具体类ActionCharacater和接口CanFight,CanSwim,CanFly和CanClimb。当通过这种方式将一个具体的类和多个接口组合在一起时,这个具体的类必须放在前面,后面跟着的才是接口,否则编译器出错。

注意,CanFight接口和ActionCharacter类中的fight(方法的特征签名一样,而且,在Hero中并没有提供fight()的定义。可以扩展接口,但是得到的只是另一个接口。当要创建对象时,所有的定义首先必须存在。即使Hero没有显示的提供fight()的定义,其定义也因ActionCharacter而随之而来,这样就使得创建Hero对象成为可能。

前面的例子所展示的就是使用接口的核心原因:为了能够向上转型为多个基类型(以及由此带来的灵活性)。

然而,使用接口的第二个原因却是防止客户端程序员创建该类对象,并确保这仅仅是建立一个接口。这带来了一个问题:我们应该使用接口还是抽象类?如果要创建不带任何方法定义和成员变量的基类,那么第一选择应该是选择一个接口而不是抽象类。若果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口。

java 中的多重继承,布布扣,bubuko.com

时间: 2024-12-28 16:30:10

java 中的多重继承的相关文章

java中的多重继承

interface CanFight{ void fight();}interface CanSwim{ void swim();}interface CanFly{ void fly();}class ActionCharacter{ public void fight() { }}class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly { public void swim() { } public void

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

java中,一个类实现某个接口,必须重写接口中的所有方法吗

不一定,关键要看子类是否是抽象类.如果子类是非抽象类,则必须实现接口中的所有方法: 如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在!1.抽象类定义抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象.通常在编程语句中用 abstract 修饰的类是抽象类.在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象:在java中,含有抽象方法的类称为抽象类,同样不能生成对象.抽象类是不完整的,它只能用作基类

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液.跳动),显然,此处不能单方面用属性或者方法表示一个心脏了,而需要一个类,但是这个类要依赖于人这个类存在(因为心脏不能脱离人体而存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所心脏以需要写在人类的内部.内部类就相当于其中的某个器官之一. 首先看看什么是内部类:在类的内部定义另一个类.没错

java中抽象类与接口

接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类.   抽象类 1 如果将一

java中extends与implements的区别

学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 2.extends是继承父类,只要那个类不是声明为f

为什么java不支持多重继承?

什么是钻石问题?如下图所示,B和C继承于A,D继承B和C(多重继承),在D中调用A的方法时,无法判断是调用B中的实现还是C的实现,下图继承关系是个菱形,所以该问题又叫做菱形问题. 如果java要解决这个问题,需要引入更复杂的机制,这和java 的初衷是背道而驰的(simple),但是java中可以实现多个接口,这与多重继承是非常相似的. 为什么java不支持多重继承?,布布扣,bubuko.com

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象

为什么Java中有些接口没有任何方法

由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的定义,没有方法的实现.接口中的所有方法都是抽象的.接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰.由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接的达到多重继承的目的. 在Java语言中,有些接口内部没有声明任何方法,也