Java面向对象(四)
1.抽象类
概括:抽象类中可以有一些方法但又无须提供它的实现,通过子类实现抽象类中的抽象方法。
举例:
abstract class Animal3{
public abstract void shout();
}
class Dog3 extends Animal3{
public void shout(){
System.out.println("汪汪");
}
}
public class Page117 {
public static void main(String[] args) {
Dog3 dog=new Dog3();
dog.shout();
}
}
注意:
- 一个类中包含抽象方法那么它一定是抽象类
- 抽象类中可以不包含抽象方法
- 抽象类不可以被实例化
- 抽象方法没有方法体,不可以被调用,需要在子类中实现抽象方法
2.接口
概括:接口是特殊的抽象类,它不能包含普通方法,内部所有方法都是抽象方法。JDK8中对接口进行了重新定义,接口中除抽象方法外还可以有默认方法和静态方法(也叫类方法),分别用default和static修饰,且两种方法都允许有方法体。与定义类不同的是,定义接口不再使用class关键字,而是使用interface关键字。
语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2,...]{
[public] [static] [final] 常量类型 常量名=常量值;
[public] [abstract] 方法返回值类型 方法名([参数列表]);
[public] default 方法返回值类型 方法名([参数列表]){
//默认方法方法体
}
[public] default 方法返回值类型 方法名([参数列表]){
//静态方法方法体
}
}
注意:
- 定义常量时必须进行初始化赋值
- 接口可以同时继承多个父接口
- 定义常量时可省略public static final,接口会默认添加,同理定义抽象方法可以省略public abstract,定义默认方法和静态方法可省略public
静态方法可以通过接口名.方法名调用,而抽象方法和默认方法只能通过接口实现类的实例对象来调用,接口的实现类必须实现接口中的所有抽象方法,通过implements关键字来实现接口,一个类可以在继承另一个类的同时实现多个接口
语法:
[修饰符] class 类名 [extends 父类名] [implements 接口1,接口2,...]{
}
举例:
interface Animal4{
int ID=1; //全局常量
void breathe(); //抽象方法
default void getType(String type){
System.out.println("该动物属于"+type);
}
static int getID(){
return Animal4.ID;
}
}
class Dog4 implements Animal4{
public void breathe(){
System.out.println("狗在呼吸");
}
}
public class Page118 {
public static void main(String[] args) {
System.out.println(Animal4.getID());
Dog4 dog=new Dog4();
System.out.println(dog.ID);
dog.breathe();
dog.getType("犬类");
}
}
注意:
- 这种情况也是ok的,接口2继承(extend)接口1,类实现(implements)接口2
- 一个类实现接口时,如果它是抽象类,那么只需要实现接口中部分抽象方法即可,否则要实现全部抽象方法
- 一个类可以通过implements同时实现多个接口,
- 一个接口可以通过extends同时继承多个接口
- 一个类继承一个类的同时还可以实现接口,class A extends B implements C{} //先继承再实现