java-抽象类笔记

  • 抽象方法
  • 使用 abstract 修饰的方法没有方法体,只有声明。
  • 定义的是一种”规范”, 就是告诉子类必须要给抽象方法提供具体的实现。
  • 抽象类
  • 包含 抽象方法的类就是抽象类
  • 通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
//抽象类的定义
public abstract class 类名 {}

//抽象方法的定义
public abstract void eat();
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类不能实例化
  • 抽象类可以有构造方法
  • 抽象类的子类
  • 要么重写抽象类中的所有抽象方法

  • 要么是抽象类

抽象类和抽象方法的基本用法

//抽象类
abstract class Animal {
    abstract public void shout(); // 抽象方法
}

class Dog extends Animal {
    // 子类必须实现父类的抽象方法,否则编译错误
    public void shout() {
        System.out.println("汪汪汪!");
    }

    public void seeDoor() {
        System.out.println("看门中....");
    }
}

// 测试抽象类
public class TestAbstractClass {
    public static void main(String[] args) {
        Dog a = new Dog();
        a.shout();
        a.seeDoor();
    }
}
  1. 有抽象方法的类只能定义成抽象类

  2. 抽象类不能实例化,即不能用 new 来实例化抽象类。

  3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来 new 实例,只能用来被子类调用。

  4. 抽象类只能用来被继承。

  5. 抽象方法必须被子类实现。

抽象类的案例

  • 案例需求 定义猫类(Cat)和狗类(Dog) 猫类成员方法:eat(猫吃鱼)drink(喝水…) 狗类成员方法:eat(狗吃肉)drink(喝水…)
  • 实现步骤
  • 猫类和狗类中存在共性内容,应向上抽取出一个动物类(Animal)
  • 父类Animal中,无法将 eat 方法具体实现描述清楚,所以定义为抽象方法
  • 抽象方法需要存活在抽象类中,将Animal定义为抽象类
  • 让 Cat 和 Dog 分别继承 Animal,重写eat方法
  • 测试类中创建 Cat 和 Dog 对象,调用方法测试
  • 代码实现

// 动物类
abstract class Animal {

    public void drink() {
        System.out.println("喝水");
    }

    public Animal() {
    }

    public abstract void eat();
}

// 猫类 继承抽象类 并重写其中方法
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

// 狗类 继承抽象类 并重写其中方法
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头...");
    }

}

public class test {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.eat();
        d.drink();

        Cat c = new Cat();
        c.drink();
        c.eat();

        // Animal a = new Animal(); 抽象类不能实例化
        // a.eat();
    }
}

模板设计模式

  • 设计模式设计模式(Design pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
  • 模板设计模式把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法 让使用模板的类(继承抽象类的类)去重写抽象方法实现需求
  • 模板设计模式的优势模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
  • 示例代码
/*
    作文模板类
 */
abstract class CompositionTemplate {

    public final void write() {
        System.out.println("<<我的爸爸>>");

        body();

        System.out.println("&#x554A;~ &#x8FD9;&#x5C31;&#x662F;&#x6211;&#x7684;&#x7238;&#x7238;");

    }

    public abstract void body();
}

// &#x5B9E;&#x73B0;&#x7C7B;A
class Tom extends CompositionTemplate {

    @Override
    public void body() {
        System.out.println("&#x90A3;&#x662F;&#x4E00;&#x4E2A;&#x79CB;&#x5929;, &#x98CE;&#x513F;&#x90A3;&#x4E48;&#x7F20;&#x7EF5;,&#x8BB0;&#x5FC6;&#x4E2D;, " +
                "&#x90A3;&#x5929;&#x7238;&#x7238;&#x9A91;&#x8F66;&#x63A5;&#x6211;&#x653E;&#x5B66;&#x56DE;&#x5BB6;,&#x6211;&#x7684;&#x811A;&#x5361;&#x5728;&#x4E86;&#x81EA;&#x884C;&#x8F66;&#x94FE;&#x5F53;&#x4E2D;, &#x7238;&#x7238;&#x8E6C;&#x4E0D;&#x52A8;,&#x4ED6;&#x5C31;&#x7AD9;&#x8D77;&#x6765;&#x8E6C;...");
    }
}
// &#x5B9E;&#x73B0;&#x7C7B;B
class Tony extends CompositionTemplate {
    @Override
    public void body() {

    }

    /*
     * public void write(){
     *
     * }
     */
}

// &#x6D4B;&#x8BD5;&#x7C7B;
public class test {
    public static void main(String[] args) {
        Tom t = new Tom();
        t.write();
    }
}</我的爸爸>

Original: https://www.cnblogs.com/e-link/p/16742993.html
Author: link-零
Title: java-抽象类笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615861/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 59.你要的全拿走

    dsfsd posted @2022-09-28 08:33 随遇而安== 阅读(5 ) 评论() 编辑 Original: https://www.cnblogs.com/55z…

    Java 2023年6月7日
    076
  • LeetCode.1108-使IP地址无效(Defanging an IP Address)

    这是小川的第 393次更新,第 426篇原创 今天介绍的是 LeetCode算法题中 Easy级别的第 257题(顺位题号是 1108)。给定有效(IPv4)IP地址,返回该IP地…

    Java 2023年6月5日
    074
  • cuda安装及百度云链接

    1、cuda11.1、11.0、10.2、10.1、10.0、8.0及其相应的cudnn版本 本篇文章是基于移动端1050ti win10安装CUDA 10.0的经验写,由于官网下…

    Java 2023年6月13日
    093
  • 【转】Nginx集群Tomcat时session共享问题

    描述 nginx实现tomcat集群后会出现这样的情形,登录时请求由tomcat1处理,而跳转到首页时负载到了tomcat2,而tomcat2中又没有tomcat1中的登录信息,又…

    Java 2023年5月30日
    072
  • 推荐一款M1芯片电脑快速搭建集群的虚拟机软件

    虚拟机软件太多了,出名的莫过于 VMware, VirutlaBox以及 Parallels Desktop。 我们使用虚拟机软件一般有两种用途: 安装不同于宿主机系统的拥有用户界…

    Java 2023年6月7日
    095
  • 亿级消息中心架构方案概述【原创】

    目标 技术目标: 上行到消息队列api吞吐量10000条/秒,下发第三方平台1000条/秒(仅平台自身处理能力,第三方看第三方处理能力极限指标为准);保证消息中心100%高可用。 …

    Java 2023年6月8日
    067
  • java 上传 下载文件工具类

    package com.fh.util; import java.io.BufferedInputStream; import java.io.File; import java….

    Java 2023年6月7日
    082
  • Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    https://www.cnblogs.com/didispace/p/12291832.html Original: https://www.cnblogs.com/zhaoya…

    Java 2023年5月30日
    078
  • Qt 可重入和线程安全的理解

    概述:线程安全: 一个线程安全的函数可以同时被多个线程调用,即便是它们使用来了共享数据。因为该共享数据的所有实例都被序列化了。(实例序列化是指这个实例已经被设置为顺序(串行)的访问…

    Java 2023年5月30日
    068
  • Spring中属性注入的几种方式以及复杂属性注入详解

    在Spring框架中,属性的注入我们有多种方式,我们可以通过set方法注入,可以通过构造方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象、数组、List…

    Java 2023年6月5日
    095
  • 避坑手册 | JAVA编码中容易踩坑的十大陷阱

    JAVA编码中存在一些容易被人忽视的陷阱,稍不留神可能就会跌落其中,给项目的稳定运行埋下隐患。此外,这些陷阱也是面试的时候面试官比较喜欢问的问题。 本文对这些陷阱进行了统一的整理,…

    Java 2023年6月7日
    0193
  • java.util.function 中的 Function、Predicate、Consumer

    函数式接口: 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 Lambda 表达式。…

    Java 2023年5月29日
    068
  • jdk版本信息与环境变量配置版本不一致

    开始在本地安装了jdk1.7并配置了环境变量,使用java -version查看版本信息为【java version “1.7.0_51″】。随后安装了or…

    Java 2023年6月13日
    082
  • 登录功能

    登录功能分析 代码实现 LoginServlet类: UserService接口: UserServiceImpl实现类: UserDao接口: UserDaoImpl实现类: 登…

    Java 2023年6月6日
    073
  • Spring ProtocolResolver接口

    Spring ProtocolResolver接口 ProtocolResolver是一个策略接口,可以用于自定义协议解析, 比如spring就有一个 “classpa…

    Java 2023年6月7日
    046
  • HTML学习总结

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球