final关键字:最终
1.可以修饰类,变量,函数,变量
2.被final修饰的类不可以被继承,用于避免被继承,被子类复写
final class Demo{ void show(){ }}class subDemo extends Demo//无法编译:不能从最终类继承
3.被final修饰的方法不能被复写
final class Demo{ final void show(){ } void show1(){ }}class subDemo extends Demo//无法编译:无法覆盖final修饰的方法
4.被final修饰的变量是一个常量,只能赋值一次,即可以修饰成员,又可以修饰局部变量
final class Demo{ final int x=3; void show(){ final int y=4; int y=9; }}class subDemo extends Demo//无法编译:无法为最终变量赋值
当在描述事物时,一些数据出现的值是固定的,为了增强阅读性,都用final修饰
(作为常量,所有字母都大写,单词间通过“_”连接)
final double PI=3.14;
5.内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
抽象类abstract
特点:1.抽象方法一定定义在抽象类中
2.抽象方法和抽象类必须被abstract修饰
3.抽象类不可以用new创建对象(调用抽象方法没意义)
4.抽象类中的方法要被使用,必须有子类复写其所有的抽象方法后 建立子类对象用
如果没有覆盖完全,则该子类仍是抽象类(无法对抽象类实例化)
/* 当多个类中出现相同功能,但是功能主体不同 这时可以进行向上抽取,只抽取功能定义,不抽取功能主体 */abstract class Student{ abstract void study(); }class BaseStudent extends Student{ void study(){ System.out.println("base study"); }}class AdvanceStudent extends Student{ void study(){ System.out.println("advanced study"); }}class AbstractDemo{ public static void main(String[] args){ new BaseStudent().study(); }}
抽象类和一般类没有太大不同
该怎么描述事物就怎么描述事物,只是该事物中出现了一些抽象的东西
这些不确定的部分也是事物的功能,需要明确,但无法定义主体
因此通过抽象(abstract)来表示
抽象类比一般类多了抽象方法
抽象类不可以实例化
**抽象类中可以不定义抽象方法,只为不让该类建立对象
抽象类练习:
/* 对员工进行建模,员工包含3个属性:姓名,工号,以及工资 经理也是员工,比员工多出一个奖金属性 利用继承思想设计员工类和经理类,并在勒种提供必要的方法进行属性访问*/abstract class Employee{ private String name; private String id; private double pay; Employee(String name,String id,double pay){ this.name=name; this.id=id; this.pay=pay; } public abstract void work();}class Professional extends Employee{ Professional(String name,String id,double pay){ super(name,id,pay); } public void work(){ System.out.println("Professional Work"); }}class Manager extends Employee{ private int bonus; Manager(String name,String id,double pay,int bonus){ super(name,id,pay); this.bonus=bonus; } public void work(){ System.out.println("Manager Work"); }}
模板方法模式
在定义功能时,功能的一部分是确定的,有一部分是不确定的
而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去
由该类的子类去完成
/* 需求:获取一段程序运行的时间 原理:获取程序开始和结束的时间并相见 获取时间:System.currentTimeMillis(); 当代码完成优化后,就可以解决这类问题*/abstract class getTime{ public final void GetTime(){ runcode(); long start=System.currentTimeMillis(); long end=System.currentTimeMillis(); System.out.println("毫秒:"+(end-start)); } public abstract void runcode();}class subTime extends getTime{ public void runcode(){ for(int x=0;x<8000;x++){ System.out.print("x"); } }}class TemplateDemo{ public static void main(String[] args){ getTime gt=new getTime(); gt.GetTime(); }}