文档章节

Java的抽象类 和 它的极致情况:接口

tcxu
 tcxu
发布于 2017/08/27 19:28
字数 1374
阅读 32
收藏 0

抽象,就是从许多具体事物中舍弃个别的、特殊的属性,抽出共同的、本质的属性。

抽象类 定义任何类,若在关键词class 之前加上修饰符 abstract,它就成了抽象类。抽象类不允许被实例化。就是说,在任何一个能实例化的类的定义前,放上关键字 abstract ,给定类就被看作是抽象类,进而不能实例化。显然,这种抽象类中是没有抽象的方法。常见的情况是,在定义一个类的时候, 一旦出现了抽象方法,这个类就是抽象的, 必须在关键字class之前放上修饰符 abstract ,否则会有编译错误。

抽象方法 的产生:抽象类Person中的方法吃饭 havingDinner(),就是从许多种人中舍弃个别的、具体的操作(如用筷子吃饭, 用刀叉吃饭, 或用手抓着吃饭),抽出共同的、本质的操作:吃饭, 产生了抽象方法 havingDinner()。 做法是,忽略方法体(即不包括一对花括号和其中的代码块)而仅给出方法的签名。就是说,只有方法的特征没有方法的实现,以构成抽象方法。

//因为有一个抽象方法:吃饭, 所以是抽象类
abstract class Person { 
	protected String name;
	public Person(String name){
	this.name=name;
 	}
/* 这里,不同人吃饭方法不一样,没有统一定义,
 * 这时,只能在方法签名之前冠以关键字 abstract
 */
	abstract String havingDinner();
}

class Chinese extends Person{ // 具体定义中国人
	public Chinese(String name){
		super(name);
	}
	public String havingDinner(){ //中国人吃饭具体化
		return name + "用筷子吃饭。";
	}
}
class American extends Person{ // 具体定义美国人
	public American(String name){
		super(name);
	}
	public String havingDinner(){ //美国人吃饭具体化
		return name + "用刀叉吃饭。";
	}
}
class Indian extends Person{ //具体定义印度人
	public Indian(String name){
		super(name);
	}
	public String havingDinner(){ //印度人吃饭具体化
		return name + "用手抓着吃饭。";
	}
}

public class AbstractTest {
	public static void main(String args[]){
	Person p[]=new Person[3];
	p[0] = new Chinese("李明");
	p[1] = new American("特朗普");
	p[2] = new Indian("桑贾伊·甘地");
	for (Person r: p)
	System.out.println(r.havingDinner());
	}
}

输出:

李明用筷子吃饭。
特朗普用刀叉吃饭。
桑贾伊·甘地用手抓着吃饭。

 

抽象方法不能被调用。它必须通过实现, 有了方法体,才可以被调用的方法。因此, 定义中国人,美国人,和 印度人的时候,继承了 抽象类 Person, 并且分别具体定义了各自吃饭的方法。这样,才可以创建对应的实体, 并调用各自的吃饭方法(函数)。

可见, 抽象方法,抽象类和接口是Java语言对抽象类概念支持的机制,显示强大的面向对象程序设计能力。

接口      如果,一个抽象类中的方法,全部是抽象的,同时,数据成员全部都是最终变量,那么,这个抽象类就成了接口,可以被其它类实现。

抽象方法必须在抽象类或接口之中。抽象类是用来被类继承的。接口是用来被类实现的。Java 允许一个类只能继承另一个类(单继承),但允许一个类同时实现多个接口。

如果子类是非抽象的,即能够产生对象的类,那么它就必须实现父类中所有的抽象方法。 否则,它仍然是抽象类,因为它所继承的方法中,仍有抽象的方法。

一旦一个类中有了抽象方法,所在类就是抽象的,类的定义前必须放上修饰符 abstract ,否则会有编译错误。

Java接口(interface), 是抽象类的极端情况,JDK1.7 及以前版本的规定,它只有抽象方法,  就是说,仅有方法的签名,没有方法的实现,为的是让这些方法今后可以在不同地点被不同的类实现。 而JDK1.8添了新规:接口还可以有默认的 和/或 静态的方法。

在Java接口(interface)中 可以定义属性/字段, 但它们必须是常量/最终变量。

如下例, PI 值在抽象类 abstract TwoD中可以定义为变量,但若要在接口 interface ThreeD 里, PI值必须定义为常量。

一个普通的类要继承(extends)抽象类,和/或者 实现(implements) 接口,就必须完成所有抽象方法的方法体的定义。广义讲,都是“父子”(传承)关系。

最后的例子显示,圆柱体类 (class  Cylinder )如何 继承 抽象类 ( abstract class TwoD), 并 实现 接口(interface ThreeD),从而成为一个可以生成实体的普通类。

abstract class TwoD {
	double PI=3.14; //若在接口中出现,必须定义为最终变量,即常量
	abstract double area();
	abstract String dimension();
}
interface ThreeD {
	double volume();
	String dimension();
}

class Cylinder extends TwoD implements ThreeD {
	int radius;
	int height;
	public Cylinder (int r, int h){
		this.radius=r;
		this.height=h;	
	}
	public double volume(){
		return PI*radius*radius*height;
	}
	public double area(){
		return 2*radius*PI*(height+radius);
	}
	public String dimension(){
		return "三维物体";
	}
	
	public String toString(){
		String s= dimension();
		s += "\n圆柱体 半径:" + radius;
		s += ", 高: " + height;
		s += "\n体积: " + volume();
		s += ", 表面积: " + area();
		return s;
	}
}
public class InterfaceAbstractClass {
	public static void main(String args[]){
	Cylinder c = new Cylinder(2,1);
	System.out.println(c.toString());
	}
}

输出:

三维物体
圆柱体 半径:2, 高: 1
体积: 12.56, 表面积: 37.68

© 著作权归作者所有

共有 人打赏支持
tcxu
粉丝 47
博文 4
码字总数 4229
作品 0
海淀
其他
JAVA接口的概念、分类及与抽象类的区别

Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(...

郭二翔
2011/12/17
0
0
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0
云妹总结了一些最最最常见的Java面试题供大家参考

云妹导读:String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性 String类中使用字符数组:private final cha...

阿里云科技快讯
08/17
0
0
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的
05/26
0
0
深入理解Java中的抽象类和接口

对于面向对象编程来说,抽象是它的一大特征。在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口。这两者有太多向内的地方,又有太多不同的地方。很多人在初学的时候以为它们可以随意...

FunGa
2015/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS 最强鼠标改键软件:BetterAndBetter

官网: http://www.better365.cn 话不多说,先上你们最喜欢的软件界面截图。 通用: 触摸板: 鼠标: 键盘: 情景模式: 文本跳窗(自动跳窗): 四角触发: 工具箱: 脚本: 关于: 说下我目...

故国有明
41分钟前
16
0
Hbase Schema 模型设计注意事项及示例

一、Hbase 数据模型概述 HBase的数据模型也是由表组成,每一张表里也有数据行和列,但是在HBase数据库中的行和列又和关系型数据库的稍有不同。 表(Table): HBase会将数据组织成一张表,表名必...

PeakFang-BOK
今天
6
0
Blockathon(2018)上海竞赛项目成果今天揭晓

开幕式现场 10月19日,Blockathon(2018)上海在黄浦区P2联合创业办公社举行,本次活动由50名区块链开发者组成9支参赛队伍,来自国内外优秀区块链开发团队的20名技术专家担任导师及裁判。9支队...

HiBlock
今天
6
0
微信小程序开发系列六:微信框架API的调用

微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发...

JerryWang_SAP
今天
13
0
5 个用 Python 编写 web 爬虫的方法

大家在读爬虫系列的帖子时常常问我怎样写出不阻塞的爬虫,这很难,但可行。通过实现一些小策略可以让你的网页爬虫活得更久。那么今天我就将和大家讨论这方面的话题。 我刚整理了一套2018最新...

糖宝lsh
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部