Java面向对象之abstract抽象类

文章目录


提示:以下是本篇文章正文内容,Java系列学习将会持续更新

(1)基本概念

  抽象类:普通类的超集,只是比普通类多一些抽象方法。使用abstract关键字修饰的类,抽象类不能实例化对象

	public abstract class TestAbstract {}
	TestAbstract t = new TestAbstract();  (X)不能实例化对象

  抽象方法:指不能被具体实现的方法,也就是不能有方法体{},并且使用abstract关键字修饰;

访问修饰符 abstract void show();

回到目录…

(2)注意事项

  1.抽象类中可以有成员变量、成员方法以及构造方法;

  2.抽象类中可以有抽象方法也可以没有;但是拥有抽象方法的类一定是抽象类,必须有abstract关键字修饰;

  3.抽象类的子类可以是普通类(子类必须覆写父类的所有抽象方法),也可以是抽象类。

  4.一个子类只能继承一个抽象类。

回到目录…

(3)实际意义

  抽象类的意义不在于实例化对象而在于被继承。若一个类继承自抽象类,则必须重写抽象方法。否则该类也得变成抽象类。保证多态的正确运行。
  因此,抽象类对子类具有强制性和规范性,叫做模板设计模式

经验分享:
  在以后的开发中推荐使用父类引用指向子类的对象形式,因为父类引用直接调用的方法一定是父类拥有的方法。当需要更换指向子类对象的时候,只需要将new后面的类型更改一下就可以了,其他的代码无需改动,因此提高了代码的可维护性和可扩展性。

该方式的缺点在于:父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换。

回到目录…

(4)案例

 ①自定义CaffeineDrinks抽象类,包含制作饮品的大方法、每个流程的小方法/抽象方法。
 ②自定义Coffee、Tea、MilkTea类继承CaffeineDrinks类,实现对父类中抽象方法的重写。
 ③自定义TestCaffeineDrinks类,在main()方法中使用多态的语法创建对象进行测试。

CaffeineDrinks父类

/**
 * 抽象类:咖啡因饮品
 */
public abstract class CaffeineDrinks {
    // 制作流程是标准化的,封装到父类中
    // 子类只有使用权不能修改
    // 饮品的制作流程,用final修饰,表示不能被覆写
    public final void prepareDrinks() {
        //烧水
        boilWater();
        //冲泡
        brew();
        //倒入杯中
        pourInCup();

        if(isCustomerWantsCondiments()) {
            //添加调味料
            addCondiments();
        }
    }
    // 对于浸泡和加调味品来说,不同子类实现细节不同,延迟到子类中去具体实现
    /** 抽象方法 **/
    //冲泡的方式不同
    public abstract void brew();
    //添加的调味料不同
    public abstract void addCondiments();

    //烧水
    public void boilWater() {
        System.out.println("boiling water");
    }

    //倒入杯中
    public void pourInCup() {
        System.out.println("pouring into cup");
    }

    //顾客是否添加调味料,默认添加
    public boolean isCustomerWantsCondiments() {
        return true;
    }
}

Coffee子类

/**
 * 星巴克咖啡制作
 */
import java.util.Scanner;

public class Coffee extends CaffeineDrinks {

    Scanner input = new Scanner(System.in);

    //重写抽象类中的冲泡方法
    @Override
    public void brew() {
        System.out.println("brew coffee bag");
    }

    //重写抽象类中的调料方法
    @Override
    public void addCondiments() {
        System.out.println("add sugar and milk");
    }

    //重写抽象类中的是否调料方法
    @Override
    public boolean isCustomerWantsCondiments() {
        System.out.print("您的咖啡是否加糖和奶? y表示加,n表示不加 :");
        String str = input.nextLine();
        if (str.equals("y")) {
            return true;
        }
        return false;
    }
}

MilkTea子类

/**
 * 奶茶制作
 */
public class MilkTea extends CaffeineDrinks {

    //重写抽象类中的冲泡方法
    @Override
    public void brew() {
        System.out.println("brew tea and coffee bag");
    }

    //重写抽象类中的调料方法
    @Override
    public void addCondiments() {
        System.out.println("add milk and sugar");
    }
}

Tea子类

/**
 * 星巴克泡茶法
 */
public class Tea extends CaffeineDrinks {

    //重写抽象类中的冲泡方法
    @Override
    public void brew() {
        System.out.println("steep tea bag");
    }

    //重写抽象类中的调料方法
    @Override
    public void addCondiments() {
        System.out.println("add lemon");
    }
}

TestCaffeineDrinks测试类

/**
 * 抽象方法的测试类
 */
public class TestCaffeineDrinks {
    public static void main(String[] args) {
        //咖啡的制作
        CaffeineDrinks coffee = new Coffee();
        System.out.println("咖啡的制作:");
        coffee.prepareDrinks();
        System.out.println("--------------");

        //茶的制作
        CaffeineDrinks tea = new Tea();
        System.out.println("茶的制作:");
        tea.prepareDrinks();
        System.out.println("--------------");

        //奶茶的制作
        CaffeineDrinks milkTea = new MilkTea();
        System.out.println("奶茶的制作:");
        milkTea.prepareDrinks();
    }
}

回到目录…

(5)运行结果

Java面向对象之abstract抽象类
回到目录…


总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是继续Java面向对象的学习,学习抽象方法、抽象类。之后的学习内容将持续更新!!!

上一篇:Day11 Java 多态、抽象


下一篇:angular+h5聊天室|聊天实战angular版