类,抽象类和接口是java语言里三大基础类,它们各自有一定的继承关系,比如说类与类之间的继承,抽象类也是一种类,也可以理解为是一种继承关系,而接口稍微有点特殊,它不是通过子类来继承的,是通过子类来实现的,我们称实现这个接口的为实现类,在这里也暂时的类比成类与类之间的继承关系。那么这些继承关系有什么异同呢?又各自有什么特点呢?
普通类比较简单,类与对象是java里最基本的概念。两个类之间可以通过关键词extends来继承。比如public class person{private String name;public void walk();},public class student{private String name;public void study();}。这两个类之间怎么继承呢?public class student extends person{}
这里person类是父类,student类是子类,通过extends发生了继承关系,那么student类具有了父类之中的一些方法与属性。之所以说是一些是因为即使继承,但如果在父类里面的属性是private或者protected的,那么子类是无法拥有父类的这些属性的。
抽象类,顾名思义是一种类,同时也是一种抽象的类。什么是抽象的类呢?类包含两大方面,一个是属性,一个是方法,即函数。抽象类既然是类,那么肯定具有这两种特性。但是在抽象类里面的方法与普通类有点区别,在抽象类里面,方法是一种抽象方法,抽象方法是一种没有方法体的方法,它是一种没有意义的方法。也就是说这种方法只提供了一个名称,但是没有给出具体的实现方法。当然抽象类里面也可以有普通方法,也可以没有抽象方法。它是在声明类的时候通过关键字abstract来声明抽象类的。抽象类在调用时是不能直接通过构造函数来创建对象的,因为用创建对象就得拿来调用方法,而抽象类里的方法都是没有意义的。但我们必须得通过一种方法来实现这种调用。因此,这里还得通过继承关系。用一个子类来继承抽象类,此时必须要在子类中实现抽象类的抽象方法,之后通过自动转型来创建对象。
接口与两者的区别在于,在接口里面都是抽象方法,即只能有抽象方法。它通过interface来声明,而实现类的话则是通过imeplements。凡是此种关系,在父类里面只要有抽象方法,那么在子类里面就必须实现它的抽象方法。
接口与抽象类有一定的区别,这里作一个简单的概括:
接口 抽象类
多继承 支持 不支持
类型限制 没有 有,只能是引用类型
方法实现 继承类型中必须给出方法实现 继承类中可以不给出
扩展性 比较麻烦 相对比较灵活
多层继承 比较麻烦,需要借助虚函数 比较灵活
以上只是分析了普通类与抽象类,与接口之间的继承关系,那抽象类与实体类之间,接口与接口之间和抽象类与接口之间是否又有同样的继承关系呢?在很多的java面试里面都可以看到一道题,抽象类可以继承实体类吗?答案是可以的,但是有一个前提是,实体类必须有明确的构造函数。API里每个类都是间接或直接继承Object类的,而Object是一个实体类,也就是说抽象类可以继承实体类,而这句话后半部分意思是说:在父类里面必须有子类可以访问到的构造器,父类不能声明为final。抽象类也是可以实现接口的,比如java.util中的AbstractCollection类就是实现的Collection接口,而且可以不实现接口中所有的方法,可以通过抽象类的子类来实现。比如:interface ITest {
void test1();
void test2();
}
public abstract class Test implements ITest { //抽象类不用全部实现接口中的所有方法
public void test1(){
System.out.println("test1!!");
}
}
class TestChild extends Test { //上面接口ITest 中剩余的方法test2,在该抽象类Test 的子类TestChild 去实现即可。
@Override
public void test2() {
System.out.println("test2!!");
}
}
所以抽象类实现一个接口时,不用全部声明实现接口中的所有方法。
因为抽象类可以有普通方法,也可以有抽象方法,所以抽象类是可以继承实体类和抽象类的,也可以实现接口的。
接口是可以继承接口..但是要使用extends~而不是用implements
如:interface a{}
interface b extends a{}
总结:实体类可以继承抽象类和实现接口;抽象类可以继承实体类和接口;接口也可以继承接口,但不能实现接口。接口解决了java里只能单根继承的问题,接口是可以多继承的。各自有各自的优势,但也有各自的劣势,而普通类的继承与抽象类和接口的继承的区别主要在抽象方法的实现。
分享到:
相关推荐
在Qt5的学习过程中,理解类的继承关系是至关重要的,因为它有助于开发者更好地把握库的结构和各组件之间的联系。本文档是一份简明的示意图,列出了Qt5中一些常见类的继承关系。 首先,我们从Qt的核心模块开始,即...
### Adapter继承关系结构图知识点详解 #### 一、Adapter继承结构概述 在Android开发中,`Adapter`是一种非常重要的组件,主要用于将数据源中的数据与视图进行绑定,以实现列表或其他类型的视图控件的数据展示。...
**Qt5类继承关系图详解** Qt5是一个强大的跨平台应用程序开发框架,广泛应用于桌面、移动设备和嵌入式系统的GUI设计。它以其丰富的类库、高效的性能和易用性著称。在Qt5中,类的继承关系是理解其工作原理的关键。本...
而"Qt继承关系图.pdf"可能包含了Qt4的类继承结构,这对于理解不同版本之间的差异和进化路径非常有帮助。 总的来说,理解Qt4和Qt5的类继承关系对于深入学习和开发Qt应用程序至关重要。通过查看这些继承关系图,...
多态性允许父类型的引用指向子类型的实例,这在处理不同类型的对象时提供了极大的灵活性。例如: ```java Animal animal = new Dog(); // 泛型编程的体现 animal.eat(); // 这里调用的是Dog类中可能覆盖过的eat()...
DOM 中的对象继承关系是指不同类型的 DOM 对象之间的继承关系,了解这些继承关系对开发者理解和使用 DOM 对象非常重要。 在 DOM 中,所有对象都继承自 EventTarget 对象,EventTarget 对象提供了事件处理的基本方法...
VCL提供了一套丰富的组件,这些组件具有清晰的继承关系,使得开发者可以方便地扩展和定制功能。在"Delphi7 VCL继承关系全图"中,我们可以看到这一关系的可视化展示。 VCL的继承关系是基于Object Pascal语言的类层次...
文档提到类型图和类型层次结构,这在数据库设计中用来描述不同类型之间的继承关系。类型层次结构通常用图形的方式表示,从最通用的类型(根类型,root)开始,到特定类型的继承关系结束(叶类型,leaf)。 3. 泛型...
本主题聚焦于“用Hibernate映射继承关系”,我们将深入探讨Hibernate如何处理对象的继承层次结构,并将其映射到数据库中的表。 Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表...
在关系数据库中,这种继承关系通常需要通过特定的映射策略来实现。Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将...
在 Hibernate 中,继承关系的映射是实现对象关系映射(ORM)的关键部分,特别是在处理复杂业务模型时。继承关系在对象模型中扮演着重要的角色,它允许我们通过类的层次结构来组织和重用代码。在Java中,一个类只能有...
标题“Qt继承关系图,qt5”和描述中提到的是关于Qt框架中的继承体系结构,特别是在Qt 5版本中的表现。这部分内容涉及了Qt的多个核心组件及其在继承体系中的位置。Qt是一个跨平台的C++框架,广泛应用于开发图形用户...
根据提供的文件信息,我们可以梳理出以下知识点,主要围绕Qt框架以及其在C++中的类继承关系、模块划分、以及相关的技术概念。 首先,我们注意到文档提到了“Qt5类继承关系图”,这暗示了文档中可能包含Qt 5版本中...
js树状图、分类表和继承关系是JavaScript开发中非常重要的概念,它们各自在不同的场景下发挥着关键作用。通过掌握这些知识点,开发者不仅可以更高效地管理和组织代码,还能提高应用程序的可读性和可维护性。对于大型...
类继承关系图显示了Qt中各个类之间的继承关系。这些类可以是基础类,也可以是派生类,其中派生类继承了基础类的属性和方法。这种继承机制允许开发者利用已有的类来创建新的类,从而增强代码的可重用性和模块化。 在...
根据提供的继承关系图,“Exception”类具有多个子类,这些子类分别对应不同类型的错误或异常情况。下面列举了一些主要的子类: - **EAbort**:用户取消操作时引发。 - **EArrayError**:数组操作错误。 - **...
继承关系中的类同样可以定义自己的普通方法和构造方法。例如,在上面的`Cat`类中,我们可以添加一个`meow()`方法来表示猫的叫声,并且可以通过构造方法初始化猫的一些初始状态,如名字、年龄等。 ### 接口与继承的...