在面向父类编程的过程中,抽象出来的父类具有一般化特质。父类函数只是一个抽象化的概念,只是为了在面向对象编程时统一接口服务。

example:

有时父类会定义出一些无法实现的行为:

public void call(People people){

peole.speak();

}

此函数面向父类People设计,适合所有的人类使用,但是People的子类没有被定义,People中的speak也无法具体实现。此段代码是一段通用的代码,不能等待所有子类设计完成之后再设计call函数。所以系统需要提供一种机制来定义一种不用实现的函数,这种函数称为抽象函数。

public abstract class People{ //抽象类

public abstract void speak();  //抽象函数

}

抽象函数使用abstract关键字修饰,表达了一种不完整的概念。

只有在子类实现了其中的抽象函数后,构成了一个完整的、具体的类型之后,才能使用。

public class Chinese extends People{

public void speak(){

System.out.println("中国话");

}

public static void main(String[] args){

People people = new Chinese();

people.speak();

}

}

attention:一个抽象类中,至少有一个以上的抽象函数,其中可以混合定义具体的函数。

一个类中如果没有任何抽象元素,它也可以被定义为一个抽象类型。这表示设计者不希望用户直接实例化它,只希望通过子类来实现具体的应用。

对于父类不能完全确定的实现函数,可以使用空实现体。但不建议这样做,因为调用后的执行结果什么也没有,客户可能会觉得困惑。

使用抛出异常来表示此方法没有实现:

public class People{

public void speak() throws IllegalAccessException{

throw new IllegalAccessException("没有实现,不可访问");

}

}

当用户调用此函数,系统会抛出一个异常,这样比一个空实现更友好。

总结:

(1)抽象类可以有构造方法,普通成员变量,非抽象的普通方法,静态方法,静态成员变量。

(2)抽象类中的抽象方法的访问类型可以是public、protected和默认类型。抽象类只能继承一个类。

example:

描述一个简单的树状结构:

import java.util.ArrayList;

import java.util.List;

public abstract class Node{

protected String name;

protected int data;

public abstract Node add(Node child);

}

class ConcreteNode extends Node{

private List<Node>children = new ArrayList<Node>();

public ConcreteNode(String name,int data){

this.name = name;

this.data = data;

}

public Node add(Node child){

children.add(child);

return this;

}

public static void main(Stringp[] args){

Node root = new ConcreteNode("root",0);

Node first = new ConcreteNode("first",0);

root.add(first).add(new ConcreteNode("second",2));

first.add(new ConcreteNode("third",3)).add(new ConcreteNode("fourth",4));

}

}

最新文章

  1. CPU阿甘之烦恼
  2. hdu1532网络流
  3. win7系统下,vs2010一调式,vs就关闭要重启
  4. 【9-6】Centos学习笔记
  5. wifi使用的一些误区
  6. dedecms 按照栏目指定的id排序
  7. CODESOFT中怎样打印数据库中的特定数据?
  8. 在浏览器控制台调试php程序
  9. [置顶] 大量相关gis资源网盘打包下载
  10. Python数据结构-元祖
  11. powerdesinger(MSSQLSRV2008测试通过)通过Name或comment 导出注释到sql脚本,生成sql的说明备注,包括表注释信息
  12. 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
  13. Python小代码_10_判断是否为素数
  14. Linux远程登录ssh免密码配置方法(仅供参考)
  15. vsftp搭建文档
  16. 什么是软件开发工具包(SDK)
  17. PHP 数据运算类型都有哪些?
  18. navigator 判断移动端是Android还是iOS
  19. JS DOM操作(三) Window.docunment对象——操作属性
  20. Object对象常用方法总结

热门文章

  1. cms-框架搭建
  2. linux 命令——21 find(转)
  3. Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
  4. python_31_集合
  5. 基于纹理内存的CUDA热传导模拟
  6. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第十节
  7. 委托、事件与Observer设计模式
  8. 关于Star UML
  9. C++ 无限定名称查找
  10. SunmmerVocation_Learning--Java数组的创建