文档章节

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

tcxu
 tcxu
发布于 2017/08/27 19:28
字数 1374
阅读 25
收藏 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
粉丝 39
博文 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...

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

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

启示录是真的
05/26
0
0
java一些基础问题(听说是java应聘者老被问的问题!)

1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × priv...

独钓渔
2013/07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
22分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
34分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
51分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
51分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部