抽象类
一、抽象类:
抽象:笼统、看不清、模糊、不具体。
二、特点:
1、方法只有声明,没有具体的实现和方法体。需要用abstract修饰。
抽象方法必须定义在抽象类中。该类也必须被abstract修饰。
2、 抽象类不能被实例化。因为抽象方法没有方法体,调用没有意义。
3、 抽象类必须有子类覆盖抽象方法以后,子类才能被实例化,否则子类还是抽象类。
三、疑问。
1、抽象类有构造方法吗?
有,用于给子类对象进行初始化。
2、抽象类可以不定义抽象方法吗?
可以的。但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。
通常这个类中的方法有方法体,但是却没有内容。
abstract class Demo
{
void show1()
{}
void show2()
{}
}
3、抽象类abstract关键字不可以和哪些关键字共存。
private 不行。如果父类属性定义为priavte则该属性不能被继承。
static 不行。 静态属性与方法直接可通过类名来访问。
Final 不行。 常量无法被继承。
4、抽象类和普通类的异同点。
相同点:
都是用来描述事务,都在内部顶了成员。
异:
1、一般类有足够的信息来描述事务。
抽象类描述事务的信息有可能不足。
2、一般类中不可以定义抽象方法,只能定义普通方法
抽象类中可以定义抽象方法,也可以定义普通方法。
3、抽象类不能被实例化,只能被覆盖。
‘ 一般类可以被实例化。
5、抽象类一定是父类吗?
是。因为抽象类需要子类覆盖以后才能对子类进行实例化。
四、实例。
雇员示例:需求:公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
对给出需求进行数据建模。
析:
在这个问题领域中,先找出涉及的对象。
通过名词提炼法。
程序员:
属性:姓名,工号,薪水、
行为:工作。
经理:
属性:姓名,工号,薪水,奖金。
行为:工作。
程序员和经理不存在着直接继承关系,
但是程序员和经理却具有共性内容。
可以进行抽取。因为他们都是公司的雇员
可以将程序员和经理进行抽取.建立体系.
*/
//描述雇员。
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 bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public void work()
{
System.out.println("manage");
}
}