Java抽象类

来源:互联网 发布:淘宝新规则2016及处罚 编辑:程序博客网 时间:2024/06/10 09:49

什么是抽象类?

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类

abstract关键字

abstract修饰类

         Java定义由abstract关键字修饰的类叫抽象类, 抽象类可以有构造方法,成员变量,方法等,它和普通类的区别是抽象类不能实例化,在其他方面和普通类并没有什么区别,所以抽象类只能被继承,抽象类就是为继承而存在的。

        abstract修饰方法

          abstract修饰的方法是抽象方法,只有方法的声明而没有方法的实现。语法格式:
public abstract int abstractMethod( int a );
          含有抽象方法的类一定是抽象类,但是我们也可以定义一个没有抽象方法的类是抽象类,你可能疑惑没有抽象方法为什么还要定义为抽象类,这里只有记住这个概念就好,没必要深究。
          如果子类继承了抽象类,就必须重写抽象类中的全部抽象方法,如果没有重写全部的抽象方法则必须声明其子类也是抽象类。

         注意:

  •  abstract不能和final一起使用
     final修饰的类不能被继承,final修饰的方法不能被重写,而抽象类就是用来被继承的,两者冲突。
  •  abstract不能和private一起使用       
             因为private修饰的方法不能被子类重写。
  • abstract不能修饰属性
             因为属性是不能多态的
  •  抽象类可以有构造器
             抽象类的构造器是用来给属性初始化的,并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
  •  抽象类是否可以有静态方法
            抽象类可以有静态方法,依然用类名来调用
  • abstract不能和static一起使用
  • abstract不能修饰构造器

抽象类应用场景

     系统类库中常见,如果抽象类只需要一个特定的系统子类操作,所以可以忽略掉外部子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。 

abstract class A{//定义一个抽象类    public abstract void print();    private static class B extends A{//内部抽象类子类        public void print(){//覆写抽象类的方法            System.out.println("Hello World !");        }    }    public static A getInstance(){        return new B();    }}public class TestAbstract {    public static void main(String[] args) {        //此时取得抽象类对象的时候完全不需要知道B类这个子类的存在        A a = A.getInstance();        a.print();    }}
     模板方法设计模式

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

解决的问题:

  • 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
  • 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

原创粉丝点击