(3)final修饰的方法不可以被覆盖。
(4)final修饰的变量是一个常量,只能赋值一次。
3,为什么用final修饰变量?
在程序中,如果一个数据是固定不变的,那么直接使用这个数据就可以了,但是这样阅读性很差,所以应该给这个数据起一个名称,而且这个变量名称的值不能变化,所以加上final固定。若该数据是要被共享的,可以在加上static修饰符,可以直接被类名调用,若该常量在全局有效,可以加上public修饰,使全县最大化。
4,写法规范:
常量的所有字母都大写,多个单词之间用下划线连接。
9-5,抽象类-概述
1,例:
abstract class Person {//抽象类
abstarct void show();//抽象方法
}
2,当遇到不具体的事物时就定义成抽象的,如犬科都有吼叫功能,狗和狼的叫声是不同的,但都具备吼叫功能,所以犬科的吼叫方法定义为抽象的,由于有不确定的方法,所以该类也是不确定的,该类也定义为抽象的。
3,示例:
abstarct class 犬科{
abstract void 吼叫();
}
class 狗 extends 犬科 {
void 吼叫() {
System.out.println("汪汪");
}
}
class 狼 extends 犬科 {
void 吼叫() {
System.out.println("嗷嗷");
}
}
因为犬科中有一些是具体的方法,如睡觉功能,狗和狼的睡觉功能是一样的,所以向上提取出犬科类,而不在狗和狼类中直接写吼叫的方法。
9-6,抽象类-特点
特点:
(1)方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类必须也被abstract修饰。
(2)抽象类不可以被实例化,为什么?因为调用抽象方法没有意义。
(3)抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以被实例化,否则这个子类还是抽象类。
9-7,抽象类-细节
1,抽象类中有构造函数么?
有,用于给子类对象初始化。
2,抽象类可以不定义抽象方法么?
可以,但是很少见,目的就是不让这个类创建对象。AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是没有内容。
3,抽象关键字不可以和哪些关键字共存?
(1)private不行,因为抽象方法必须被子类覆盖并实现才能创建对象,若用private修饰,则子类不能覆盖这个抽象方法。
(2)static不行,用static修饰的方法可以不用对象调用,直接用类名调用,但是调用抽象方法是没有意义的,所以不兼容。
(3)final不行,抽象方法必须被覆盖,而加上final就不能被覆盖了,冲突。抽象类可以有子类,用final修饰则不能有子类,冲突。
4,抽象类和一般类的区别
相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。
不同:
(1)一般类有足够的信息描述事物。
抽象类描述事物的信息有可能不足。
(2)一般类中不能定义抽象方法,只能定义非抽象方法。
抽象类中可以定义抽象方法,同时也可以定义非抽象方法。
(3)一般类可以被实例化。
抽象类不可以被实例化。
5,抽象类一定是一个父类么?
是的。因为需要子类覆盖其方法后才可以对子类实例化。
9-8,抽象类的一个小练习
需求:雇员示例:
公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
对给出数据进行数据建模。
分析:
在这个领域中,先通过名词提炼找出涉及的对象。
程序员:
属性:姓名、工号、薪水
行为:工作
经理:
属性:姓名、工号、薪水、奖金
行为:工作
程序员和经理不存在直接继承的关系,但是程序员和经理有着共性的内容,可以进行抽取。因为他们都是公司的雇员。
可以将程序员和经理进行抽取,建立体系。
//描述雇员
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 Programmer extends Employee {
Programmer(String name,String id,double pay) {
super(name,id,pay);
}
public void work() {
System.out.println("code...");
}
}
//描述经理
class Manager extends Employee {
private int bonus;
Manager(String name,String id,double pay,int bouns) {
super(name,id,pay);
this.bonus = bonus;
}
public void work() {
System.out.println("manage");
}
}
class AbstractTest {
public static void main(String[] args) {
Programmer p = new Programmer("Peter","01001",6000.0);
p.work();
Manager m = new Manager("Tom","09001",12000.0,3000);
m.work();
}
}
9-9,接口interface-定义
1,当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface。
定义接口使用的关键字不是class而是interface,但接口仍是一个类,编译完成后生成与接口同名的.class文件,如:interface Demo,则声称Demo.class。
2,接口当中常见的成员,这些成员都有固定的修饰符。
(1)全局常量:public static final
(2)抽象方法:public abstract
如:
interface Demo {
public static final int NUM = 4;
public abstract void show();
}
接口中的成员必须这么定义。
可以得出一个结论,接口中的成员都是公共的权限。
3,由于接口中的成员的修饰符石固定的,所以若不写publc static final或是其中的某个修饰符,编译时会自动加上,但返回值类型必须写。
上述中的那段代码可以写成:
interface Demo {
int NUM = 4;
void show();
}
但一般不这么写,因为阅读性太差。若int NUM = 4;前面不加修饰符,很可能把它误以为是一个变量,而show()前不加修饰符,由于抽象方法是需要被覆盖的,而覆盖必须要了解抽象的权限,否则可能覆盖失败。
9-10,接口-实现implements
1,形式:
interface Demo