1、抽象函数的语法特征
2、抽象类的语法特征
3、抽象类的作用

抽象函数

只有函数的定义,没有函数体的函数被称为抽象函数;

abstract void func();

  

抽象类

使用abstract定义的类称为抽象类。

abstract class Person{}

  

注意:
1、抽象类不能够生成对象;
2、如果一个类当中包含有抽象函数,那么这个类必须被声明为抽象类。
3、如果一个类当中没有抽象函数,这个类也可以被声明为抽象类。

下面来用一个例子说明下:

Person.java:

abstract class Person{
String name;
int age; void intruduce(){
System.out.println("My name is" + name + ",my age is " + age);
}
abstract void eat(); }

  

Chinese.java
class Chinese extends Person{
void eat(){
System.out.println("use chopsticks.");
}
}

  

Test.java:

public class Test{
public static void main(String[] args){
Person p = new Chinese();
p.eat(); }
}

  

输出结果:

PS C:\Users\admin\Desktop\java_code\练习八> java Test
use chopsticks.

  

抽象类可以有构造函数

Person.java

abstract class Person{
String name;
int age;
Person(){
System.out.println("Person");
}
void intruduce(){
System.out.println("My name is" + name + ",my age is " + age);
}
abstract void eat(); }

  

Chinese.java

class Chinese extends Person{
Chinese(){
System.out.println("Chinese");
}
void eat(){
System.out.println("use chopsticks.");
}
}

  

输出结果:

PS C:\Users\admin\Desktop\java_code\练习八> java Test
Person
Chinese
use chopsticks.

  

这是因为会自动加上super();

class Chinese extends Person{
Chinese(){
super();
System.out.println("Chinese");
}
void eat(){
System.out.println("use chopsticks.");
}
}

  

那么为什么要使用抽象类呢?

可以使语义和语法的错误达成统一。

class Printer{
void open(){
System.out.println("open");
}
void close(){
System.out.println("close");
}
void print(){
} }

  

class HPPrinter extends Printer{
void print(){
System.out.println("Using HPPrinter.");
} }

  

class CanonPrinter extends Printer{
void print(){
System.out.println("Using CanonPrinter.");
}
}

  

PS D:\Java\code\练习七> java Test
open
Using HPPrinter.
close
open
Using CanonPrinter.
close

  

这样写是没问题的,但是如果开发者不是一个人的话,那么就会产生一个问题,在子类中没有复写函数的话,编译器并不会报错。因此修改

abstract class Printer{
void open(){
System.out.println("open");
}
void close(){
System.out.println("close");
}
abstract void print(); }

  

  

如果子类中没有复写函数的话,就会报如下的错误:

PS D:\Java\code\练习七> javac .\Test.java
.\HPPrinter.java:1: 错误: HPPrinter不是抽象的, 并且未覆盖Printer中的抽象方法print()
class HPPrinter extends Printer{
^
1 个错误

  

java基础(十一)之抽象类和抽象函数的更多相关文章

  1. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  2. Java基础十一--多态

    Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...

  3. Java 基础 面向对象和抽象类

    面向对象变量 局部变量和成员变量区别 区别一:定义的位置不同 定义在类中的变量是成员变量 定义在方法中或者{}语句里面的变量是局部变量 区别二:在内存中的位置不同 成员变量存储在对内存的对象中 局部变 ...

  4. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  5. 【java基础 16】抽象类和接口的区别

    导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从java8开始的,我还特地给测了一下java7. 没过几天,就有一个技术分享会,刚好也是讲java8 ...

  6. Java基础接口和抽象类区别(二)

    抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为: 抽象方法必须用abstract关键字进行修饰.如果一个类含有抽象方法,则 ...

  7. 十、Java基础---------面向对象之抽象类与接口

    抽象类(abstract)     当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...

  8. Java基础系列--06_抽象类与接口概述

    抽象类 (1)如果多个类中存在相同的方法声明,而方法体不一样,我们就可以只提取方法声明. 如果一个方法只有方法声明,没有方法体,那么这个方法必须用抽象修饰. 而一个类中如果有抽象方法,这个类必须定义为 ...

  9. Java基础--接口和抽象类的区别

    任何不谈使用方法的空理论都是耍流氓 使用场景 · 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧(Java1.8中接口也可以这么做了) · 如果你想实现多重继承,那么你必须使用接口 ...

随机推荐

  1. C# Dynamic与Newtonsoft.Json的应用

    C#中Dynamic关键字 dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能. 什么是"动态"? 编程语言有时可以划分为静态类型化语言和动态类型化语言. ...

  2. jQuery---突出展示案例

    突出展示案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  3. 假期学习【十一】Python爬取百度词条写入csv格式 python 2020.2.10

    今天主要完成了根据爬取的txt文档,从百度分类从信息科学类爬取百度词条信息,并写入CSV格式文件. txt格式文件如图: 为自己爬取内容分词后的结果. 代码如下: import requests fr ...

  4. C语言 continue

    C语言 continue 在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句. 案例 #include<stdio.h> int main() { ...

  5. pdo一次插入多条数据的2种实现方式

    pdo一次插入多条数据的2种实现方式: **** 1.一个sql插入多个值,防注入处理放在获取到值的时候使用htmlspecialchars(addslashes($params )); try{ f ...

  6. SpringBoot整合WEB开发--(七)注册拦截器

    1.创建一个拦截器类实现HandlerInterceptor接口,重写其中的3个方法,这拦截器中方法的执行顺序为:preHandle--Controller--postHandle--afterCom ...

  7. error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间 -- 原因可能是参数错误或者自定义函数名和库函数名冲突

    今天运行程序的时候遇到了下面这个bug > B1020.cpp >e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(): erro ...

  8. python os 模块详解

    os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcwd:得 ...

  9. 一看就会一做就废系列:说说 RECOVER DATABASE(下)

    这里是:一看就会,一做就废系列 数据库演示版本为 19.3 (12.2.0.3) 该系列涉及恢复过程中使用的 个语句: 1. recover database 2. recover database ...

  10. 如何去官网上下载tomcat的linux版本

    1.首先进入官网,进入如下位置 2.进入bin文件夹中下载: 原文链接:https://blog.csdn.net/zdb292034/article/details/82433072