【第三章】面向对象——抽象类和接口

目录

0.引言

1.抽象类

1.1 理解抽象类

1.2 抽象类的语法格式

1.3 抽象类——代码尝试

2.接口

2.1 定义

2.2 接口的实现

2.3 代码尝试


0.引言

在Java中,抽象类是一种不能被实例化的特殊类,主要用作其他类的基类。抽象类的目的是为了提供一个共有的、被多个子类继承的结构,它可以包含抽象方法和非抽象方法。抽象方法是一种只有声明没有具体实现的方法,它定义了一个框架,强迫继承抽象类的子类去实现这些抽象方法,从而具体化父类中定义的行为。这种机制促进了高度的代码复用和多态性。

通过使用抽象类,开发者可以定义一个通用的模板,让子类根据具体需求实现细节,这种方式既保证了一致性,也提供了灵活性。例如,一个抽象类`Shape`可以定义一个抽象方法`draw()`,而它的子类`Circle`、`Square`等则分别实现具体的绘制方法。抽象类可以有构造方法,但构造方法不能直接实例化抽象类,它们主要用于被子类调用以初始化子类对象。

虽然抽象类非常有用,但它们也有局限性。例如,一个类只能继承一个抽象类,这限制了Java单继承语言的灵活性。在这种情况下,接口可能是更好的选择。总的来说,抽象类是面向对象设计中一个非常强大的工具,恰当地使用它们可以帮助开发者构建结构化、可扩展和易于维护的代码库。

1.抽象类

1.1 理解抽象类

  假设我们要设计一个动物园的系统,其中有各种动物,比如狮子、大象、猴子等。我们想要定义一个通用的动物类 Animal,但由于动物的种类各不相同,每种动物的叫声和行为也不同。这时候,我们可以使用抽象类来实现这个设计当定义一个类时,常常需要定义一些成员方法描述类的行为特征,但有时这些方法的实现方式是无法确定的.

抽象类(Abstract Class)是一种特殊类型的类,在 Java 中使用 abstract 关键字来定义。抽象类不能被实例化,只能被用作父类,用于定义子类的通用行为和方法。抽象类可以包含抽象方法和具体方法。

抽象方法的定义格式如下:abstract void 方法名称(参数);

当一个类包含了抽象方法,该类必须是抽象类。抽象类和抽象方法一样,必须使用abstract关键字进行修饰。

1.2 抽象类的语法格式

抽象类的定义格式如下:

abstract class 抽象类名称{

    访问权限 返回值类型 方法名称(参数){

           return [返回值];

    }

    访问权限 abstract 返回值类型 抽象方法名称(参数);     //抽象方法,无方法体

}

抽象类的定义规则如下:

1包含一个以上抽象方法的类必须是抽象类。

2抽象类和抽象方法都要使用abstract关键字声明。

3抽象方法只需声明而不需要实现。

4如果一个类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法。

使用abstract关键字修饰的抽象方法不能使用private修饰,因为抽象方法必须被子类实现,如果使用了private声明,则子类无法实现该方法。

1.3 抽象类——代码尝试

假设有一个图形类 Shape,其中包含一个抽象方法 calculateArea() 用于计算图形的面积。请创建两个子类 Circle Rectangle,分别继承Shape 类,并实现各自的 calculateArea() 方法,分别用于计算圆形和矩形的面积。

要求:

Circle 类有一个属性 radius 表示圆的半径,并实现 calculateArea() 方法计算圆的面积。

Rectangle 类有两个属性 length width 表示矩形的长和宽,并实现 calculateArea() 方法计算矩形的面积。

主函数main()中创建一个圆形对象和一个矩形对象调用它们的 calculateArea() 方法并输出结果。

2.接口

2.1 定义

如果一个抽象类的所有方法都是抽象的,则可以将这个类定义接口

接口是Java中最重要的概念之一,接口是一种特殊的类,由全局常量和公共的抽象方法组成,不能包含普通方法

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

接口使用interface关键字声明,语法格式如下:

 public interface 接口名 extends 接口1,接口2... {

  public static final 数据类型 常量名 = 常量值;   public abstract 返回值类型 方法名(参数列表){

        //默认方法的方法体

     }

       public abstract 返回值类型方法名(参数列表){

        //类方法的方法体

     }

}

在上述语法中,“extends 接口1,接口2...”表示一个接口可以有多个父接口,父接口之间使用逗号分隔Java使用接口的目的是为了克服单继承的限制,因为一个类只能有一个父类,而一个接口可以同时继承多个父接口。接口中的变量默认使用“public static final”进行修饰,即全局常量。接口中定义的方法默认使用“public abstract”进行修饰,即抽象方法。如果接口声明为public,则接口中的变量和方法全部为public

在很多的Java程序中,经常看到编写接口中的方法时省略了public ,有很多读者认为它的访问权限是default,这实际上是错误的。不管写不写访问权限,接口中的方法访问权限永远是public。与此类似,在接口中定义常量时,可以省略前面的“public static final”,此时,接口会默认为常量添加“public static final”。

2.2 接口的实现

与抽象类一样,接口的使用必须通过子类,子类通过implements关键字实现接口,并且子类必须实现接口中的所有抽象方法。需要注意的是,一个类可以同时实现多个接口,多个接口之间需要使用英文逗号(,)分隔。

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

修饰符 class 类名 implements 接口1,接口2,...{

    ...

}

1 // 定义抽象类Animal
2 interface Animal {
3    int ID = 1;                     		// 定义全局常量
4    String NAME = "牧羊犬";
5    void shout();                		// 定义抽象方法shout()
6    static int getID(){
7        return Animal.ID;
8    }
9    public void info();                 	// 定义静态方法info()
10 }
11 interface Action {
12    public void eat();                 	// 定义抽象方法eat()
13 }
14 // 定义Dog类实现Animal接口和Action接口
15 class Dog implements Animal,Action{
16   // 重写Action接口中的抽象方法eat()
17    public void eat() {
18        System.out.println("喜欢吃骨头");
19    }
20    // 重写Animal接口中的抽象方法shout()
21    public void shout() {
22        System.out.println("汪汪...");
23    }
24 // 重写Animal接口中的抽象方法info()
25    public void info() {
26        System.out.println("名称:"+NAME);
27    }
28 }
29 // 定义测试类
30 class Example11 {
31  public static void main(String[] args) {
32        System.out.println("编号"+Animal.getID());
33        Dog dog = new Dog();         // 创建Dog类的实例对象
34        dog.info();
35        dog.shout();                // 调用Dog类中重写的shout()方法
36        dog.eat();                    // 调用Dog类中重写的eat()方法
37    }}

从运行结果可以看出,Dog类的实例化对象可以访问接口中的常量、实现的接口方法以及本类内部的方法,而接口中的静态方法则可以直接使用接口名调用。需要注意的是,接口的实现类,必须实现接口中的所有方法,否则程序编译报错。

如果在开发中一个子类既要实现接口又要继承抽象类,则可以按照以下格式定义子类。

修饰符class 类名 extends 父类名implements 接口1,接口2,... {

    ...

}

Java中,接口是不允许继承抽象类的但是允许一个接口继承多个接口。

2.3 代码尝试

假设有一个接口 Animal,其中包含一个抽象方法 makeSound() 用于输出动物的叫声。请创建两个类 Dog Cat,分别实现 Animal 接口,并实现各自的 makeSound() 方法,分别让狗发出“汪汪”声和猫发出“喵喵”声。

要求:

Dog 类和 Cat 类分别实现 Animal 接口,实现自己的 makeSound() 方法。

在主函数中创建一个狗对象和一个猫对象,分别调用它们的 makeSound() 方法输出叫声。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值