抽象类小结
- 包含抽象方法的类叫做抽象类。如果类中存在抽象方法,必须将该类限定为抽象的(否则编译器报错)
- 抽象类使用abstract关键字来修饰,在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道子类如何实现这些方法或者说是从多个具有相同特征的类中抽象出一个抽象类,以这个类作为子类的末班,避免子类设计随意性。
- 抽象类中的方法分为两类,一类是可以带方法体的一般方法,一类是没有方法体的抽象方法,它只需要声明,不用实现。
abstract class shape{
public shape(){
system.out.println("hello");
}
abstract public int getlength();
abstract public int gethigh();
}
- 继承抽象类的子类来实现抽象方法。且所有的抽象方法都要提供方法体的定义(可以不这么做),否则子类仍是一个抽象方法。
- 由于抽象类创建对象是不安全的,所以抽象类不能用new创建对象。抽象类也可以没有任何抽象方法,例如为了阻止这个类产生任何对象,可以将这个类设置为抽象的。
- 它可以作为父类,也可以由父类的引用指向子类,子类必须继承父类,子类中会自动生成父类的方法,子类只要写出具体方法就可以。
接口小结
- 接口可以理解为一种特殊的类,本身也具有数据成员,抽象方法,(默认方法和静态方法在jdk8后加了进去),类是一种具体的实现体,而接口定义了某一批类所要遵守的规范,接口不关心这些类的内部数据,也不关心方法的实现细节,只规定这些类里必须提供的方法。
- 基本语法
//接口的定义
public interface 接口名 extends 父接口1,父接口2{//public 可以省略
(public static final) int name =10;//必须赋初值
(public abstract) int print();//括号里的内容可以省略,它是隐含存在的
(public) static int print1(){//public是隐含的,实现接口的类中方法时要显式使用public修饰符
方法体
}
(public) default int print2(){
方法体
}
}
//接口的实现
class 类名 extents 父类 implements 接口1,接口2{
类体部分,实现继承的父类和接口中的方法
}
- 因为接口中也有抽象方法,所以不能用new 直接创建对象,要用一个实现了该接口的子类创建对象才行。
- 与类相似,接口也有继承性,可用extends关键字来继承父接口的常量,抽象方法,默认方法,但不能继承静态方法。可继承多个父类的接口,用逗号隔开;
- 接口中静态方法可以直接用"接口名.静态方法"访问。默认方法要靠子类或子接口继承后new后才可以。
接口和抽象类的区别与联系
抽象类是一种对事物的抽象,而接口是一种对行为的抽象。抽象类是对整个类整体进行抽象,包括属性,行为,但是接口是对类局部(行为)进行抽象。抽象类是一种模板式设计,而接口是一种行为规范,是一种辐射式设计。
- 接口是一种特殊的类
- 抽象类必须使用public,procted修饰(如果用private修饰,那么子类无法继承,也就无法实现抽象方法)。默认缺省是public
- 抽象类可以有构造方法,接口没有(抽象类的构造方法可以被子类的构造方法调用,但不能声明其为抽象的。由于不能用抽象类直接创建对象,因此某些情况下在抽象类中定义构造方法是多余的)
- 具体的类可以继承一个抽象类,但可以实现多个接口
- 抽象类可以有普通成员变量,接口中没有
- 接口和抽象类都可以包含静态成员变量,但抽象类中可以自定义访问类型,接口默认 public static final
- 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用