抽象方法以及抽象类

在Java中用abstract修饰的类是抽象类,用abstract修饰的类的方法是抽象方法,抽象类和抽象方法用法总结如下。

  1. abstract可以修饰class表示抽象类,可以修饰方法表示抽象方法,但是不能修饰成员变量,也就是没有抽象的成员变量。
  2. 用abstract修饰的类中可以有abstract方法,也可以没有abstract方法;可以有非abstract方法,也可以没有非abstract方法。
  3. 只有abstract类中才能声明abstract方法,abstract方法不能声明在非abstract类中。
  4. abstract类可以是外部类,也可以是内部类。abstract类如果是外部类,不能用private修饰;abstract类如果是内部类,可以用private修饰。
  5. abstract方法不能有方法体,abstract方法必须对其子类可见,即不能用private修饰。
// abstract类中可以没有abstract方法,但有abstract方法的类必须定义为abstract类
abstract class C3 {
    // abstract类中可以有成员变量,但成员变量不能用abstract修饰
    private int mPara;
    // abstract方法不能有方法体,abstract方法不能是private
    public abstract void setPara(int para);
    // 抽象类中可以有非抽象方法
    public int getPara(){
        return mPara;
    }
}
  1. abstract类可以继承自其他类,这个父类可以是abstract类,也可以是非abstract类。如果它继承自abstract类,它可以选择实现其父类中的abstract方法,也可以不实现。
  2. abstract类可以实现一个接口。它可以选择实现接口中的接口方法,也可以不实现。
  3. abstract类只有被继承时才有用,它的子类可以是abstract类,也可以是非abstract类。如果它的子类是abstract类,则会自动继承所有其所有的abstract方法,abstract子类中也可以定义新的abstract方法,如果它的子类是非abstract类,则子类必须实现其所有的abstract方法。
  4. abstract类可以用来定义变量,但不能实例化,也就是不能通过new来构造一个abstract类的对象。abstract类定义的变量可以被赋值为其非abstract子类的对象。
  5. abstract类中可以有构造方法,抽象类的构造方法不能是抽象方法。
  6. abstract类和abstract方法都不能用final修饰。

接口

在Java中用interface来定义一个接口,接口用法总结如下。

  1. interface只能用来定义接口,不能用来修饰类,成员变量或成员方法。
  2. interface中可以有成员变量,成员变量一定是public static
    final的,但允许在声明变量时仅指定部分修饰符。但即使没有添加public,static,final中任何一个修饰符,该变量仍然是public、static、final的。此外,由于final成员变量必须在定义时初始化,因此,接口类中定义的成员变量必须在定义时赋值。赋值可以用常量表达式,也可以用任意在该接口中能够访问的对象组成的表达式。例如:
private interface I1 {
    //len是public static final的,len必须被初始化
    int len = String.valueOf(new GregorianCalendar().getTimeInMillis()).length();
}
  1. interface中的成员变量在实现该接口的类中可以直接使用,在没有实现该接口,但是可见该接口的类中可以通过“接口名.成员变量名”来访问。例如:用I1.len来访问上述例子中的接口中定义的len成员变量。
  2. interface中可以有成员方法,成员方法都是public abstract的抽象方法,不能有方法体。允许声明成员方法时指定部分或不指定修饰符,但即使没有添加public abstract中任何一个修饰符,该成员方法仍然是public abstract的。
  3. 一个接口可以继承自其他接口。接口之间的继承用extends关键字,不能用implements。一个接口可以继承多个其他接口。多个接口之间用逗号分隔。例如:private interface I1 extends I2, I3{}
  4. 一个接口不能继承自任何类,包括抽象类。
  5. 一个非抽象类如果实现了某个接口,它必须要实现该接口中声明的所有的抽象方法。一个抽象类如果实现了某个接口,它可以实现该接口中声明的抽象方法,也可以不实现。
  6. 接口可以用来定义变量,但不能实例化,也就是不能通过new来构造一个接口的对象。接口定义的变量可以被赋值为实现该接口的类的对象。
  7. 接口中没有构造方法。接口不能用final修饰。
  8. 接口中可以定义内部类和内部接口