• Java中的abstract抽象类的匿名子类模板方法的设计模式


    1.abstract关键字的使用

    1. abstract:抽象的
    2. abstract可以用来修饰的结构:类、方法
    3. abstract修饰类:抽象类
      3.1 此类不能实例化
      3.2抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
      3.3开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
    4. abstract修饰方法:抽象方法
      4.1 抽象方法只有方法的声明,没有方法体
      4.2 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
      4.3若子类重写了父类中的所有的抽象方法后,此子类方可实例化
      4.4若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
    5. abstract使用上的注意点:
      5.1 abstract不能用来修饰:属性、构造器等结构
      5.2 abstract不能用来修饰私有方法、静态方法、final的方法、final的类

    举例:

    abstract class GeometricObject{
    	public abstract double findArea();
    }
    class Circle extends GeometricObject{
    	private double radius;
    	public double findArea(){
    		return 3.14 * radius * radius;
    	};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.1AbstractTest.java类代码

    package com.my.java;
    public class AbstractTest {
    	public static void main(String[] args) {
    		
    		//一旦Person类抽象了,就不可实例化
    //		Person p1 = new Person();
    //		p1.eat();
    		
    	}
    }
    
    abstract class Creature{
    	public abstract void breath();
    }
    
    abstract class Person extends Creature{
    	String name;
    	int age;
    	
    	public Person(){
    		
    	}
    	public Person(String name,int age){
    		this.name = name;
    		this.age = age;
    	}
    	
    	//不是抽象方法:
    //	public void eat(){
    //		
    //	}
    	//抽象方法
    	public abstract void eat();
    	
    	public void walk(){
    		System.out.println("人走路");
    	}
    	
    	
    }
    
    
    class Student extends Person{
    	
    	public Student(String name,int age){
    		super(name,age);
    	}
    	public Student(){
    	}
    	
    	public void eat(){
    		System.out.println("学生多吃有营养的食物");
    	}
    
    	@Override
    	public void breath() {
    		System.out.println("学生应该呼吸新鲜的没有雾霾的空气");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    2.抽象类的匿名子类

    package com.my.java;
    public class PersonTest {
    	
    	public static void main(String[] args) {
    		
    		method(new Student());//匿名对象
    		
    		Worker worker = new Worker();
    		method1(worker);//非匿名的类非匿名的对象
    		
    		method1(new Worker());//非匿名的类匿名的对象
    		
    		System.out.println("********************");
    		
    		//创建了一匿名子类的对象:p
    		Person p = new Person(){
    
    			@Override
    			public void eat() {
    				System.out.println("吃红烧肉");
    			}
    
    			@Override
    			public void breath() {
    				System.out.println("吸氧");
    			}
    			
    		};
    		
    		method1(p);
    		System.out.println("********************");
    		//创建匿名子类的匿名对象
    		method1(new Person(){
    			@Override
    			public void eat() {
    				System.out.println("吃螺蛳粉");
    			}
    
    			@Override
    			public void breath() {
    				System.out.println("螺蛳粉的臭味");
    			}
    		});
    	}
    	
    	
    	public static void method1(Person p){
    		p.eat();
    		p.breath();
    	}
    	
    	public static void method(Student s){
    		
    	}
    }
    
    class Worker extends Person{
    
    	@Override
    	public void eat() {
    	}
    
    	@Override
    	public void breath() {
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    在这里插入图片描述

    3.抽象类的应用:模板方法的设计模式

    package com.my.java;
    public class TemplateMethodTest {
    
    	public static void main(String[] args) {
    		BankTemplateMethod btm = new DrawMoney();
    		btm.process();
    
    		BankTemplateMethod btm2 = new ManageMoney();
    		btm2.process();
    	}
    }
    abstract class BankTemplateMethod {
    	// 具体方法
    	public void takeNumber() {
    		System.out.println("取号排队");
    	}
    
    	public abstract void transact(); // 办理具体的业务 //钩子方法
    
    	public void evaluate() {
    		System.out.println("反馈评分");
    	}
    
    	// 模板方法,把基本操作组合到一起,子类一般不能重写
    	public final void process() {
    		this.takeNumber();
    
    		this.transact();// 像个钩子,具体执行时,挂哪个子类,就执行哪个子类的实现代码
    
    		this.evaluate();
    	}
    }
    
    class DrawMoney extends BankTemplateMethod {
    	public void transact() {
    		System.out.println("我要存款200RMB");
    	}
    }
    
    class ManageMoney extends BankTemplateMethod {
    	public void transact() {
    		System.out.println("我要理财!我这里有2000万RMB!!");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

  • 相关阅读:
    云原生爱好者周刊:有一份 DevOps 修炼指南请您查收!
    用移动ip的优势
    version-rocket ,一个用于 web 应用检测版本更新的小工具。
    14天学习训练营之 初识Pygame
    Hive修改Parquet类型表字段几种问题处理
    Maven是什么?手把手先创建个Maven项目
    WEB核心【记录网站登录人数,记录用户名案例】Cookie技术实现
    An动画基础之元件的影片剪辑动画与传统补间
    【缓存】OS层面缓存设计机制
    js中new做了什么
  • 原文地址:https://blog.csdn.net/Redamancy06/article/details/125554203