目录
一、抽象类
1、概念
抽象类是被声明为abstract的类,它可能包含也可能不包含抽象方法,抽象类不能被实例化,但是可以被子类化(也就是可以被继承)。
抽象类定义语法
public abstract class 类名 {
//定义一个抽象类
}
抽象方法定义语法
访问修饰符 abstract 返回值类型 方法名 ( 参数列表 ) ;
2、抽象类应用场景
一般来说,描述抽象的事物就要使用抽象类,比如动物、设备、几何图形等。
代码解读
package com.oxi.abstractclass;
public abstract class Animal {
//抽象方法是没有方法体的,因为方法体就是表示知道具体怎么去做这件事
public abstract void eat(); //方法体
//抽象类里可以不写抽象方法
}
package com.oxi.abstractclass;
public class Panda extends Animal{ //抽象类Animal被继承
@Override
public void eat() {
System.out.println("熊猫吃竹子");
}
}
package com.oxi.abstractclass;
public class Tiger extends Animal{ //抽象类Animal被继承
@Override
public void eat() {
System.out.println("老虎吃肉");
}
}
package com.oxi.abstractclass;
public class AnimalTest {
public static void main(String[] args) {
Animal p1=new Panda();
p1.eat();
Animal p2=new Tiger();
p2.eat();
}
}
注:
如果一个类继承于一个抽象类,那么这个类必须实现抽象类中的所有抽象方法,否则该类要被定义为抽象类。
抽象类不一定有抽象方法,但有抽象方法的一定是抽象类。
二、接口
1、概念
在软件工程中,软件与软件的交互很重要,这就需要一个共同的标准。每个程序员都应该能编写实现这样的标准方式,接口就是对标准的描述。
在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。方法主体仅适用于默认方法和静态方法。接口无法实例化——它们只能由类实现或由其他接口扩展。
接口声明可以包含方法签名,默认方法,静态方法和常量定义。具有实现的方法是默认方法和静态方法。
补:从上面的说明可知道,接口中没有构造方法。
2、接口定义
语法
[public] interface 接口名 { [public static final] 数据类型 变量名 =变量的值; //接口中定义变量,该变量是静态常量,在定义时必须赋值 返回值类型 方法名([参数列表]); //定义接口方法 default 返回值类型 方法名([参数列表]){ //接口中定义的默认方法,必须在JDK8及以上版本使用 [return 返回值;] } static 返回值类型 方法名([参数列表]){ //接口中定义的静态方法,必须在JDK8及以上版本使用 [return 返回值;] } private 返回值类型 方法名([参数列表]){ //接口中定义的私有方法,必须在JDK9及以上版本使用 [return 返回值;] } }// [ ]里的内容可写可不写
代码案例
package com.oxi.abstractclass.interfaceclass;
interface Test {
int number=10; //接口中的变量是静态常量
void show(); //接口中方法默认是抽象方法
default int pius(int a,int b){
return a+b;
} //这是默认方法,接口中的方法都是 public 型的
static int multiply(int a,int b){
return a*b;
} //这是静态方法,接口中的方法都是 public 型的
private String name(){
return "admit";
} //这是接口中定义的私有方法,必须在JDK9及以上的版本使用
}
3、接口继承
语法
[public] interface 接口名 extends 接口名1,接口名2,接口名3, …… ,接口名n {
}
注意:
接口可以多继承,这是Java中唯一可以使用多继承的地方,接口包含的变量都是静态常量,接口中包含的方法签名都是公开的抽象方法,接口中的默认方法和静态方法在JDK8及以上版本オ能定义,接口的私有方法必须在JDK9及以上版本オ能定义。接口编译完成后也会生成相应的class文件。
4、接口实现
语法
访问修饰符 class 类名 implements 接口名1,接口名2,接口名3, …… ,接口名n {
}
实现接口中的类必须实现接口中声明的所有方法。
一个类如果实现了一个接口,那么就必须实现这个接口中定义的所有抽象方法(包括接口通过继承关系继承过来的抽象方法),这个类被称为接口的实现类或者说子类。与继承关系一样,实现类与接口之间的关系是is-a的关系。
5、接口应用场景
一般来说,定义规则,定义约定时使用接口。
三、总结
抽象类和接口的区别
1.抽象类拥有构造方法,而接口没有构造方法;
2.抽象类可以定义成员变量、静态变量、静态常量,而接口中只能定义静态常量;
3.抽象类中的方法可以有受保护、默认的方法,而接口中的方法都是公开的(JDK9中可以定义的私有方法除外);
4.抽象类主要应用在对于抽象事物的描述,而接口主要应用在对于约定、规则的描述;
5.抽象类只能实现单继承,而接口可以实现多继承,接口只能继承接口,接口只能被实现。