abstract:
* abstract修饰类: 抽象类 * > 此类不能被实例化 * > 抽象类中一定要有构造器, 便于子类对象实例时调用(涉及子类对象实例化过程) * > 开发中,都会提供抽象类的子类,让子类对象实例化.完成相关操作 * * * * abstract修饰方法: 抽象方法 * > 只有方法的声明没有方法体 * > 如果类中有抽象方法 那么这个类必须也是抽象的(包含抽象方法的类一定是抽象类) * > 若子类重写了父类中的所有的抽象方法后,方可实例化, 若子类没有重写父类中的抽象方法 则子类也是个抽象类 也需要abstract修饰
* abstract 不能用来修饰: 属性, 方法, 构造器等结构
* abstract 不能修饰: 私有方法 静态方法(加上static不认为是重写), final方法, final类
abstract class PP{ int age; public PP(){}; public PP(int age){ this.age = age; } public abstract void eat(); // 父类有抽象方法 子类必须重写这个方法 } class Pson extends PP{ public void eat(){ // 重写父类的抽象方法 } }
思考题:
1: 为什么抽象类不可以被final声明:
因为抽象类是需要被继承的 如果被final声明就不可以被继承此类就是个无用类了
2: 一个抽象类可以定义构造器吗?
可以, 因为抽象类虽然不可以实例化 ,但是子类实例化的时候需要调用父类的构造器
3:
编写一个Employee类,声明为抽象类, 包含如下三个属性:name,id,salary。 提供必要的构造器和抽象方法:work()。 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。
请使用继承的思想,设计CommonEmployee类和Manager类,要求类 中提供必要的方法进行属性访问。
abstract class Empty{ private String name; private int id; private double salary; public Empty(){}; public Empty(String name, int id, double salary){ super(); this.name = name; this.id = id; this.salary = salary; } public abstract void work(); // 抽象方法必须要是无方法体的 } class Mang extends Empty{ private double bonus; public void work(){ System.out.println("可以跑"); } }