1.抽象类

当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但是有时候这些方法时无法确定的。

针对这种情况,Java提供了抽象方法来满足这种需求。

  • 抽象方法必须使用abstract关键字来修饰,并且在定义方法时不需要实现方法体。
  • 当一个类中包含了抽象方法,那么该类也必须使用abstract关键字来修饰,这种使用abstract关键字修饰的类就是抽象类。

抽象类以及抽象方法定义的基本语法如下。

//定义抽象类
[修饰符] abstract class 类名{
	//定义抽象方法
	[修饰符] abstract 方法返回值类型 方法名([参数列表]);
}
        

注意:

  • 包含抽象方法的类必须定义为抽象类,但抽象类中可以不包含任何抽象方法。
  • 抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的抽象方法,需要创建一个子类,在子类中实现抽象类中的抽象方法。
abstract class Animal{
    public abstract void shout();

}
class Dog extends Animal{

    @Override
    public void shout() {
        System.out.println("汪汪汪....");
    }
}
public class test extends Object{
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.shout();
    }
}

alt

注意: Java中一个类继承一个抽象类,必须实现抽象类中的抽象方法。非抽象方法可以不重写。

2.接口

如果一个抽象类中的所有方法都是抽象的,则可以将这个类定义为Java中的另一种形式——接口。

接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,它将抽象进行得更为彻底。

在JDK8中,接口中除了有抽象方法外,还可以有默认方法和静态方法(也叫类方法),默认方法用default修饰,静态方法用static修饰,并且这两种方法都允许有方法体。

其基本格式如下:

[修饰符] interface 接口名 [extends 父接口1,父接口2....]{
	[public] [static] [final] 常量类型 常量名=常量值;
	[public] [abstract] 方法返回值类型 方法名([参数列表]);
	[public] default 方法返回值类型 方法名([参数列表]){
		//默认方法体
	}
	[public] static 方法返回值类型 方法名([参数列表]){
		//默认方法体
	}
}

在上述语法中,“[]”中的内容是可选的。“extends 父接口1,父接口2....”表示定义一个接口时,可以同时继承多个父接口,这也是解决了单继承的限制

接口中可以包含三类方法:抽象方法,默认方法和静态方法。其中静态方法可以通过“接口名.方法名”的形式来调用,而抽象方法和默认方法只能调用,而抽象方法和默认方法只能通过接口实现类的实例对象来调用。因此需要定义一个接口的实现类,该类通过implements关键字实现当前接口,实现接口中的所有抽象方法

2.1 类与接口的实现方法

定义接口的实现类语法格式如下:

[修饰符] class 类名 [extends 父类名] [implements 接口1,接口2...]{
            ...
        }
interface Animal{
    //定义全局常量
    int num=10;
    int id=1;
    //定义抽象方法
    public void shout();
    //定义一个默认方法
    default void getType(String type){
        System.out.println("该动物属于:"+type);
    }
    //定义一个静态方法
    static int getId(){
        return Animal.id;
    }
}
class Dog implements Animal{
    @Override
    public void shout() {
        System.out.println("汪汪汪....");
    }
}
public class test{
    public static void main(String[] args) {
        System.out.println(Animal.getId());  //通过接口名调用类方法 
        Dog dog = new Dog();    //创建dog类的实例对象 
        System.out.println(dog.num);    //在实现类中获取接口全局常量 
        dog.shout();    
        dog.getType("犬科");  //调用接口默认方法
    }
}

alt

2.2 接口与接口之间的关系

interface Animal{
    //定义全局常量
    int num=10;
    int id=1;
    //定义抽象方法
    public void shout();
    //定义一个默认方法
    default void getType(String type){
        System.out.println("该动物属于:"+type);
    }
    //定义一个静态方法
    static int getId(){
        return Animal.id;
    }
}
interface LandAnimal extends Animal{
    void run();
}
class Dog implements LandAnimal{
    @Override
    public void shout() {
        System.out.println("汪汪汪....");
    }

    @Override
    public void run() {
        System.out.println("狗在陆地上跑...");
    }
}
public class test{
    public static void main(String[] args) {
        System.out.println(Animal.getId());  //通过接口名调用类方法
        Dog dog = new Dog();    //创建dog类的实例对象
        System.out.println(dog.num);    //在实现类中获取接口全局常量
        dog.shout();
        dog.getType("犬科");  //调用接口默认方法
        dog.run();
    }
}

alt