概述
在java中,有各种修饰符,如abstract、static、final等,今天主要总结 abstract!
一. 抽象类
1. 基本简介
abstract是Java中的一个修饰符,表示“抽象的”,只能用来修饰类和方法,不能修饰属性。如果用来修饰类,表示该类是一个抽象类;如果用来修饰方法,表示该方法是一个抽象方法。
2. 特别注意
以下是不能用abstract来修饰:private私有的、static静态的、final方法和final类;
3. 什么是抽象?
1、抽象是一个概念,即在现实中不存在,存在于虚拟中;
2、但是计算机可以模拟虚拟世界,创建一个抽象的类,来实现不同的操作
3、例如:"动物"、"人"、"车" 这是一个概念,人们对于某一种东西或事物的统称,即称之为 概念,而非一个具体的实物;
4、抽象类的作用:
4.1、将方法抽象化,由子类扩展发挥;共同性的方法具体化,由所有子类继承。
4.2、创建一个动物园对象,对象里面定义不同的动物;但是每个动物都有自己不同的习惯,这个时候将 这种习惯定义为一个抽象方法。父类不去实现,由子类去扩展实现,也就是让每一个动物的负责人去观察实现。但是不能new出实例化创建对象;
5、抽象类的创建:
//抽象类
abstract class Zoo{
//抽象方法
public abstract string Animal(string name) ;
}
6、抽象方法:
抽象方法是一种没有任何实现的方法,该方法的具体实现由子类来完成。抽象方法由abstract修饰,不能和final、static、private共同使用。如果一个类包含了若干个抽象方法,那么该类必须声明为抽象类,但抽象类中可以不包含抽象方法
1、抽象方法由abstract修饰,不能和final、static、private关键词共同使用;
2、抽象方法只有方法的声明,但没有方法体;
3、抽象方法必须存在于抽象类中;
4、子类继承父类时,必须重写父类中所有的抽象方法,除非自己也是抽象类;
二. 抽象类的特性
1、抽象类不能被实例化,即不能创建抽象类的对象,一般是由子类进行实例化完成相关操作,声明抽象类的目的主要是为了对该类进行扩展;
2、抽象类中可以有N个抽象方法,也可以有N个非抽象方法,抽象方法并不是必须的;
3、抽象类中可以没有抽象方法,但如果一个方法是抽象方法,其所在的类必须是抽象类,否则编译阶段就报错;
4、由于抽象类不能实例化对象,所以抽象类必须被继承后才能被使用;
5、如果一个类继承了抽象类,该类要么重写抽象类中的所有抽象方法,要么自己也抽象化;
6、一个类不能同时被abstract和 final 修饰,因为抽象类需要被子类继承,而final类不能被继承。
三、抽象类的案例:
//抽象父类
public abstract class Zoo{
//抽象方法
public abstract String Animal(String name) ;
}
//子类 去扩展父类的抽象方法
public class AnimalType extends Zoo{
public String Animal(String name) {
String mesage = "";
switch (name) {
case "SZ":
mesage = name + "爱咆哮";
break;
case "LH":
mesage = name + "爱狩猎";
break;
case "XM":
mesage = name + "爱睡觉";
break;
case "":
mesage = "动物都不见了";
break;
}
return mesage;
}
}
//测试
public class Test4 {
public static void main(String[] args) {
Zoo zo = new AnimalType();
String msg = zo.Animal("SZ");
String msg2 = zo.Animal("LH");
System.out.println(msg);
//打印出: SZ爱咆哮
System.out.println(msg2);
//打印出: LH爱狩猎
}
}
四. 面向抽象编程
1、父级代码只定义规范,如Person类;
2、具体的业务逻辑由不同的子类实现,调用者并不关心。
五、抽象总结
1、抽象类和抽象方法都要使用abstract关键字声明;
2、抽象类不能被实例化,不能使用 new关键字创建对象,抽象类的非抽象子类可以创建对象;
3、抽象类中不一定包含抽象方法,但有抽象方法的类必须是抽象类;
4、一个抽象类中可以有0~n个抽象方法,也可以有0~n个具体方法;
5、抽象类中的抽象方法只是声明,不包含具体实现;
6、构造方法、静态方法、final方法不能声明为抽象方法;
7、抽象类的子类必须实现抽象方法,除非该子类也是抽象类;
8、面向抽象编程使得调用者只须关心抽象方法的定义,而不必关心子类的具体实现