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

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));

}

}

Java学习4之抽象类的更多相关文章

  1. java学习面向对象之抽象类

    什么是抽象类,之所以说抽象就是具体的反义词喽~抽象离我们最近的距离也就是初中的时候学过的美术课,抽象画派.拿一桶画彩就这么往画布上一泼,那就是抽象.那么java世界当中什么是抽象呢?我们再拿动物还有狗 ...

  2. Java学习日记-7 抽象类和接口

    一.抽象类 abstract修饰:类和类中的方法 抽象方法:abstract type name(parameter-list);(abstract不能修饰static方法和构造函数) 引用:抽象类有 ...

  3. Java学习笔记之抽象类与接口

    抽象类(abstract) 抽象类概述:一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现 抽象方法:   一个方法被abstract修饰表示这个方法是抽象方法 ...

  4. 0026 Java学习笔记-面向对象-抽象类、接口

    抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...

  5. [ Java学习基础 ] Java的抽象类与接口

    一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...

  6. Java 学习(13):抽象类& 抽象方法& 封装

    目录 --- 抽象类 --- 封装 抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的 ...

  7. Java学习笔记之---比较接口与抽象类

    Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...

  8. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  9. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. http请求各种数据的接受

    一.接受请求的http数据 1.接受客户请求的数据,例如xml数据格式,代码如下: 此代码相当于服务端 public String analyzeWeixinXMLStr(HttpServletReq ...

  2. HDU 1009 FatMouse' Trade肥老鼠的交易(AC代码) 贪心法

    题意: 一只老鼠用猫粮来换豆子,每个房间的兑换率不同,所以得尽量从兑换率高的房间先兑换.肥老鼠准备M磅猫粮去跟猫交易,让猫在warehouse中帮他指路,以找到好吃的.warehouse有N个房间,第 ...

  3. draggable与overflow同时存在,无法拖拽出父元素问题解决

    在使用jquery-ui的拖拽功能对列表内的选项拖拽时,发现无法将选项拖拽出列表的范围,一出范围就自动隐藏在列表下,查找到最后的原因是css中的overflow的原因,overflow存在则不能将选项 ...

  4. TFS看板规则

    就绪板列 准入条件 需求已完成交付 需求交付过程中的问题已全部解决 当前迭代需求所产生的BUG必须放入该列 之前迭代遗留的BUG 工作内容 需求实现概要设计 BUG确认 任务拆分 任务工作量估算(单位 ...

  5. 忽略mysql库的同步

    忽略mysql库的同步,请使用: stop slave sql_thread; change replication filter replicate_ignore_db=(mysql);

  6. POJ-3436 ACM Computer Factory---最大流+拆点

    题目链接: https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑有p个组成部分,有n个工厂加工电脑.每个工厂对于进入工厂的半成品的每个组成部分都有要求,由p个数 ...

  7. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...

  8. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

  9. C语言exp()函数:e的次幂函数(以e为底的x次方值)

    头文件:#include <math.h> exp()用来计算以e 为底的x 次方值,即ex 值,然后将结果返回.其原型为:    double exp(double x); [返回值]返 ...

  10. solr 近实时搜索

    摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...