抽象:笼统,模糊,看不懂,不具体。
特点:
1.方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类必须也被abstract修饰。
2.抽象类不可以被实例化。为什么?因为调用抽象方法没意义。
3.抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。否则,这个子类还是抽象类。
抽象类的细节:
1.抽象类有构造函数,用于给子类对象初始化。
2.抽象类可以不定义抽象方法,但很少见,目的就是不让该类创建对象,AWT的适配器对象中就是这种类。
通常,这个类中的方法有方法体,但是没有内容。
3.抽象关键字不可以和一些关键字共存:
private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
static: 抽象方法不能和static关键字共存,因为一旦加static我们就可以通过类名直接访问抽象方法,由于抽象方法没有方法体,没有任何意义,也不允许这样做
final:抽象类不能和final共存,因为抽象类自身无法创建对象,我们需要通过子类创建对象,一旦抽象类使用final关键字,那么抽象类就没有子类
4.抽象类和一般类的异同点:
相同点,抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同:1.一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。
2.一般类中不能定义抽象方法,只能定义非抽象方法; 抽象类中可以定义抽象方法,同时也可以定义非抽象方法。
3.一般类可以实例化;抽象类不可以实例化。
5.抽象类一定是父类。因为需要子类覆盖方法后才可以对子类实例化。
例子:
package com.monfolld;
//描述雇员
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;
}
abstract /*抽象*/void work(); //因为子类不同类型的的工作未知,所以对工作抽象化
}
//描述程序员
class Programmer extends Employee{
Programmer(String name,String id,double pay){
super(name, id, pay); //父类进行初始化
}
void work(){ //子类进行具体描述
System.out.println("程序员工作");
}
}
//描述经理 多了一个属性
class Manager extends Employee{
private int bonus;
Manager(String name,String id,double pay){
super(name, id, pay); //父类进行初始化
this.bonus=bonus;
}
void work(){
System.out.println("程序经理工作"); //子类进行具体描述
}
}