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

  • 相关阅读:
    常用css3属性
    jQuery瀑布流
    jQuery事件对象
    jQuery动画
    面向对象复习
    php 面向对象
    git
    存储数据
    ajax
    对象
  • 原文地址:https://www.cnblogs.com/niujifei/p/14090006.html
Copyright © 2011-2022 走看看