一、抽象类基本概念

1.1 抽象类

抽象类:是指在普通类的结构里增加抽象方法的组成部分,抽象类要使用 abstract 声明。

抽象方法:没有方法体且必须使用 abstract 关键字进行定义。

拥有抽象方法的类一定是抽象类。

抽象类的使用原则如下:

  • 抽象类必须有子类,即每一个抽象类一定要被子类所继承;
  • 抽象类的子类(子类不是抽象类)必须要覆写抽象类里的抽象方法;
  • 抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理。

范例:正确使用抽象类

abstract class A{
public void print(){
System.out.println("A、print()");
}
public abstract void fun();
}
class B extends A{
public void fun(){
System.out.println("B、fun()");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B();
a.fun();
}
}

1.2 总结

1、抽象类继承子类里会有明确的方法覆写要求,而普通类没有;

2、抽象类只比普通类多了一些抽象方法的定义,其他的组成部分和普通类完全一样;

3、普通类对象可以直接实例化,但是抽象类必须经过向上转型后才能实例化。

虽然一个子类可以去继承任何一个普通类,但是从开发的实际要求来讲,普通类不要去继承另外一个普通类,只能继承抽象类 或 接口。

二、抽象类的相关限制

1、抽象类中有构造方法吗?

有。抽象类会存在一些属性,那么在抽象类之中一定会存在构造方法,目的:为属性初始化,并且子类对象实例化的时候依然满足于先执行父类构造,再调用子类构造的情况。

2、抽象类能使用 final 定义吗?

不能。因为 final 定义的类不能被继承,而抽象类必须有子类,所以不能。

3、抽象类能用 static 定义吗?

外部抽象类不允许使用 static 声明,而内部的抽象类可以使用 static 声明。

使用 static 声明的内部类就相当于是一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。

4、抽象类能否有 static 修饰的方法,此类是否需要被继承?

任何情况下,如果要执行类中的 static 方法的时候,都可以在没有对象的时候直接调用,对于抽象类也是一样。

此时可以没有子类。

5、有些时候,由于抽象类只需要一个特定的系统子类操作,所以可以忽略掉外部子类。

abstract class A{
public abstract void print();
private class B extends A{
public void print(){
System.out.println("Hello World!");
}
}
public static A getInstance(){
return new B();
}
}
public class TestDemo{
public static void main(String args[]){
A a = A.getInstance();
a.print();
}
}

这样的设计在系统类库之中会比较常见,目的是为用户隐藏不需要知道的子类。

对于之前有一个遗留的问题,那么下面看一段代码,分析代码的执行结果:

abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A{
private int num = 100;
public B(int num){
this.num = num;
}
public void print(){
System.out.println("num = " + this.num);
}
}
public class TestDemo{
public static void main(String[] args){
new B(30);
new B(30).print();
}
}

执行结果:num = 0 和 num = 0 、 num = 30。

分析:在任何一个类的构造执行完之前所有属性的内容都是其对应数据类型的默认值,而子类构造执行之前一定先执行父类构造,那么此时子类构造没有执行完,所以 num 为 0

三、抽象类应用——模板设计

例如,现在有三类事物:

  • 机器人:充电、工作;
  • 人:吃饭、工作、睡觉;
  • 猪:吃饭、睡觉。

要求可以实现以上的操作控制,即可以任意的控制人、机器人、猪的操作行为(吃、工作、睡觉)。

【分析】

**这三类事物有一个共通的表现:行为。**具备相同的行为。

行为是抽象的概念,可以通过 abstract 描述。

abstract class Action{
public static final int EAT = 1;
public static final int WORK = 5;
public static final int SLEEP = 7;
abstract void eat();
abstract void work();
abstract void sleep(); public void command(int flag){
switch(flag){
case EAT:
this.eat();
break;
case WORK:
this.work();
break;
case SLEEP:
this.sleep();
break;
case EAT + WORK:
this.eat();
this.work();
break;
}
}
} class Robot extends Action{
public void eat(){
System.out.println("机器人在充电。");
}
public void work(){
System.out.println("机器人在工作。");
}
public void sleep(){}
} class Human extends Action{
public void eat(){
System.out.println("人在吃饭。");
}
public void work(){
System.out.println("人在工作。");
}
public void sleep(){
System.out.println("人在睡觉。");
}
} class Pig extends Action{
public void eat(){
System.out.println("猪在吃饭。");
}
public void work(){
}
public void sleep(){
System.out.println("猪在睡觉。");
}
} public class TestDemo{
public static void main(String args[]){
fun(new Robot());
fun(new Human());
fun(new Pig());
} public static void fun(Action action){
action.command(Action.EAT);
action.command(Action.WORK);
action.command(Action.SLEEP);
}
}

这些不同的类型最终都在行为上成功的进行了抽象,即如果要想使用行为操作,那么就必须按照Action类的标准来实现子类。

模板设计思路:基类提供多个抽象方法和1个公共的普通方法,这个公共的普通方法会根据用户发出的请求不同,调用不同的抽象方法功能(并且每个子类有不同的实现)。

四、总结

1、如果要使用类继承,那么就使用抽象类(20%的情况下可能这样使用);

2、抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相配合;

3、不管抽象类如何努力都有一个天生最大的问题:单继承局限。

【11】java之抽象类的更多相关文章

  1. JAVA:抽象类VS接口

    JAVA中抽象类和接口的区别比较,以及它们各自的用途. 1.JAVA抽象类: 抽象类除了不能实例化以外,跟普通类没有任何区别.在<JAVA编程思想>一书中,将抽象类定义为“包含抽象方法的类 ...

  2. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  3. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

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

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

  5. java中抽象类的定义和使用

    java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础. 指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类 ...

  6. Java基础-抽象类和接口

    抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...

  7. JAVA的抽象类和接口

    抽象类 在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对 ...

  8. 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-

    1.0.0 Summary Tittle:[Java]-NO.11.Java.1.Log4j.1.001-[Log4j2 Manual]- Style:Java Series:Log4j Since: ...

  9. Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用

    ylbtech-Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用 1.返回顶部 1. Java 实例 - enum 和 switch 语句 ...

  10. Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素

    ylbtech-Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素 1.返回顶部 1. Java 实例 - 删除数组元素  Java 实例 以下实例演示了如何使用 ...

随机推荐

  1. ClickHouse数据副本引擎

    我的gitee地址:https://gitee.com/ddxygq/bigdata-technical-pai ,相关文章都放到这个仓库里了. 只有 MergeTree 系列里的表可支持副本: Re ...

  2. 洛谷P1605例题分析

    迷宫 题目描述 给定一个 \(N \times M\) 方格的迷宫,迷宫里有 \(T\) 处障碍,障碍处不可通过. 在迷宫中移动有上下左右四种方式,每次只能移动一个方格.数据保证起点上没有障碍. 给定 ...

  3. 4、PageHelper分页查询

    1.MyBatis的分页方式: 逻辑分页与物理分页 1.逻辑分页:使用MyBatis自带的RowBounds进行分页,是一次性查询很多数据,然后再在结果中检索分页的数据.这样做弊端是需要消耗大量的内存 ...

  4. 记一个难以发现的 UB

    观察以下代码: vector<int> X, Y, A, val; inline int ls(int p) { return p << 1; } inline int rs( ...

  5. Mac对文件夹加密

    一.打开磁盘工具 电脑左上角文件->新建映像->基于文件夹新建映像->选择相对应的文件夹,进行aes加密->输入加密密码 然后保存文件就好了

  6. C#11新特性整理

    假期中有时间,整理了C#11的各个新特性,简单分享给大家. 一.使用VSCode新建一个.NET7.0的Console工程 <Project Sdk="Microsoft.NET.Sd ...

  7. 最好用的在线图片压缩工具——TinyPNG

    前言 不知道大家在写博客或者工作时有没有这种烦恼呢?想要上传某张图片,但却因为图片文件过大而导致无法上传.这时你可能会去百度搜索关于图片压缩的软件,但往往下载的软件都是那种"垃圾软件&quo ...

  8. Java基础学习笔记-运算符ヽ( ̄▽ ̄)و

    运算符 运算符-按功能分为7种 1.赋值运算符 广义赋值运算符 +=, -=, *=, /=, %=, &=, |= 一般形式:变量名 运算符=表达式 两侧的类型不一致会进行 自动类型转换 和 ...

  9. JS原生上传文件,读取文件格式,控制文件只可以上传某些格式,并使用fileReader转换格式

    本文为代码片段记录,方便后期使用哇! <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  10. 《Terraform 101 从入门到实践》 第三章 Modules模块化

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 模块的概念 模块化是Terr ...