java学习笔记16-抽象类
抽象类:
定义了一系列的属性和方法的类。抽象方法是不能直接实现功能。需要通过继承去实现具体方法。为了将静态的业务流程跟动态的实现分开。
工厂生产产品时,都需要准备材料,执行组装,产品销售等流程。但是对于不同的工厂。在执行这些流程是不同的。比如不同的工厂需要准备的材料不同。
创建抽象类的关键字是abstract
public abstract class Factory {
public abstract void prepared_matrial();
public abstract void do_make();
public abstract void sale(); }
使用abstract的方法是抽象方法,没有看上去比较怪,没有用花括号括起来。这样去声明方法表示。这个方法不能马上实现。需要通过子类去实现。
创建两个子类来继承它,首先创建一个汽车工厂,取名CarFactory
public class CarFactory extends Factory{
@Override
public void prepared_matrial(){
System.out.println("准备轮胎,方向盘");
} @Override
public void do_make() {
System.out.println("组装汽车");
} @Override
public void sale() {
System.out.println("去4S店");
}
}
再创建一个食品工厂,取名FoodFactory
public class FoodFactory extends Factory {
@Override
public void prepared_matrial() {
System.out.println("准备萝卜丝");
} @Override
public void do_make() {
System.out.println("把萝卜丝做成一袋袋的");
} @Override
public void sale() {
System.out.println("去小卖部");
} }
如果继承后。没有实现相应方法。是会报错的。
在Factory调用,看下效果。
public abstract class Factory {
public abstract void prepared_matrial();
public abstract void do_make();
public abstract void sale(); public static void main(String[] args){
CarFactory carFactory = new CarFactory();
carFactory.prepared_matrial();
carFactory.do_make();
carFactory.sale();
System.out.println("=========分割线=========");
FoodFactory foodFactory = new FoodFactory();
foodFactory.prepared_matrial();
foodFactory.do_make();
foodFactory.sale();
}
}
通过上面的代码会发现每次生成一个产品,每次都要调用这三个方法。能否把这三个方法在某处统一调用?
抽象类的一个特性是:抽象类不是必须要有抽象方法,也可以有实现了的方法;但是一旦有一个方法是抽象方法,此类必须设置为抽象类。
既然抽象类中可以有实现方法,那么就在Factory中定义一个总的生产方法,这个方法调用其他步骤来实现最终生产目的
public abstract class Factory {
public abstract void prepared_matrial();
public abstract void do_make();
public abstract void sale(); public void createProduct(){
prepared_matrial();
do_make();
sale();
} public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
carFactory.createProduct();
System.out.println("==============");
FoodFactory foodFactory = new FoodFactory();
foodFactory.createProduct();
}
}
也就是说,不用一个个的调用生产步骤的方法,只调用总生产方法就行了。这就是java模板方法模式。
java学习笔记16-抽象类的更多相关文章
- Java学习笔记16(面向对象九:补充内容)
总是看到四种权限,这里做一个介绍: 最大权限是public,后面依次是protected,default,private private修饰的只在本类可以使用 public是最大权限,可以跨包使用,不 ...
- Java学习笔记之抽象类与接口
抽象类(abstract) 抽象类概述:一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现 抽象方法: 一个方法被abstract修饰表示这个方法是抽象方法 ...
- Java 学习笔记(16)——Java数据库操作
数据库操作是程序设计中十分重要的一个部分,Java内置JDBC来操作数据库 JDBC使用 JDBC--Java Database connecting Java数据库连接:本质上JDBC定义了操作数据 ...
- 0026 Java学习笔记-面向对象-抽象类、接口
抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...
- java学习笔记16(正则表达式)
正则表达式: 定义:在pattern类中有简单规则定义,具有特殊含义的字符串: 作用:用于一些字符串,比如验证注册邮箱,密码,用户名等: 正则表达式的语法: 1)字符:'\'反斜杠 \t 代表制表 ...
- JAVA学习笔记16——控制线程
Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行. join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...
- JAVA学习笔记16——线程生命周期
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...
- JAVA学习笔记16——线程的创建和启动
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).Java使用线程执行体来代表这段 ...
- Java学习笔记之---比较接口与抽象类
Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
- 【C/C++开发】关于位域操作
几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存对齐全攻略–涉及位域的内存 ...
- OpenCV Python 4.0安装
1.安装OpenCV-Python 如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可: pip install opencv-pyth ...
- 一篇搞定Java过滤器
Filter:过滤器 引言 我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来 ...
- 如何解决error: failed to push some refs
$ git push -u origin master To github.com:a653398363/testtest.git ! [rejected] master -> master ( ...
- [官网]PG12发布了
PostgreSQL 12 Press Kit https://www.postgresql.org/about/press/presskit12/zh/#original_release Conte ...
- [转帖]CentOS 8 正式发布
CentOS 8 正式发布 终于发布了.. https://news.cnblogs.com/n/640416/ 前几天刚弄完centos7.7 的环境. CentOS 8 官方正式发布了!!!C ...
- laravel6.0路由
1.基本路由路由定义在routes目录下,路由执行是在控制器之前,路由路径 routes目录下api.php 关于接口路由定义文件包含的路由位于 api 中间件组约束之内,支持频率限制功能,这些路由是 ...
- 串口(USART)通信-串口通讯协议简介
物理层:规定通讯系统中具有机械.电子功能部分的特性,确保原始数据在物理媒体的传输.其实就是硬件部分. 协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包.解包标准.其实就是软件部分. 简单来说物理 ...
- c++学习总结(一)------类结构学习
基类的构造函数并没有被派生类继承 析构函数和拷贝赋值操作符同样也没有 类的设计者通过把成员函数声明为 const 以表明它们不修改类对象 把一个修改类数据成员的函数声明为 const 是非法的 (51 ...
- pause的作用
重要概念:Pod内的容器都是平等的关系,共享Network Namespace.共享文件 pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名称空间 pause ...