今天的博客主题
Java面向对象 ——》Java抽象类
抽象类
在面向对象中,所有的对象都是通过类来描述一类对象。
并不是所有的类都是用来描述对象的。
如果没有足够的信息来描述一个具体的对象,那这个类可以被称为抽象类。
抽象类是所有子类的公共属性集合。
抽象类至少会包含一个或多个抽象方法。
抽象类可以是看做是对类的进一步抽象。
通过关键字 abstract 来声明一个抽象类
抽象方法
抽象方法也是通过关键 abstract 来声明的
abstract void methodA();
这就是一个抽象方法,可以看出与普通方法的区别就是,抽象方法没有具体的方法体。
抽象类原则
1)抽象类不能被实例化,实例化的工作由子类来完成,它只需要有一个引用即可
2)子类必须重写抽象类里的抽象方法
3)类中只要有一个抽象方法,该类必须定义成抽象类,不管是不是还有其他方法
4)抽象类可以没有抽象方法,可以有具体的普通方法
5)子类中的抽象方法不能与父类的抽象方法同名
6)abstract 关键字不能与 final 关键字来一起修饰一个类
7)abstract 不能与 private、static、final、native 修饰同一个方法
代码示例
// 人类 声明为一个抽象类。 在多态中示例 Person类 表示很无奈
public abstract class Person {
// 人类 所能做的工作很抽象,不能覆盖很全。就把他作为一个抽象方法
abstract void work(String work);
// 可以有普通的具体方法。子类在怎么实现重写,还是要吃饭,这个方法就可以不抽象
void eat(){
System.out.print("吃饱饭才有力气工作!");
}
}
// 学生类 继承 人类,来实现具体的工作方式
public class Student extends Person{
@Override
void work(String work) {
System.out.println("学生类 " + work);
}
}
// 老师类 也是这样
public class Teacher extends Person{
@Override
void work(String work) {
System.out.println("老师类 " + work);
}
}
// 同样可以扩展许多人类职业
// 测试
public static void main(String[] args) {
Person p = new Student();
p.eat();
p.work("听课");
p = new Teacher();
p.eat();
p.work("讲课");
TestAbst(new Student(),"s 听课");
TestAbst(new Teacher(),"t 讲课");
}
public static void TestAbst(Person p, String work){
p.eat();
p.work(work);
}
// 输出结果
吃饱饭才有力气工作! 学生类 听课
吃饱饭才有力气工作! 老师类 讲课
吃饱饭才有力气工作! 学生类 s 听课
吃饱饭才有力气工作! 老师类 t 讲课
注意:当以下任一条件成立时,类必须定义成抽象类
1)类中有至少一个抽象方法
2)类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现
3)类实现了某个接口,但没有全部实现接口中的方法(接口是一个特殊的抽象类)