第八章:抽象类、接口和枚举

合集下载

Java基础—抽象类和接口

Java基础—抽象类和接口

Java基础—抽象类和接⼝1.抽象类在Java语⾔中使⽤abstrac关键字来定义抽象类和抽象⽅法,抽象⽅法没有定义,⽅法名后⾯直接跟⼀个分号,⽽不是花括号。

public abstract class Employee{private String name;private String address;private int number;public abstract double computePay();//其余代码}抽象类总结:1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译⽆法通过。

只有抽象类的⾮抽象⼦类可以创建对象。

2. 抽象类中不⼀定包含抽象⽅法,但是有抽象⽅法的类必定是抽象类。

3. 抽象类中的抽象⽅法只是声明,不包含⽅法体,就是不给出⽅法的具体实现也就是⽅法的具体功能。

4. 构造⽅法,类⽅法(⽤static修饰的⽅法)不能声明为抽象⽅法。

5. 抽象类的⼦类必须给出抽象类中的抽象⽅法的具体实现,除⾮该⼦类也是抽象类。

2.接⼝Interface关键字⽤来声明⼀个接⼝。

/* ⽂件名 : Animal.java */interface Animal {public void eat();public void travel();}接⼝总结:1. ⼀个接⼝能继承另⼀个接⼝,和类之间的继承⽅式⽐较相似。

接⼝的继承使⽤extends关键字,⼦接⼝继承⽗接⼝的⽅法2. 接⼝的⽅法声明必须是 public abstract ,即便不写默认也是3. 类实现接⼝时,除⾮实现接⼝的类是抽象类,否则该类要定义接⼝中的所有⽅法。

4. 接⼝⾥⾯只能声明 public static final 修饰的变量5. 接⼝不能被实例化,但是可以被实现类创建3.抽象类与接⼝的区别抽象类中的⽅法可以有⽅法体,能实现⽅法的具体功能,但是接⼝中的⽅法不⾏。

抽象类中的成员变量可以是各种类型的,⽽接⼝中的成员变量只能是 public static final 类型的。

抽象类和接口的区别抽象类和接口的区别和联系

抽象类和接口的区别抽象类和接口的区别和联系

抽象类和接口的区别抽象类和接口的区别和联系在Java语言中,抽象类(abstract class)和接口(interface)是支持抽象类定义的两种机制。

正是由于这两种机制的存在,才赋予了Java强大的面向对对象的功能。

抽象类和接口之间存在着很多相似性,但是又有本质的区别。

对于初学者而言,在使用时很难界定到底采用者两种机制的哪一种。

本文具体分析了这两个概念的相同点和相异处。

二、正文:接口简述:在Java语言规范中,一个方法的特征仅包括方法的名字,参数的数目和种类,而不包括方法的返回类型,参数的名字以及所抛出来的异常。

在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。

但在Java编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。

接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。

Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。

Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public,静态的和final属性。

接口把方法的特征和方法的实现分割开来。

这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。

一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。

抽象类描述:abstract class和interface在Java语言中都是用来进行抽象类定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。

并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

面向对象--接口与抽象类、对象和接口(通俗讲解)

面向对象--接口与抽象类、对象和接口(通俗讲解)

面向对象--接口与抽象类的恩恩怨怨接口与抽象类是面向对象编程中两个非常重要的角色,二者各自起着非常重要的作用。

但是很多初学的朋友往往会对使用接口还是抽象类存在的很大的迷惑。

就我自己的一点心得,发表一下拙见。

面向对象的一些回顾:面向对象世界中有一个古老的法则:接口隔离原则,指的是不要把多个功能全部都集中在一个接口里面。

接口实现的功能要相对单一;衍生开来可以得到另外一个结论:对一组或者称一系列功能的实现,尽量定义相对功能单一的小模块来实现这一组功能。

这其实也是解耦和的体现。

那这跟我们的接口和抽象类有什么关系呢?那又得摆出另外一个法则:依赖倒置原则,针对接口编程而不是针对实现编程。

说到这,又会有一个新的问题蹦出来,这是自相矛盾啊,既然要针对接口编程还要抽象类干吗使?我们经常说面向对象,面向对象是来源于生活的。

是人们要把对现实世界中的一系列方法论应用到程序设计当中来。

从对象这一概念的引入我们就可以揣摩这一点。

人类社会中有很多对象的概念,人、车、物体。

不幸的是用程序来实现这些对象比在概念上定义对象要难很多。

(如果能达成这一共识,您可以继续往下看,否则就请看官您移步至留言讨论吧)MS给出开发者的建议是,用抽象类来实现接口。

子类再继承基类。

实例说明:为什么要这么建议?OK,我们试着结合实际来说明一下这个问题吧。

我们要造车。

这个车有个基本的属性就是能移动、还必须有轮子。

那我们就设计一个接口1public interface ICar2 {3 string Wheel4 {5 get;6 set;7 }8 void Move();9 }10接下来的事情,就是实现了。

造什么车都行,继承一下就行。

随着科技的发展,我们的车想要飞了。

此时当然不能修改这个接口,因为要遵循开闭原则。

为什么要遵循?我们可以想一下,人坐上飞机能飞上天。

但是也没见谁认为人有会飞这个特性的。

那也好办,不许修改,那我再加一个接口。

1interface IFlyable2 {3 void Fly();4 }5好,我们的飞行汽车最后应该是这样的。

类、抽象类、接口、继承和对象(java)

类、抽象类、接口、继承和对象(java)

类、抽象类、接口、继承和对象(java)来源:JA V A中文站(www_java-cn_com)这不是什么教材,笔者有时会在论坛上瞧瞧,看到不少初学者问到很多问题,这些问题是java程序员应该懂得的,而一般书上不会讲到或者一笔带过的知识。

因此斗胆涂鸦一篇文章,把想说的在这里一口气说完。

这也是本人第一次写技术性的文章,文笔不畅之外,还请各位见谅。

首先讲清楚类和对象的区别。

类是广泛的概念,表示一个有共同性质的群体,而对象指的是具体的一个实实在在的东西。

例如,“人”是一个类,它可以表示地球上所有的人;而“张三”、“李四”、“爱因斯坦”等则是一个个的对象,或者说它们是“人”这个类的一个个实例。

在Java 中,我们可以定义类,然后创建类的对象。

例如:// 声明一个类“Human”class Human{private String name;public String getName(){实用文档return name;}public void setName(String value){ = value;}//......}创建一个类:Human human = new Human();其次,很多人对对象和对象的引用认识模糊引用是程序操作对象的句柄,相当于C和C++中的指针。

前面说了,对象是一个实实在在的东西,比如前面的代码:Human human = new Human();实用文档程序执行到这里之后,java虚拟机将会在内存中创建一个Human 对象,并将这个对象的引用赋给human 变量。

这里有两步,首先是创建Human 对象,然后把创建的对象的引用赋给human 变量。

如果声明了一个对象的引用,但没有将对象赋值给它,则这个引用指向了空的对象,或者说引用了不存在的对象。

这时如果想通过这个引用访问对象,则会抛出空指针异常,例如:Human human;//......human.setName("张三");下面重点谈一谈类、抽象类、接口和继承之间的关系不少细心的初学者在论坛上问类似这样的问题:1、接口不实现方法,但我却在程序中可以调用接口的方法,这是为什么?比如java.sql 包中的Connection、Statement、ResultSet 等都是接口,怎么可以调用它们的方法呢?实用文档2、抽象类不能实例化,但是jdk中却有很多抽象类的对象,这是为什么?比如System.in 是一个InputStream 类型对象,但InputStream 是抽象类,怎么可以得到它的对象呢?不管怎么样,大家应该明白一点:不管是抽象类中的抽象方法,还是接口中定义的方法,都是需要被调用的,否则这些方法定义出来就没有意义了。

C++中抽象类和接口的区别

C++中抽象类和接口的区别

抽象类和接口的区别抽象类:抽象类是特殊的类,只是不能被实例化(将定义了一个或多个纯虚函数的类称为抽象类);除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。

抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

虽然不能定义抽象类的实例,但是可以定义它的指针,并且指向抽象类的指针实际上在赋值时是指向其继承类的实例化对象的,这样通过统一的使用该指针可以很好的封装不同子类的实现过程,这在模式设计的过程中得到了极大的应用!接口:接口是一个概念。

它在C++中用抽象类来实现,在C#和Java中用interface来实现。

接口是引用类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化;2、包含未实现的方法声明;3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。

除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

抽象类和接口的区别:1.接口和抽象类的概念不一样。

接口是对动作的抽象,抽象类是对根源的抽象。

抽象类表示的是,这个对象是什么。

接口表示的是,这个对象能做什么。

比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。

说明,他们都是人人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

2.抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。

韩顺平java全部内容笔记

韩顺平java全部内容笔记

韩顺平java全部内容笔记韩顺平是一位伟大的计算机科学家,他的Java全部内容笔记,是学习Java的非常好的资料。

该笔记共有近1000页,内容全面详细,涵盖了Java的各个方面,以下是简单介绍:第一部分:Java基础1. Java入门:简介、JDK、Java开发环境的搭建、Hello World程序等。

2. 变量与常量:Java的数据类型、变量的定义与使用、常量的定义与使用等。

3. 运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符等。

4. 控制流程:if语句、switch语句、for循环、while循环、do-while循环等。

5. 数组:一维数组、二维数组、数组排序、数组查找等。

6. 方法:方法的定义与使用、传递参数、返回值等。

7. 面向对象:面向对象的基本概念、类的定义与使用、封装、继承、多态等。

8. 类与对象:类与对象的关系、构造方法、对象成员变量、对象的引用等。

9. 抽象类与接口:抽象类的定义与使用、抽象类与普通类的区别、接口的定义与使用、接口的实现等。

10. 异常处理:异常的概念、异常的分类、异常处理的机制、自定义异常等。

11. 泛型:泛型的定义与使用、泛型类、泛型方法、泛型限定等。

12. 多线程:线程的概念、线程的创建与启动、线程的生命周期、线程的同步、线程通信等。

13. 反射:反射的概念、反射的使用、反射的用途、动态代理等。

14. 注解:注解的概念、注解的使用、自定义注解等。

15. 枚举:枚举的概念、枚举的使用、枚举的用途等。

16. IO流:IO流的基本概念、字节流、字符流、文件读写、序列化等。

17. 网络编程:网络编程的基本概念、Socket编程、服务器与客户端、TCP/UDP等。

18. 数据库编程:数据库的基本概念、JDBC编程、SQL语句、事务等。

19. 集合框架:集合框架的基本概念、ArrayList、LinkedList、HashSet、HashMap 等。

20. JavaWeb编程:Servlet编程、JSP编程、Struts框架、Spring框架、Hibernate 框架等。

接口与抽象类的区别与应用场景对比

接口与抽象类的区别与应用场景对比一、接口与抽象类的定义及特点在面向对象编程中,接口(interface)和抽象类(abstract class)是两种常用的抽象概念,它们都能够用来定义一种规范或者约束,但在使用时有着不同的特点和应用场景。

接口(Interface)接口定义了一组方法的签名,但不包含方法的实现。

一个类可以实现一个或多个接口,从而保证了这些方法在该类中都会被实现。

接口中的方法都是抽象的,而且只能包含常量和抽象方法。

接口是一种轻量级的抽象形式,用于描述类的行为,而不关心具体的实现细节。

抽象类(Abstract Class)抽象类本身无法被实例化,它包含了抽象方法以及普通方法。

抽象方法是没有具体实现的方法,必须在子类中被实现;而普通方法则可以有具体的实现。

抽象类可以包含属性、方法、构造函数等,其目的在于为其子类提供一个通用的模板或者骨架,以便于子类进行扩展或者重写。

二、接口与抽象类的区别1. 设计目的不同接口是用来描述类的行为或者能力,强调的是“做什么”的问题;而抽象类则是用来提供一个具体类的模板或者骨架,强调的是“怎么做”的问题。

2. 实现方式不同接口只能包含抽象方法和常量,而抽象类可以包含抽象方法、普通方法以及属性等。

一个类可以实现多个接口,但只能继承一个抽象类。

3. 灵活性不同由于一个类可以实现多个接口,因此接口提供了更大的灵活性;而抽象类在一定程度上限制了类的继承关系,因为Java是单继承的。

4. 扩展性不同抽象类可以包含成员变量和普通方法,可以为子类提供一些通用的方法或者属性;而接口只有抽象方法和常量,无法包含成员变量,因此扩展性相对较弱。

三、接口与抽象类的应用场景对比1. 接口的应用场景•当多个类具有相似的行为,但实现方式不同的时候,可以使用接口来定义这些行为;•当希望强制实现某些方法,但不关心具体实现时,可以使用接口;•当希望一个类实现多个不相关的行为时,可以使用接口来实现多继承的效果。

《接口抽象类》课件


01
接口抽象类的基本 概念
接口的定义与特点
01 接口是一种抽象类型,用于定义方法而不提供具 体实现。
02
接口的特点包括多态性、抽象性和继承性。
03 接口常用于定义一组相关方法的规范,以便不同 的类可以实现这些方法。
抽类的定义与特点
01
抽象类是一种不能被实例化的类,它只能作为其他类的基类。
02
接口抽象类的重要性
01
接口抽象类是面向对象编程中的一个重要概念,它有助于实现多态性、代码重 用和软件可维护性。
02
通过使用接口抽象类,我们可以将公共属性和方法放在一个抽象类中,避免代 码重复,同时让子类继承并实现这些方法,提高代码的可扩展性和可维护性。
03
接口抽象类还有助于隐藏实现细节,只暴露必要的接口,提高软件的安全性和 稳定性。
实现插件化架构
通过定义接口,可以构建可扩展 的插件化架构,使得第三方开发 者可以方便地开发插件来扩展系 统功能。
抽象类的应用场景
定义基类
抽象类可以作为其他类的基类,提供一些通 用的属性和方法,子类可以根据需要继承和 重写这些方法和属性。
强制子类实现某些方法
抽象类可以包含抽象方法,子类必须实现这些抽象 方法才能被实例化。这有助于强制子类遵循一定的 规范和标准。
封装共性行为
抽象类可以封装一组相关的属性和方法,这 些属性和方法可以被其子类继承和重写,从 而实现代码复用。
接口与抽象类的综合应用场景
构建层次化架构
通过将接口和抽象类结合使用,可以构建层次化的软件架构,使得不同层次的代码可以解耦,提高系统的可维护性和 可扩展性。
实现复杂的业务逻辑
在实现复杂的业务逻辑时,可以使用接口定义行为契约,使用抽象类封装共性行为,子类可以根据需要继承和实现这 些契约和行为。

抽象类和接口

抽象类和接口抽象类:抽象类是不完整的,并且它只能用作基类。

抽象类不能直接被实例化,并且对抽象类使用new运算符是编译时错误。

虽然一些变量和值在编译时的类型可以抽象的,但是这样的变量和值必须或者为null,或者含有对非抽象类的实例的引用。

抽象类里面允许含有非抽象成员。

但是抽象类不能被密封。

如果抽象类被密封了,那么抽象类也就失去了它的唯一的作用,因为抽象类不能被实例化,所以它的存在只能是被继承。

这又存在了一个继承的关系,抽象类里面有抽象方法,在继承的时候必须实现其父类的抽象方法,否则编译是不通过的。

当父类已有实际功能的方法时,既是非抽象方法。

该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法。

抽象类中可以有抽象方法,也可有非抽象方法,但是有抽象方法的类必须是抽象类。

抽象类只关心它的子类是否具备某种功能,并不关心其功能的具体实现,具体的行为由子类具体实现,也就是说,在定义抽象方法时,不用实现其具体实施。

接口接口的出现为继承为Java弥补了很大的缺陷,因为继承是单继承,而有时候则需要多继承,接口的出现为软件编程减少了很大的困难。

在接口里面可以定义常量,也可以定义方法,但是这些方法都必须是抽象的方法,接口里面不允许有具体的实现。

接口是一种规范,它的作用也是为了继承,没有继承就没有它的存在。

一个类可以实现多个接口,但是必须把接口里面的方法都实现。

接口中的方法,常量都必须是public修饰的,因为它是用来继承的。

如果不是public的话,这个接口就没有了存在的意义了。

抽象和接口的不同之处抽象类与接口紧密相关。

然接口又比抽象类更抽象:1)类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。

北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层2)抽象类当中可以存在非抽象的方法,可接口不能且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。

抽象类与接口


摄影师照相
Public class Photograher { public viod photograph(Photographable tool) { tool.takePhoto() } }
23
使用抽象类和接口的原则
用接口作为系统与外界交互的窗口。接口是最高层次的抽 象模型。 接口必须十分稳定。例如更改PCI插槽。 抽象类是介于“抽象”和“实现”之间的半成品。抽象类 力所能及地完成了部分实现,还有一些功能有待于子类去 实现。
面向对象的Java实现-抽象类、接口
为什么需要抽象类与抽象方法
在我们编写一个类的时候,可能会对一些类的方法进行定 义,但是并不具体实现。而是交给该类的子类根据自己的具体 情况去实现,这样可以增强类设计的灵活性。 如:定义了一个表示各种图形的类Shape,这个类有一些属 性,还有一个用于计算这个图形的周长的方法。但是,对于不 同的图形,对周长的计算方法不同,我们不能将所有的图形的 周长的计算方法都写到这个方法中。通过关键字abstract,我 们可以在父类中不实现这个方法,而将它的实现放到子类中去。 虽然周长可以用子类重写的方法来实现,但如果要求子类一 定要重写父类的这个方法时,如果程序员忘了重写,将会造成 运行上的错误。如果采用抽象类,则必须实现此方法才能创建 实例,因而就可避免上述错误。
Camera
DigitalCamera takePhoto() browsePhoto() editPhoto()
22
比较抽象类与接口-接口的优势(2)
摄影师用相机照相
Public class Photograher { public viod photograph(Camera tool) { tool.takePhoto() } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
System.out.println("接口中的默认方法"); } // 定义静态方法 static void show() {
System.out.println("接口中的类方法"); } // 定义内部类 class InnerClass { } // 定义内部接口 interface MyInnerInterface { } }
8.2.1 接口的定义
接口的定义
Java只支持单继承,不支持多重继承,即一个类只能继承一个父类,这一缺陷可以通过接口来弥补。Java 允许一个类实现多个接口,这样使程序更加灵活、易扩展。 和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的基本语法格式如下:
下面再介绍一个模板模式的示例,在这个示例的抽象父类中,父类的普通方法依赖于一个抽象方法,而 抽象方法则推迟到子类中提供实现。代码如下所示。
8.1.3 抽象类的作用
【代码8.3】CarSpeedMeterExample.java package com; abstract class SpeedMeter {
8.1.3 抽象类的作用
抽象类的作用
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行 扩展、改造,但子类总体上会大致保留抽象类的行为方式。
如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给子类实现,这就是 一种模板模式,模板模式也是十分常见且简单的设计模式之一。
private double turnRate;// 转速 public SpeedMeter() { } // 返回车轮半径的方法定义为抽象方法 public abstract double getRadius(); public void setTurnRate(double turnRate) {
8.1.2 抽象类的使用
【代码8.2】Triangle.java package com; public class Triangle extends Shape {
private double a; private double b; private double c; public Triangle(String color,
车速为:68.0公里/小时 下面是使用模板模式的一些简单规则。 (1)抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给其子类去实现。 (2)父类中可能包含需要调用的其他系列方法的方法,这些被调方法既可以由父类实现,也可以由其子类实 现。
第2节
p
a
r
t
接口
接口
本节概述
接口定义了某一批类所需要遵守的公共行为规范,只规定这批类必须提供的某些方法,而不提供任 何实现。接口体现的是规范和实现分离的设计哲学。让规范和实现分离正是接口的好处,让系统的个模 块之间面向接口耦合,是一种松耦合的设计,从而降低各模块之间的耦合,增强系统的可扩展性和可维 护性。
8.1.1 抽 象 类 的 定 义
【代码8.1】Shape.java package com; public abstract class Shape {
private String color; // 初始化块 {
System.out.println("执行抽象类中的初始化块"); } // 构造方法 public Shape() { } public Shape(String color) {
this.color = color; System.out.println("执行抽象类中的构造方法"); }
public String getColor() { return color;
} public void setColor(String color) {
this.color = color; } // 抽象方法 public abstract double area(); public abstract String getType(); }
8.1.1 抽 象 类 的 定 义
抽象类的定义
抽象类是对问题领域进行分析后得出的抽象概念,是对一批看上去不同,但是本质上相同的具体概念的 抽象。例如,定义一个动物类Animal,该类提供一个行动方法action(),但不同的动物的行动方式是不一 样的,如牛羊是跑的,鱼儿是游的,鸟儿是飞的,此时就可以将Animal类定义成抽象类,该类既能包含 action()方法,又无须提供其方法的具体实现。这种只有方法头,没有方法体的方法称为抽象方法。 定义抽象方法只需在普通方法上增加abstract修饰符,并把普通方法的方法体全部去掉,并在方法后增加分 号即可。 抽象类和抽象方法必须使用“abstract”关键字来修饰,其语法格式如下: 【访问符】abstract class 类名{
8.1.3 抽象类的作用
public class CarSpeedMeterExample extends SpeedMeter { @Override public double getRadius() { return 0.30; } public static void main(String[] args) { CarSpeedMeterExample csm = new CarSpeedMeterExample(); csm.setTurnRate(10); System.out.println("车速为:" + csm.getSpeed() + "公里/小时"); }
JAVA程序设计
第八章 抽象类、接口和枚举
本章学习目标: ●掌握抽象类的定义、应用和特点 ●掌握接口的定义、应用和特点 ●理解枚举类的定义和应用
第1节 抽象类
p
a
r
t
抽象类
本节概述
在定义类时,并不是所有的类都能够完整地描述该类的行为。在某些情况下,只知道应该包含怎样 的方法,但无法准确地知道如何实现这些方法时,可以使用抽象类。
(2)接口中定义的方法只能是抽象方法、默认方法和类方法。因此,如果是定义普通方法没有声明修饰 符,系统将自动增加“public abstract”进行修饰,即接口中定义的普通方法都是抽象方法,不能有方法体。
double a, double b, double c) { super(color); this.a = a; this.b = b; this.c = c;
} @Override public double area() {
@Override public String getType() { if (a >= b + c || b >= a + c || c >= a + b) { return "三边不能构成一个三角形"; } else return "三边能构成一个三角形"; } public static void main(String[] args) { Triangle t=new Triangle("RED",3,4,5); System.out.println(t.getType()); System.out.println("三角形面积为:"+t.area()); }
this.turnRate = turnRate; } // 定义计算速度的通用方法 public double getSpeed() {
// 速度(KM/H)=车轮周长*转速*3.6 return Math.round(3.6 * Math.PI * 2 * getRadius() * turnRate); } }
上述代码定义了两个抽象方法:area()和getType(),所以这个Shape类只能被定义为抽象类。虽然 Shape类包含了构造方法和初始化块,但不能直接通过构造方法创建对象,只有通过其子类实例化。
8.1.2 抽象类的使用
抽象类的使用
抽象类不能实例化,只能被当成父类来继承。从语义角度上讲,抽象类是从多个具有相同特征的类中抽 象出来的一个父类,具有更高层次的抽象,作为其子类的模板,从而避免子类设计的随意性。 下述代码定义一个三角形类,该类继承Shape类,并实现其抽象方法,以此示例抽象类的使用。代码如下所 示。
当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须 由子类提供实现(即重写)。而final修饰的类不能被继承,修饰的方法不能被重写,因此,final与 abstract不能同时使用。除此之外,static和abstract也不能同时使用,并且抽象方法不能定义为private 访问权限。
【访问符】abstract <返回值类型> 方法名( [参数列表] ); …
}
8.1.1 抽 象 类 的 定 义
有抽象方法的类只能被定义为抽象类,但抽象类中可以没有抽象方法。定义抽象类和抽象方法的规则如下: (1)abstract关键字放在class前,指明该类是抽象类。 (2)abstract关键字放在方法的返回值类型前,指明该方法是抽象方法。 (3)抽象类不能被实例化,即无法通过new关键字直接创建抽象类的实例。 (4)一个抽象类中可以有多个抽象方法,也可以有实例方法。 (5)抽象类可以包含成员变量、构造方法、初始化块、内部类、枚举类和方法等,但不能通过构造方法 创建实例,可在子类创建实例时调用。 (6)定义抽象类有三种情况:直接定义一个抽象类;继承一个抽象类,但没有完全实现父类包含的抽象 方法;实现一个接口,但没有完全实现接口中包含的抽象方法。 下述代码示例了抽象类和抽象上面程序定义了一个抽象类SpeedMeter(车速表),该类中定义了一个getSpeed()方法,该方法用于返回 当前车速,而getSpeed()方法依赖于getRadius()方法的返回值。对于该抽象类来说,无法确定车轮的半径, 因此getRadius()方法必须推迟到子类中来实现。在其子类CarSpeedMeterExample中,实现了父类的抽象方法, 既可以创建实例对象,也可以获得当前车速。程序运行结果如下:
相关文档
最新文档