ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java面向对象之abstract抽象类

2022-01-14 12:02:17  阅读:93  来源: 互联网

标签:Java abstract System void println 抽象类 public out


文章目录


提示:以下是本篇文章正文内容,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面向对象的学习,学习抽象方法、抽象类。之后的学习内容将持续更新!!!

标签:Java,abstract,System,void,println,抽象类,public,out
来源: https://blog.csdn.net/qq15035899256/article/details/122418874

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有