一.概述
Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。
二.实例
小黑和小白是两个不同的人,都是人所以可以抽取出公共属性人,有吃,计算,sayHi方法
abstract class Person {
//有构造器
public Person() {
System.out.println("------person-------");
}
//不能使用final和private修饰
//不能用static修饰,不能用native和synchronize修饰
abstract void eat();
abstract int addNum(int x, int y);
//抽象类能有普通方法
public void sayHi() {
System.out.println("Hi");
}
//能定义变量
//int i = 0;
}
小白和小黑喜欢吃的东西不一样;小白会计算,小黑不会
public class Person_XiaoBai extends Person {
public Person_XiaoBai() {
System.out.println("-----小白会计算-----");
}
//非抽象类不能有抽象方法
//abstract void money();
//必须实现person的抽象方法,除非这个类也是抽象类
@Override
void eat() {
System.out.println("xiaobai_eat rice");
}
@Override
int addNum(int x, int y) {
System.out.println(x + y);
return x + y;
}
}
public class Person_XiaoHei extends Person{
public Person_XiaoHei(){
System.out.println("-----小黑不会计算-----");
}
@Override
void eat() {
System.out.println("xiaohei_eat meat");
}
@Override
int addNum(int x, int y) {
System.out.println("0");
return 0;
}
}
public class Test {
public static void main(String[] args) {
//抽象方法不能实例化
//Person person = new Person();
Person person1 = new Person_XiaoBai();
person1.eat();
person1.addNum(1, 3);
person1.sayHi();
//System.out.println(person1.i);
Person person2 = new Person_XiaoHei();
person2.eat();
person2.addNum(1, 3);
person2.sayHi();
}
}
三.小结
抽象类作用:
定义了一个模板(子类的公共部分),已经实现的方法可以代码复用,待实现的方法限制子类的功能
其他问题:
1.抽象类有构造器
2.抽象类不能被实例化,抽象类是一个残缺的类所以不能被实例化
3.抽象类里可以有普通方法和定义变量,但是有抽象方法的一定是抽象类
4.子类需要重写全部抽象方法,否则子类也定义为抽象类
5.抽象类内部可以有static的子类继承这个抽象类,继承的时候使用“外部类.内部类”的形式表示类名称
6.抽象方法没有方法体
7.抽象方法不能使用final和private修饰,抽象类就是为了被继承的
8.不能用static修饰,抽象方法没有方法体,无法被初始化,不能用native和synchronize修饰
//个人理解,有不对的地方希望指出
//2021-6-16