final关键字:
概念:
学习了继承我们发现继承有一个弊端,就是它会打破封装性;如果不让其他类继承该类,就不会有重写了,→可以通过Java中的几个关键字来实现,final(最终化)。
final关键字是一个修饰符,可以修饰类、方法、变量(成员变量、局部变量、静态变量)。
什么时候用?
当程序中一个数据使用时是固定不变的,这时为了增加阅读性,可以给该数据起个名字,这就是变量,为了保证这个变量的值不被修改,加上final修饰,这就是一个阅读性很强的常量。书写规范:被final修饰的常量名所有的字母都是大写的,如果由多个单词组成,单词间通过 _ 连接。
特点:
1,final修饰的类是一个最终类,不饿能够再派生子类(如果类中出现部分可以重写,部分不可以,只要给指定的方法最终化就可以了);
2,final修饰的方法是最红方法,不可以被重写;
3,final修饰的变量是一个常量,只能被赋值一次。
抽象类:
产生:
在描述事物时,没有足够的信息描述一个事物,这时该事物就是抽象事物,它的功能也不具体,这些不具体的功能需要在类中标识出来,使用Java中的关键字abstract(抽象)。
定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。
特点:
1,抽象类和抽象方法都需要被abstract修饰,抽象方法一定要定义在抽象类中;
2,抽象类不可以创建实例,原因:调用抽象方法没有意义;
3,只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化,否则该子类还是一个抽象类。
【细节问题】
1,抽象类一定是个父类?
是的,因为不断抽取而来的。
2,抽象类是否有构造函数?
有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化。
抽象类和一般类的异同点:
相同:
1,它们都是用来描述事物的。
2,它们之中都可以定义属性和行为。
不同:
1,一般类可以具体的描述事物。
抽象类描述事物的信息不具体
2,抽象类中可以多定义一个成员:抽象函数。
3,一般类可以创建对象,而抽象类不能创建对象。
3,抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类的存在到底有什么意义呢?仅仅是不让该类创建对象。
4,抽象关键字abstract不可以和哪些关键字共存?
1,final:
2,private:
3,static:
练习:
需求:公司中程序员有姓名,工号,薪水,工作内容。项目经理除了有姓名,工号,薪水,还有奖金,工作内容
在问题领域中先找寻其中涉及的对象。
程序员
属性:姓名,工号,薪水
行为:工作
项目经理
属性:姓名,工号,薪水,奖金
行为:工作
这些对象是否有关系呢?发现了他们之间的共性,应该存在着关系。
可以将他们的共性向上抽取到共性类型:员工。
员工:
属性:姓名,工号,薪水
行为:工作
发现员工的工作内容本身就不具体。应该是抽象的,由具体的子类来体现的。
abstract class Employee { private String name; private String id; private double pay; /** 构造一个员工对象,一初始化就具备着三个属性。 */ public Employee(String name,String id,double pay) { this.name = name; this.id = id; this.pay = pay; } /** 工作行为。 */ public abstract void work(); } //具体的子类:程序员。 class Programmer extends Employee { public Programmer(String name,String id,double pay) { super(name,id,pay); } public void work() { System.out.println("code...."); } } //具体的子类:经理。 class Manager extends Employee { //特有属性。 private double bonus; public Manager(String name,String id,double pay,double bonus) { super(name,id,pay); this.bonus = bonus; } public void work() { System.out.println("manage"); } } class AbstractTest { public static void main(String[] args) { System.out.println("Hello World!"); } }
————毕老师day09视频