一、抽象类(abstract class)

1.随着继承层次中一个个新子类的定义,类变的越来越具体,而父类则更一般、更通用。类的设计应该保证父类和子类能够共享特征。有时需要将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类就叫做抽象类。

比如Animal这个类没办法描写其具体的移动方式,只能将所有Animal类和其方法都进行抽象化处理,即不写具体的实现。等到继承到某个具体的动物时,再把方法体进行具体的实现。

2.用abstract关键字来修饰一个类时,这个类就叫做抽象类。

3.同理,用abstract来修饰一个方法时,该方法就叫做抽象方法。(抽象方法:只有方法的声明,没有方法的实现,以“;”结束。例如:abstract int abstractMethod(int a);)

4.抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类,即只要类中有一个抽象的方法,那么这个类就必须是一个抽象类。

5.不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

packageday15;public abstract classAnimal {public abstract void test();//只要类中有一个抽象方法,那么这个类就必须是一个抽象类

public abstract voidmove();

}class Dog extendsAnimal{public voidtest() {//TODO Auto-generated method stub

}public voidmove() {

System.out.println("狗的移动方式是跑");

}

}class Fish extendsAnimal{public voidtest() {//TODO Auto-generated method stub

}public voidmove() {

System.out.println("鱼的移动方式是游");

}

}abstract class Bird extends Animal{//抽象类可以继承抽象类

public voidmove() {//TODO Auto-generated method stub

}public abstract voidtest();

}

packageday15;public classTest {public static voidmain(String[] args) {

Dog d= newDog();

d.move();

Fish f= newFish();

f.move();

}

}

打印结果为:

狗的移动方式是跑

鱼的移动方式是游

问题:1.为什么抽象类不可以使用final关键字声明?

答:final修饰的类是最终的类,不能被继承。而抽象类不能被实例化,是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。

问题:2.一个抽象类中可以定义构造器吗?

答:抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。

练习:编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salay。提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问。

packageday15;public abstract classEmployee {public Employee(){//显示构造器

}intid;

String name;doublesalary;public abstract voidwork();

}class CommonEmployee extendsEmployee{public void setCommonEmployeeInFo(int id,String name,doublesalary){super.id =id;super.name =name;super.salary =salary;

}public voidgetCommonEmployeeInFo(){

System.out.println(super.id);

System.out.println(super.name);

System.out.println(super.salary);

}public voidwork() {//TODO Auto-generated method stub

System.out.println("这是一个普通员工");

}

}class Manager extendsEmployee{doublebonus;public void setManagerInFo(int id,String name,double salary,doublebonus){super.id =id;super.name =name;super.salary =salary;this.bonus = bonus;//这是只属于领导的属性,因此用this

}public voidgetManagerInFo(){

System.out.println(super.id);

System.out.println(super.name);

System.out.println(super.salary);

System.out.println(this.bonus);

}public voidwork() {//TODO Auto-generated method stub

System.out.println("这是一个领导");

}

}

packageday15;public classTest {public static voidmain(String[] args) {

CommonEmployee ce= newCommonEmployee();

ce.work();

ce.setCommonEmployeeInFo(1007, "小明", 6000);

ce.getCommonEmployeeInFo();

Manager m= newManager();

m.work();

m.setManagerInFo(2371, "小白", 10000, 6000);

m.getManagerInFo();

}

}

打印结果为:

二、模板方法设计模式(TemplateMethod)

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为模式。

抽象类就像是一个大纲,里面的抽象方法就是每个章节的标题;子类根据这些标题把每个章节细化出来。

解决的问题:

1.当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

2.编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

实例:

packageday15;

/**

*模板设计模式

*/public abstract classTemplete {public abstract voidcode();public final void getTime(){//使用final是创建一个只允许子类使用,但不允许子类重写的方法

long start = System.currentTimeMillis();//返回当前的秒数

code();long end =System.currentTimeMillis();

System.out.println("code方法执行的时间:" + (end -start));

}

}class TestTmp extendsTemplete{public voidcode() {//TODO Auto-generated method stub

int k = 0;for(int i = 0; i < 500000; i++){

k+= 1;

}

System.out.println(k);//k显示执行的次数

}

}

packageday15;public classTest {public static voidmain(String[] args) {

TestTmp t= newTestTmp();

t.getTime();

}

}

打印结果为:

500000

code方法执行的时间:1

java 抽象类 模板_Java学习day21-抽象类(abstract class)和模板设计模式(TemplateMethod)...相关推荐

  1. java中抽象类 接口_java中的抽象类与接口

    1.抽象类的定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 2.简单实例 ...

  2. java 银行卡支付_Java学习:用接口简单实现银行卡系统

    用前面所知案例,简单实现一个银行卡系统.涉及的Java知识有: interface(接口),abstract(抽象修饰符),extends(继承),implements(接口的实现),@Overrid ...

  3. java 接口工程_Java工程师(15)抽象类与接口

    抽象类 思考下面程序潜在的问题 交通工具中定义了4个方法,其中行驶方法内部会依次调用启动.加速.停止方法.由于不同的交通工具,启动的方式差异很大,所以交通工具类中并不实现该方法,而是将其交给子类实现. ...

  4. java教学笔记_java学习笔记(一)

    一.java规则:静态变量即类变量(区别与实例变量)用类方法即静态方法访问 例: public classObject_1 {static int i=1;static{//静态区域块,只执行一次,当 ...

  5. java内部类写法_Java学习-内部类

    一.概念 内部类:在一个类的内部定义的一个类: 分类: 可以分为 成员内部类.局部内部类.匿名内部类和静态内部类: <Think in java>): 1.内部类可以用多个实例,每个实例都 ...

  6. java 调用弗雷_JAVA 学习笔记

    封装: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法实现对隐藏信息的操作和访问,保证了数据的安全性.(可以隐藏类的细节,方便修改) 封装的实现步骤: 1.修改属性的可见性: ...

  7. 讲解java源码_Java学习之Java源码讲解

    关于Java中源码的学习,是不少同学头疼的知识点.本文整理了JAVA源码学习的八大要点,分别是基础知识.面向对象.异常处理.集合.综合类核心代码.JAVA8新特性.Input/Output和Java小 ...

  8. java学期总结_Java学习本学期总结

    前言 本篇文章主要是对本学期Java学习和第三阶段PTA作业的总结,以及对面向对象编程思维的理解与面向对象设计心得.若其中有错误或不足的地方,欢迎大家指出. 一.作业过程总结 首先本学期第一阶段作业, ...

  9. java自学难点_java学习重难点

    三人行必有我师,人生是需要不断学习的,在这里我们相遇就是缘分,希望各位可以看完这篇文章,也欢迎大家在下面留言讨论,天冷了,也动动手指转发收藏一下,谢谢大家! 在Java中修饰符总共有一下几种: 1.访 ...

最新文章

  1. 用eclipse阅读编辑android和kernel,uboot的源代码
  2. PHP网站工作流程图,在网站绘制工作流程图的教程分享(打工人必看)
  3. 基于python的堡垒机
  4. Oracle逻辑备份与恢复
  5. 转载一遍Java规范
  6. hbase java框架_Hadoop学习笔记—15.HBase框架学习(基础实践篇)
  7. j2ee之存储过程调用
  8. db2数据库免费版限制下载地址
  9. mysql8默认字符编码_mysql默认字符编码问题
  10. SAP License:SAP顾问薪酬
  11. webkit内核的浏览器
  12. java读取mysql配置文件_MySql主从复制,从原理到实践
  13. 收藏 《数据结构(C语言版)视频全集》—清华大学严蔚敏主讲
  14. 雷锋科普:联发科MT6577,国产平民双核手机的芯
  15. HTML怎么设置图片和文字间距离,div字间距-div内文字之间间距设置方法
  16. Dubbo基础篇_06_Dubbo监控中心的介绍与简易监控中心的安装
  17. 宁波大学计算机王老师,网友举报宁波大学副教授性骚扰女生 学校:该老师暂时停课进行调查...
  18. 听说要发年终奖了,来来来,我们父相伤害
  19. MarkDown特殊字符转义(七)
  20. App架构经验总结(转)

热门文章

  1. JetBrains WebStorm 2017.1.2 和 IntelliJ Idea 2017 在线激活
  2. 10个最棒的jQuery视频插件
  3. 盘古分词工具学习笔记
  4. 计算机考场桌子大小,自己打卧室电脑书桌最小宽度尺寸多少合适
  5. java中接口可以产生数组吗,java接口Array介绍
  6. oracle组合索引失效_一文看懂Oracle数据库的三大索引类型
  7. 冰原服务器维护,12月2日服务器公告 冰原旅途进发
  8. java类静态初始化_Java静态代码块和类初始化、实例初始化过程
  9. 安卓9开机 bootanimation.zip_小米手机如何从安卓10退回安卓9系统,不丢失传感器,不变砖...
  10. 大部分Java程序员都会忽略的几个问题,你中招没?