Java学习4之抽象类

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

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

}

}

时间: 2024-08-12 08:07:38

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

Java学习(十三):抽象类和接口的区别,各自的优缺点

Java抽象类和接口的区别点 1.接口只能含有抽象的方法,抽象类中可以包含部分的实现方法. 2.接口只能定义静态常量,默认为public static final,并且需要显示初始化.抽象类中可以定义普通的成员变量. 3.接口不能含构造方法,抽象类可以有自己的构造方法(被继承使用). 4.接口和抽象类都无法被实例化. 5.一个类可以实现多个接口,只能继承一个抽象类(只能继承一个类,单继承) 6.一个类实现接口时需要实现所有的方法.继承一个抽象类的时候需要实现所有抽象方法,否则同样需要声明为抽象类

Java学习笔记之方法重载,动态方法调度和抽象类

一.方法重载 如果子类中的方法与它的超类中的方法有相同的方法名,则称子类中的方法重载超类中的方法,特别是当超类和子类中的方法名和参数类型都相同时,在子类中调用该方法时,超类中的方法会被隐藏.考虑下面程序: 1 class A 2 { 3 int i, j; 4 A(int a, int b) 5 { 6 i = a; 7 j = b; 8 } 9 10 // display i and j 11 void show() 12 { 13 System.out.println("i and j: &

2016最新Java学习计划

一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 学完后目标: 1.可进行小型应用程序开发 2.对数据库进行基本的增删改查管理 市场价值:¥5000 计算机基础知识 计算机基础.DOS常用命令.Java概述.JDK环境安装配置.环境变量配置.Java程序入门 1.2015年Java基础视频-深入浅出精华版(强烈推荐) 2.历经5年锤炼(适合初学者入

Java学习轨迹【面向对象】(持续更新)

其中部分内容为其他博主所作,侵删 6月12日-7月每日更新 Java学习轨迹 一.面向对象 类和对象 1. new关键字所完成的事情 1)为对象开辟了新的内存空间 2)调用类的构造方法 3)返回生成对象的地址 Dog dog=new Dog(); dog是引用,new Dog()生成了一个Dog对象,引用dog指向所生成对象的地址 2.构造方法 1)构造方法必须与类名相同 2)构造方法没有返回值[且不能使用void作返回值] 3)如果在定义类的时候没有为类声明构造方法java编译器会自动为类添加

Java学习之InputStream中read()与read(byte[] b)

Java学习之InputStream中read()与read(byte[] b) 这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() :  从输入流中读取数据的下一个字节,返回0到255范围内的int字节值.如果因为已经到达流末尾而没有可用的字节,则返回-1.在输入数据可用.检测到流末尾或者抛出异常前,此方法一直阻塞. read(byte[] b) :  从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中.以整数形式返回

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

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.

java学习笔记8--接口总结

接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note8.html,转载请注明源地址. 生活中的接口: 什么是接口? 一个Java接口是一些方法特

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

java学习笔记(三)java中的修饰符abstract、static与final

一.四种访问级别的访问范围 访问级别 访问修饰符 同类 同包 子类 不同的包 公开 public 受保护 protected 默认 没有访问修饰符 私有的 private 二.使用abstract修饰符需要遵守的语法规则 1.抽象类中可以没有抽象方法,但是包含抽象方法的类必须定义为抽象类,即用abstract修饰: 2.抽象类跟抽象方法不能被final修饰符修饰: 3.抽象类中可以有非抽象方法,因为继承抽象类的子类必须重写父类中所有的抽象方法,因此抽象类中不能有抽象构造方法和抽象静态方法: 4.