一、抽象类基本概念

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. Django项目启动 AttributeError: ‘str‘ object has no attribute ‘decode‘ 问题

    Watching for file changes with StatReloader Performing system checks... System check identified no i ...

  2. 外包公司中的"炼狱",极度摧残,避免踩坑。

    引言 前些天羊了,一直没有更新.今天给大家聊聊两家外包公司,遇到的小伙伴避免踩坑. 咱不说那些虚的,什么尽量不要去外包公司,尽可能找甲方,这些谁都知道,肯定是因为一些原因(比如学历.项目经验.技术有待 ...

  3. 基于Chromium开发的称重软件,集称重、计价、打印于一体,支持耀华、顶尖等多个厂家设备型号

    技术方案: 1.运行时使用.Net Framework4.6框架,界面使用WPF与Chromium. 2.上位机与下位机使用串口对接每家设备协议,上位机与UI使用WebSocket通讯. 3.数据库使 ...

  4. java代码的基本组成

    我们可以通过上一篇博客写的内容来分析java代码的组成 java代码的组成我们可以大致分成4个部分 一.标识符 除了关键字(有颜色的,可以看到上方图片)以外,自己们写的单词(黑色部分的),如MyJav ...

  5. ffmpeg第8篇:使用ffprobe采集文件信息

    1. 前言 ffprobe是ffmpeg的其中一个模块,主要用于查看文件信息,咱们知道一个MP4文件其实不仅仅包含了音视频数据,还有如元数据等其它信息,但是实际上咱们关心的往往是音视频数据部分,今天来 ...

  6. 腾讯微信开源数据库PhxSQL简单部署记录

    1.建立文件夹与互信关系 [root@mysql-100 ~]# mkdir -p /app/soft/phxsql [root@mysql-100 phxsql]# ssh-keygen -t rs ...

  7. Hugging Face 2023 实习生招募计划

    Hugging Face 2023 实习生招募计划 想参与到 <王婆卖瓜>「最酷的 AI 社区」</王婆卖瓜>,共同构建未来吗?今天,我们为大家分享 Hugging Face ...

  8. 重磅!瞄准 Web 3.0,谷歌云推出专为区块链服务的 Blockchain Node Engine!

    [本文由Cloud Ace整理发布,谷歌云服务请访问Cloud Ace 官网] 区块链技术正在为世界各地的消费者和企业带来巨大的创新和价值创造.随着技术变得越来越主流,公司需要可扩展.安全和可持续的基 ...

  9. Vue3+TypeScript 项目中,配置 ESLint 和 Prettier

    接上篇:从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios 文档同步项目gitee:https://gitee.com/lixin_ajax/vue3-v ...

  10. linux/windows解决/关闭端口占用

    Linux 找到占用端口的进程信息: netstat -lnp|grep 端口号 例如:netstat -lnp|grep 8080 就是找到正在使用8080端口的进程 关闭进程: kill -9 进 ...