文档章节

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

tcxu
 tcxu
发布于 2017/08/27 19:28
字数 1374
阅读 51
收藏 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

tcxu

粉丝 57
博文 5
码字总数 4487
作品 0
海淀
其他
私信 提问
JAVA接口的概念、分类及与抽象类的区别

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

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

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

Yamazaki
2014/04/25
0
0
java程序员基础进阶篇,万丈高楼平地起

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

启示录是真的
2018/05/26
0
0
13《Java核心技术》之接口和抽象类有什么区别?

一、提出问题 Java 是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则和技巧...

飞鱼说编程
2018/10/29
0
0
了解一下Java 8 (一)

2015年公司发展迅速,于是大量的时间花费在招聘上。招聘工程师,必然需要了解候选人的技术能力,尤其是对自己使用的技术的了解程度。优秀的工程师都需要知其然,也知其所以然,否则遇到技术难...

TalkingData
2016/01/20
1K
8

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Async I/O

序 本文主要研究一下flink的Async I/O 实例 // This example implements the asynchronous request and callback with Futures that have the// interface of Java 8's futures (which is t......

go4it
15分钟前
0
0
一文详解微服务架构的数据设计

微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。 本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮...

java菜分享
25分钟前
2
0
Java并发编程之美读书笔记-并发编程基础1

线程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,比如idea运行代码时的jvm是一个进程,但是CPU资源比较特殊,它是被分配到线程的,线程是进程的一个执行路...

hensemlee
38分钟前
1
0
【剑指offer纪念版】--10 进制1的个数

10. 题目 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 解题思路   把一个整数减去1,再和原整...

细节探索者
53分钟前
2
0
本科毕业平均年薪 30 万!经济寒冬挡不住 AI 人才的火热!

互联网行业遭遇寒冬,企业纷纷裁员缩招,而 BAT 和硅谷明星公司对 AI 人才的投入却并不见放缓。为争夺相关人才,给应届毕业生开出的平均年薪高达 30 万。 而 TensorFlow 作为当下最流行的深度...

AI女神
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部