主要内容
介绍抽象类
和接口
的特性,抽象类与接口之间之间的区别以使用上的选择
抽象类的特性
只声明而不提供任何实现的方法称为抽象方法,抽象方法用abstract
关键字修饰,若一个类中存在至少有一个抽象方法时,需要将这个类用abstract
修饰成为抽象类
- 抽象类创建:若使用
new
创建,必须要实现其中抽象方法 - 抽象方法的修饰:抽类方法不能使用
private、final
修饰,因为private、final
修饰的方法无法被继承,不使用abstract
修饰的方法需要实现方法体 - 抽象类的继承:一个抽象类可以使用
extends
继承另一个具体的类或抽象类,还可以用implements
继承另外的接口,使用的抽象类的子类若不是抽象类则需要实现父类的抽象方法 - 抽象类的选择:若多个类有一些通用的方法,又有部分具体的方法实现不一样,这时就可以抽象出来放到一个抽象类中
package inter;
//抽象类
public abstract class AbstractTest {
public AbstractTest() {
System.out.println("执行父类构造方法");
// TODO Auto-generated constructor stub
}
// 非抽象方法
public void display() {
System.out.println("AbstractTest.display()");
}
// 声明抽象方法
public abstract void abstractMethod();
public static void main(String[] args) {
TestExemple p = new TestExemple();
p.abstractMethod();
}
}
//继承并实现抽象父类
class TestExemple extends AbstractTest{
TestExemple(){
System.out.println("执行子类构造方法");
}
// 实现抽象方法
@Override
public void abstractMethod() {
System.out.println("实现的抽象方法");
// TODO Auto-generated method stub
}
}
接口的特性
接口使用interface
关键字声明,在接口中通常只声明方法而不提供方法体;接口可看做是一种特殊的抽象类,若一个抽象类中所有的方法都是抽象方法,而且这个抽象类中的数据成员都是final
常量,最好将这个抽象类设计为一个接口
- 接口中的变量:虽然可以使用
public static final
修饰但这是不必要的,因为默认就是静态的不可更改的常量,接口中的变量可以直接使用接口名来调用 - 接口中的方法:虽然可以使用
public abstract
修饰,但这不是必要的;Java8中可在接口中用default
定义默认方法,默认方法要有方法体,不能直接使用接口来调用,而要使用接口实现类的实例来调用;接口中使用static
修饰的方法为静态方法,需要有方法体,并且无论是否显式指定,静态方法总是使用public
修饰 - 接口继承:接口通过
implements
可以继承其他接口,并添加新的属性和方法;接口不能继承抽象类,但可以用extends
继承多个接口 - 接口中的修饰符:不能使用
native、synchronized、private、protected
修饰符 - 接口的创建方式:通常用接口的一个具体实现类创建,若直接创建接口,需要实现接口的方法
package intfs;
/**
* @author wonzeng
* 2020年7月10日
*/
//定义一个接口,还可以使用extends继承一个多个接口
public interface InterfaceTest {
int Default_Number = 300;
// 在接口中定义的常量默认具有public, static, final的属性
// 接口的实现类中不能修改,只能读取
// 接口中的变量定义时就必须初始化
// default关键字,声明默认接口,实现类中可以不用重写
public default void defaultMethod() {
System.out.println("接口中的默认方法");
}
// 静态方法
public static void staticMethod() {
System.out.println("接口中的静态方法");
}
// 没有实现的方法
public void waitAchieve();
// main方法
public static void main(String[] args) {
// 接口名调用静态方法
InterfaceTest.staticMethod();
// 接口名调用静态变量
System.out.println(InterfaceTest.Default_Number);
// 实现接口方式1
AcheiveImp imp = new AcheiveImp();
imp.waitAchieve();
// 实现接口方式2
InterfaceTest p = new InterfaceTest() {
@Override
public void waitAchieve() {
System.out.println("匿名内部类实现接口");
// TODO Auto-generated method stub
}
};
p.waitAchieve();
// 实现接口方式3
InterfaceTest p2=()->{
System.out.println("lambda实现接口中的方法");
};
p2.waitAchieve();
}
}
// 实现接口
class AcheiveImp implements InterfaceTest{
public AcheiveImp() {
// TODO Auto-generated constructor stub
}
//实现接口中的方法
@Override
public void waitAchieve() {
System.out.println("通过创建类实现接口中的方法");
// TODO Auto-generated method stub
}
}
抽象类和接口的区别
方法的区别:抽象类中可以有不抽象的方法,接口中除了default
修饰之外的其他方法都是抽象的方法
继承的区别:类与类之间、类与抽象类之间使用extends
继承,类与接口之间用implements
关键字实现,接口与接口之间继承使用extends
关键字,一个抽象类最多只能继承一个抽象类、可以实现多个接口
修饰符的区别:抽象类中的抽象方法必须要用abstract
修饰,而接口中的方法可以不用abstract
修饰
抽象类与接口的选择
当定义一个抽象的父类,若其中所有方法都是抽象的,可选择定义为接口
当定义一个抽象的父类,其中需要有不抽象的方法,可选择定义为抽象类