Java—抽象类和接口

一、抽象类

1.为什么要有抽象类?

当定义一个类时,需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。如:定义一个Animal类,用shout()方法表示动物的叫声,不同的动物有不同的叫声,所有无法在shout()方法中准确描述动物的叫声,针对这种情况,Java就提供了抽象方法来满足。

2.抽象类和抽象方法定义的格式:

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

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

注意:

  1. 包含抽象方法的类必须定义为抽象类,但抽象类可以不包含任何抽象方法

  2. 抽象类不可以被实例化,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用

  3. 如果想要调用抽象类中的定义的抽象方法,需要创建一个子类,在子类中实现抽象类中的抽象方法

  4. 定义抽象方法只需要在普通方法上增加abstract关键字。如:public abstract void shout();

3.如何实现抽象类中的方法?

//定义抽象类
abstract class Animal{
    //定义抽象方法
    public static void shout() {
    }
}
//定义Dog类继承抽象类Animal
class Dog extends Animal{
    //实现抽象方法shout(),编写方法体
    public static void shout(){
        System.out.println("wangwang……");
    }
}
public class Demo01 {
    public static void main(String[] args) {
        //创建Dog类实例对象
        Dog dog=new Dog();
        //调用dog对象的shout()方法
        Dog.shout();
    }
}

二、接口

如果一个抽象类中的所有方法都是抽象的,则可以将这个类定义为 Java 中的另一种形式——接口。**接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,**它将抽象进行得更为彻底。
在 JDK 8中,接口中除了抽象方法外,还可以有默认方法和静态方法(也叫类方法),默认方法使用 default 修饰,静态方法使用 static 修饰,并且这两种方法都允许有方法体。与定义类不同的是,在定义接口时,不再使用 class 关键字 而是使用 interface 关键字来声明。

1.接口定义的基本语法格式如下:

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

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

在接口内部可以定义多个常量和抽象方法,定义常量时必须进行初始化赋值,定义默认方法和静态方法时,可以有方法体。

从接口定义的语法格式可以看出,接口中可以包含三类方法,抽象方法、默认方法和静态方法,其中静态方法可以通过“接口名,方法名"的形式来调用,而抽象方法和默认方法只能通过接口实现类的实例对象来调用,因此需要定义一个接口的实现类,该类通过 implements 关键字实现当前接口,**并实现接口中的所有抽象方法。**需要注意的是,**一个类可以在继承另一个类的同时实现多个接口,**并且多个接口之间需要使用英文逗号(,)分隔。

[修饰符] class 类名 [extends 父类名] [implements 父接口1,父接口2,……]{
    
}

2.接口的实现与方法的调用

//定义Animal接口
interface Animal{
    int ID=1;//全局常量
    viod breathe();//抽象方法breathe()
    //默认方法
    default void getType(String Type){
        System.out.println("该动物属于:"+Type);
    }
    //静态方法
    static void getID(){
        return Animal.getID;
    }
}
class Dog implements Animal{
    //实现breathe()方法
    public void breathe(){
        System.out.println("狗在呼吸");
    }
}
//测试类
public class Demo02 {
    public static void main(String[] args) {
        System.out.println(Animal.getID);//静态方法的调用
        Dog dog=new Dog();
        System.out.println(dog.ID);//获取常量值
        dog.breathe();//调用dog对象breathe方法
        dog.getType();//通过接口实现类Dog的实例化对象,调用接口默认方法
    }
}

Dog 类通过 implements 关键字实现了 Animal 接口,并实现了接口中的抽象方法 breathe ()。 通过接口实现类 Dog 的实例化对象可以访问接口中的常量、接口实现方法以及默认方法,而接口中的静态方法则可以直接使用接口名调用。需要注意的是,**接口的实现类,必须实现接口中的所有抽象方法,**否则程序编译报错。

3.接口的特点

  1. 在 JDK 8中,接口中除了抽象方法外,还可以有默认方法和静态方法,并且这两种方法都允许有方法体,静态方法可以通过“接口名,方法名"的形式来调用

  2. 当一个类实现接口时,如果这个类是抽象类,只需要实现接口中的部分抽象方法即可,否则需要实现接口中的所有抽象方法

  3. 一个类可以通过implements关键字同时实现多个接口,并且多个接口之间需要使用英文逗号(,)分隔

  4. 接口之间可以通过extends关键字实现继承,并且一个接口可以同时继承多个接口,接口之间需要使用英文逗号(,)分隔

  5. 一个类可以在继承另一个类的同时还可以实现接口,此时,extends关键字必须位于implements关键字之前。

    eg:

    class A extends B implements C{
        
    }
    
  • 43
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值