zoukankan      html  css  js  c++  java
  • Java 面向对象(十三):面向对象特征之四:抽象性

    一、抽象

      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 不能一起修饰方法

  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/niujifei/p/14090006.html
Copyright © 2011-2022 走看看