一、抽象
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 classAnimal {2 public voidrun();3 }4 public class Cat extendsAnimal {5 public voidrun (){6 System.out.println("小猫在墙头走~~~");7 }8 }9 public classCatTest {10 public static voidmain(String[] args) {11 //创建子类对象
12 Cat c = newCat();13 //调用run方法
14 c.run();15 }16 }17 输出结果:18 小猫在墙头走~~~
注意:此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法。
2、抽象类的匿名子类
1 public classPersonTest {2
3 public static voidmain(String[] args) {4
5 method(new Student());//匿名对象
6
7 Worker worker = newWorker();8 method1(worker);//非匿名的类非匿名的对象
9
10 method1(new Worker());//非匿名的类匿名的对象
11
12 System.out.println("********************");13
14 //创建了一匿名子类的对象:p
15 Person p = newPerson(){16
17 @Override18 public voideat() {19 System.out.println("吃东西");20 }21
22 @Override23 public voidbreath() {24 System.out.println("好好呼吸");25 }26
27 };28
29 method1(p);30 System.out.println("********************");31 //创建匿名子类的匿名对象
32 method1(newPerson(){33 @Override34 public voideat() {35 System.out.println("吃好吃东西");36 }37
38 @Override39 public voidbreath() {40 System.out.println("好好呼吸新鲜空气");41 }42 });43 }44
45
46 public static voidmethod1(Person p){47 p.eat();48 p.breath();49 }50
51 public static voidmethod(Student s){52
53 }54 }55
56 class Worker extendsPerson{57
58 @Override59 public voideat() {60 }61
62 @Override63 public voidbreath() {64 }65
66 }
3、抽象类应用
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
六、扩展:不能和 abstract 一起使用的修饰符
1、final:和 final 不能一起修饰方法和类
2、static:和 static 不能一起修饰方法
3、native:和 native 不能一起修饰方法
4、private:和 private 不能一起修饰方法