一、接口
接口:用来描述类应该做什么,而不指定它们应该怎么做。一个类可以实现一个或多个接口,当有些要求符合一些接口时,就可以使用实现了这个接口的类。
接口的特点:
- 在
Java
中,接口不是类,而是对希望符合这个接口的类的一组需求 - 接口中的所有方法都是
public
方法,因此,在接口中声明方法时,可以省略public
修饰符 - 接口中的字段都是
public static final
的 - 不能用
new
实例化一个接口,但是可以声明一个接口 - 可以用继承的方式扩展接口
- 一个类可以同时实现多个接口,多个接口间通过逗号分隔
二、抽象类
抽象类:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类的特点:
- 抽象类是不能被实例化的,但是它的其他功能和普通类类似,变量、方法等使用方式与普通类一样;
- 也正是因为抽象类不能被实例化,所以,抽象类只能被继承使用。
废话少说,上代码:
- 首先看抽象类的代码,包括一个构造器、两个变量(公有及私有)、一个抽象方法、一个私有方法及两个公有方法。
/**
* 抽象类(父类)
*/
public abstract class TestAbstract {
//构造器
public TestAbstract(){
System.out.println("TestAbstract()");
}
//公有及私有变量
String testStr1="testStr1";
private String testStr2="testStr2";
//抽象方法
public abstract void testFun1();
//私有方法
private void testFun2(){
System.out.println("testFun2()");
}
//获取私有变量
public void testFun3(){
System.out.println("testStr2:"+testStr2);
}
//调用私有方法
public void testFun4(){
testFun2();
}
}
- 再来看子类的代码,包括一个构造器、一个重写父类的方法、一个
main
方法。
/**
* 子类(继承抽象类)
*/
class TestAbstractSon extends TestAbstract{
//构造器
public TestAbstractSon(){
System.out.println("TestAbstractSon()");
}
//重写父类的方法体
@Override
public void testFun1() {
System.out.println("testFun1()");
}
//main方法
public static void main(String[] args) {
TestAbstractSon testAbstractSon=new TestAbstractSon();
System.out.println("testStr1: "+testAbstractSon.testStr1);
// System.out.println(testAbstractSon.testStr2);//父类的私有变量不能直接使用
testAbstractSon.testFun1();
// testAbstractSon.testFun2();//父类的私有方法不能直接使用
testAbstractSon.testFun3();
testAbstractSon.testFun4();
}
}
- 结果展示如下,由结果可以看出,在实例化对象之前,子类会先去调用父类的构造器,然后再调用本类的构造器。
TestAbstract()//在实例化之前,先调用父类构造器
TestAbstractSon()//在实例化时,调用本类的构造器
testStr1: testStr1
testFun1()
testStr2:testStr2
testFun2()
抽象类虽然不能被实例化,但是它还是有构造器的,那么它为什么还会有构造器呢?这是因为子类只能访问自己的成员,而不能访问父类中的成员。只有父类的构造器才有权限来对自己的成员进行初始化。因此,必须让所有的构造器都得到调用,否则就不能正确构造出完整对象。
值得注意的是,如果一个子类继承了抽象类,那么子类就必须实现父类中所有的抽象方法,如果不这样做,那么子类也是抽象类,编译器会强制我们用abstract
关键字来修饰这个类。
三、抽象类和接口的区别
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;
- 抽象类中的方法可以有方法体,但是接口中的方法不能有方法体;
- 接口中不能含有静态代码块以及静态方法(JDK 1.8 以后,接口里可以有静态方法和方法体),而抽象类中可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
网友评论