• 【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)


    项目代码

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_

    目录

    项目代码

    一、抽象类的引入

    二、抽象类的基本介绍

    三、抽象类的注意事项和细节讨论

     四、抽象类的课堂练习

    五、模版设计模式


    一、抽象类的引入

            很多时候在创建类的时候有一个父类,比如animal类,他的子类会有各种方法,为了复用需要进行方法的重写,比如子类Cat会eat(),所以不得已只能在animal类内也需要写eat()方法,但没有意义。

            所以当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。

    1. abstract class Animal{
    2. // public void eat(){System.out.println("eat但不知道谁在吃");}//所以需要抽象方法
    3. //这里实现了eat(),但其实没有什么意义
    4. //即 父类方法不确定性的问题
    5. //===>考虑该方法设计为抽象(abstract)方法
    6. //==>所谓抽象方法就是没有实现的方法
    7. //===>所谓没有实现就是指,没有方法体
    8. abstract public void eat();
    9. //注意 当一个类中存在抽家方法时,需要将该类声明为abstract类
    10. //所以一般是子类来实现这个抽象方法的重写
    11. }
    12. class Cat extends Animal{
    13. public void eat(){
    14. System.out.println("小猫在吃....");
    15. }
    16. }

    二、抽象类的基本介绍

    1)用abstract关键字来修饰个类时,这个类就叫抽象类访问修饰符abstract类名{

    2)用abstract关键字来修饰一个方法时,这个方法就是抽象方法访问修饰符abstract返回类型方法名(参数列表)//没有方法体

    3)抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类()

    4)抽象类,是考官比较爱问的知识点在框架和设计模式使用较多

    三、抽象类的注意事项和细节讨论

    1)抽象类不能被实例化

    报错'A' is abstract; cannot be instantiated

    2)抽象类不定要包含abstract方法。 也就是说抽象类可以没有abstract方法

            同上 上图的抽象类A类并没有抽象方法

    3)一旦类包含了abstract方法,则这个类必须声明为abstract

    4) abstract只能修饰类和方法,不能修饰属性和其它的。

    5)抽象类可以有任意成员(抽象类本质还是类),比如:非抽象方法、构造器、静态属性等等

    注意不能实例对象。

    1. public class AbstractDetail02 {
    2. public static void main(String[] args) {
    3. D.nihao();
    4. }
    5. }
    6. abstract class D{
    7. public int n1 = 10;
    8. public static String name = "yinhai";
    9. public D(){
    10. }
    11. {
    12. }
    13. static {
    14. }
    15. public abstract void hello();
    16. public void ok(){
    17. }
    18. public static void nihao (){
    19. }
    20. }

    6)抽象方法不能有主体,即不能实现如图所示abstract void aaa(){};

    7)如果个类继承 了抽象类, 则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。

    1. abstract class E{
    2. public abstract void hi();
    3. }
    4. abstract class F extends E{
    5. }
    6. class G extends E{
    7. @Override
    8. public void hi() {//这里G类子类实现了父类E的抽象方法,就是有方法体
    9. }
    10. }

    8)抽象方法不能使用private,final和static来修饰,因为这些关键字都是和重写相违背的。

            

     四、抽象类的课堂练习

    1)题1.思考: abstract final class A{}能编译通过吗,why?

            // 不能 因为抽象的本意是继承重写

            //final修饰就已经是最终类了

    2)题2,思考: abstract public static void test2(); 能编译通过吗,why?

            //不能 静态的方法是不能重写的

    3)题3,思考: abstract private void test30;能编译通过吗,why?

            //不能 除了public以外都不行

    4)编写一个Employee类,声明为抽象类,包含如下三个属性: name, id, salary.提供必要的构造器和抽象方法: work0. 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类.要求类中提供必要的方法进行属性访问,实现work().提示"经理/普通员工名字工作中....

    1. public double getSalary() {
    2. return salary;
    3. }
    4. public void setSalary(double salary) {
    5. this.salary = salary;
    6. }
    7. }
    8. class Maanager extends Employee{
    9. private double bonus;
    10. public Maanager(String name, String id, double salary, double bonus) {
    11. super(name, id, salary);
    12. this.bonus = bonus;
    13. }
    14. public void work(){
    15. System.out.println("经理 " + getName() + "正在工作中");
    16. }
    17. }
    18. class CommonEmployee extends Employee{
    19. public void work(){
    20. System.out.println("普通员工 " + getName() + "正在工作中");
    21. }
    22. public CommonEmployee(String name, String id, double salary) {
    23. super(name, id, salary);
    24. }
    25. }

     

    五、模版设计模式

    需求

    1.有多个类,完成不同的任务job

    2.要求统计各自得到各自完成任务的时间

    3.编程实现

    引出模版设计模式

    1. public class TestTemplate {
    2. public static void main(String[] args) {
    3. AA aa = new AA();
    4. aa.job();
    5. BB bb = new BB();
    6. bb.job();
    7. }
    8. }
    9. class AA {
    10. public void job() {
    11. //得到开始的时间
    12. long start = System.currentTimeMillis();
    13. long num = 0;
    14. for (long i = 0; i < 1000000; i++) {
    15. num += i;
    16. }
    17. //得到结束的时间
    18. long end = System.currentTimeMillis();
    19. System.out.println("执行时间" + (end - start) + "ms");
    20. }
    21. public void job2(){
    22. //得到开始的时间
    23. long start = System.currentTimeMillis();
    24. long num = 0;
    25. for (long i = 0; i < 3000000; i++) {
    26. num += i;
    27. }
    28. //得到结束的时间
    29. long end = System.currentTimeMillis();
    30. System.out.println("执行时间" + (end - start) + "ms");
    31. }
    32. }
    33. class BB {
    34. public void job() {
    35. //得到开始的时间
    36. long start = System.currentTimeMillis();
    37. long num = 0;
    38. for (long i = 0; i < 2000000; i++) {
    39. num += i;
    40. }
    41. //得到结束的时间
    42. long end = System.currentTimeMillis();
    43. System.out.println("执行时间" + (end - start) + "ms");
    44. }
    45. }

            如果在每个单类里面写job和计算时间的代码块,复用性会很差,所以就引出模版设计,设计一个父类,里面塞进去共有的计算时间的方法,然后塞入抽象job方法,因为每一个对象在运行的时候会从本类开始查找,所以构成了重写抽象job方法,所以这种设计理念就相当于把父类作为一个模版,其他继承。

    所以改进该代码

    1. public class TestTemplate {
    2. public static void main(String[] args) {
    3. AA aa = new AA();
    4. BB bb = new BB();
    5. aa.calWorkTime();
    6. bb.calWorkTime();
    7. }
    8. }
    9. abstract class Template{
    10. public abstract void job();
    11. public void calWorkTime(){
    12. long start = System.currentTimeMillis();
    13. job();//动态绑定机制,调用的是对象所在类内的方法,没有再往上查找
    14. long end = System.currentTimeMillis();
    15. System.out.println("执行时间" + (end - start) + "ms");
    16. }
    17. }
    18. class AA extends Template{
    19. public void job() {
    20. long num = 0;
    21. for (long i = 0; i < 1000000; i++) {
    22. num += i;
    23. }
    24. }
    25. }
    26. class BB extends Template{
    27. public void job() {
    28. long num = 0;
    29. for (long i = 0; i < 2000000; i++) {
    30. num += i;
    31. }
    32. }
    33. }

            

  • 相关阅读:
    一个M阶B树具有特性
    MySQL面试题——MySQL常见查询
    虹科分享|硬件加密U盘|居家办公的网络安全:远程员工可以采取的步骤
    [DB]数据库--lowdb
    二、.Net Core搭建Ocelot
    进程的管理
    CentOS7上安装MySQL 5.7.32(超详细)
    Python循环中被遗忘的else选项
    TIJ14_类型信息
    HTML CSS 个人网页设计 WEB前端大作业代码
  • 原文地址:https://blog.csdn.net/qq_41891655/article/details/133998144