Java 面向对象(十三):面向对象特征之四:抽象性 一、抽象 二、abstract 关键字 三、抽象类 四、抽象方法 五、抽象的应用 六、扩展:不能和 abstract 一起使用的修饰符

  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、抽象类应用

    抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

               Java 面向对象(十三):面向对象特征之四:抽象性
一、抽象
二、abstract 关键字
三、抽象类
四、抽象方法
五、抽象的应用
六、扩展:不能和 abstract 一起使用的修饰符

六、扩展:不能和 abstract 一起使用的修饰符

  1、final:和 final 不能一起修饰方法和类

  2、static:和 static 不能一起修饰方法

  3、native:和 native 不能一起修饰方法

  4、private:和 private 不能一起修饰方法