一、抽象
1、抽象类
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。
我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。
2、定义
抽象方法:没有方法体的方法
抽象类:包含抽象方法的类。
二、abstract 关键字
1、抽象类
用abstract关键字来修饰一个类, 这个类叫做抽象类。
如果一个类包含抽象方法,那么该类必须是抽象类。
定义格式:
abstract class 类名字 {
// 方法体
}
抽象类:
(1)抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。
(2)若没有重写全部的抽象方法,仍为抽象类。
2、抽象方法
用abstract来修饰一个方法, 该方法叫做抽象方法,只有方法的声明,没有方法的实现。
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
定义格式:
修饰符 abstract 返回值类型 方法名 (参数列表);
3、abstract 注意事项
(1) 不能用 abstract 修饰变量、代码块、构造器;
(2)不能用 abstract 修饰私有方法、静态方法、final 的方法、final 的类;
三、抽象类
(1)抽象类不能创建对象(实例化),如果创建,编译无法通过而报错,只能创建其非抽象子类的对象;
(2)抽象类中,可以有构造方法,是供子类创建对象(实例化)时,初始化父类成员使用的;
(3)抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。(不包含抽象方法但声明为抽象类,是为了不能创建该类的对象);
(4)抽象类的子类,必须重写抽象类中所有的抽象方法,否则,编译无法通过而报错,除非该子类也是抽象类。
四、抽象方法
(1)抽象方法只有方法的声明,没有方法体;
(2)包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
(3)若子类重写了父类中的所有的抽象方法后,此子类方可实例化;
(4)若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰;
五、抽象的应用
1、抽象类和抽象方法的应用
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。
最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
Demo:
1 public abstract class Animal {
2 public void run();
3 }
4 public class Cat extends Animal {
5 public void run (){
6 System.out.println("小猫在墙头走~~~");
7 }
8 }
9 public class CatTest {
10 public static void main(String[] args) {
11 // 创建子类对象
12 Cat c = new Cat();
13 // 调用run方法
14 c.run();
15 }
16 }
17 输出结果:
18 小猫在墙头走~~~
注意:此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法。
2、抽象类的匿名子类
1 public class PersonTest {
2
3 public static void main(String[] args) {
4
5 method(new Student());//匿名对象
6
7 Worker worker = new Worker();
8 method1(worker);//非匿名的类非匿名的对象
9
10 method1(new Worker());//非匿名的类匿名的对象
11
12 System.out.println("********************");
13
14 //创建了一匿名子类的对象:p
15 Person p = new Person(){
16
17 @Override
18 public void eat() {
19 System.out.println("吃东西");
20 }
21
22 @Override
23 public void breath() {
24 System.out.println("好好呼吸");
25 }
26
27 };
28
29 method1(p);
30 System.out.println("********************");
31 //创建匿名子类的匿名对象
32 method1(new Person(){
33 @Override
34 public void eat() {
35 System.out.println("吃好吃东西");
36 }
37
38 @Override
39 public void breath() {
40 System.out.println("好好呼吸新鲜空气");
41 }
42 });
43 }
44
45
46 public static void method1(Person p){
47 p.eat();
48 p.breath();
49 }
50
51 public static void method(Student s){
52
53 }
54 }
55
56 class Worker extends Person{
57
58 @Override
59 public void eat() {
60 }
61
62 @Override
63 public void breath() {
64 }
65
66 }
3、抽象类应用
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
六、扩展:不能和 abstract 一起使用的修饰符
1、final:和 final 不能一起修饰方法和类
2、static:和 static 不能一起修饰方法
3、native:和 native 不能一起修饰方法
4、private:和 private 不能一起修饰方法