抽象类的特点:
抽象类和抽象方法必须用abstract关键字修饰
一个类中如果有抽象的功能,该类必须是抽象类
有抽象方法的类必须定义为抽象类
抽象类中不一定有抽象方法
抽象类不能实例化
因为他不是具体的, 需要通过多态的方式来实例化 Animal a = new Dog();
抽象类有构造方法,用于子类访问父类数据的初始化
抽象类的子类
如果不想重写抽象方法, 该子类是一个抽象类
重写所有的抽象方法,这个时候子类是一个具体的类
public abstract void eat(){} // 空方法体
public abstract void eat() // 无方法体
抽象类的成员特点:
成员变量:可以是变量可以是常量
构造方法:有,用于子类访问父类数据初始化
成员方法:既可以是抽象的也可以是非抽象的
抽象类的成员方法特性:
抽象方法:强制要求子类做的事情
非抽象方法 子类继承的事情,提高代码复用性
例:
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat(){
System.out.println(“狗吃狗粮”);
}
}
class AbstractDemo{
public static void main(String[] args){
Animal a = new Dog();
a.eat();
}
}
抽象类多态方式使用
abstract class Employee{
private String name;
private int id;
private int salary;
public Employee(){}
public Employee(String name, int id, int salary){
this.name = name;
this.id = id;
this.salary = salary;
}
public void setName(String name){
this.name = name;
}
public void setId(int id){
this.id = id;
}
public void setSalary(int salary){
this.salary = salary;
}
public String getName(){
return name;
}
public int getId(){
return id;
}
public int getSalary(){
return salary;
}
public abstract void work();
}
class Manager extends Employee{
private int money; // bonus 奖金
public Manager(){}
public Manager(String name,int id, int salary, int money){
super(name,id,salary);
this.money = money;
}
public void work(){
System.out.println(“跟客户谈需求”);
}
public void setMoney(int money){
this.money = money;
}
public int getMoney(){
return this.money;
}
}
class Programmer extends Employee{
public Programmer(){}
public Programmer(String name,int id, int salary){
super(name,id,salary);
}
public void work(){
System.out.println("按照需求写代码");
}
}
class AbstractTest{
public static void main(String[] args){
Employee emp = new Programmer();
emp.setName(“张柏芝”);
emp.setId(1);
emp.setSalary(1000);
System.out.println(emp.getName()+" “+emp.getId()+” “+emp.getSalary());
emp.work();
System.out.println(”---------------");
Employee emp1 = new Programmer(“张曼玉”,2,1111);
System.out.println(emp1.getName()+" “+emp1.getId()+” “+emp1.getSalary());
emp1.work();
System.out.println(”---------------");
Employee m = new Manager(); // 如果需要子类特有的 Manager m = new Manager();
m.setName(“张学友”);
m.setId(3);
m.setSalary(3000);
/*
m.setMoney(5000);
System.out.println(m.getName()+" “+m.getId()+” “+m.getSalary()+” “+m.getMoney());
*/
m.work();
System.out.println(m.getName()+” “+m.getId()+” "+m.getSalary());
Manager m1 = (Manager)m;
m1.setMoney(5000);
System.out.println(m1.getName()+" "+m1.getId()+" "+m1.getSalary()+" "+m1.getMoney());
}
}
抽象类中的小问题
abstract不能和那些关键字共存
private 冲突
final 冲突
static 无意义(报错冲突)