java-抽象类和抽象方法1

Java中的抽象类和抽象方法

1. 抽象类的基本概念

在Java中,抽象类(Abstract Class)是用来声明一个类不完整,不能被实例化的。抽象类通常用作其他类的基类,为子类提供统一的接口和部分实现。抽象类使用`abstract`关键字进行声明,并且可以包含抽象方法和具体方法。

抽象类的主要目的是通过将公共行为和属性集中在基类中,提供代码复用和统一接口的好处,同时允许子类提供具体的实现。

抽象类的定义

```java

abstract class Animal {

String name;

Animal(String name) {

this.name = name;

}

// 抽象方法

abstract void makeSound();

// 具体方法

void sleep() {

System.out.println(name + " is sleeping.");

}

}

```

在上述代码中,`Animal`类是一个抽象类,包含一个抽象方法`makeSound`和一个具体方法`sleep`。抽象方法没有方法体,由子类提供具体实现。

2. 抽象方法的基本概念

抽象方法(Abstract Method)是没有方法体的方法,只能在抽象类中声明,由子类实现。抽象方法使用`abstract`关键字进行声明,且不能包含大括号和方法体。

抽象方法的定义

```java

abstract class Animal {

// 抽象方法

abstract void makeSound();

}

```

在上述代码中,`makeSound`方法是一个抽象方法,只有方法签名,没有方法体。子类必须重写(Override)这个方法,并提供具体的实现。

3. 抽象类和抽象方法的实现

抽象类和抽象方法的主要特点和实现如下:

3.1 抽象类不能实例化

抽象类不能直接创建实例,只能通过子类实例化。例如:

```java

abstract class Animal {

abstract void makeSound();

}

class Dog extends Animal {

@Override

void makeSound() {

System.out.println("Dog barks.");

}

}

public class Main {

public static void main(String\[\] args) {

// Animal animal = new Animal(); // 错误,无法实例化抽象类

Animal dog = new Dog();

dog.makeSound(); // 输出:Dog barks.

}

}

```

在上述代码中,不能直接实例化`Animal`类,只能通过`Dog`类实例化并调用`makeSound`方法。

3.2 子类必须实现抽象方法

如果一个类继承了抽象类,则必须实现所有抽象方法,除非该子类也是抽象类。例如:

```java

abstract class Animal {

abstract void makeSound();

}

class Dog extends Animal {

@Override

void makeSound() {

System.out.println("Dog barks.");

}

}

abstract class Bird extends Animal {

// 子类Bird也是抽象类,不需要实现makeSound方法

}

class Sparrow extends Bird {

@Override

void makeSound() {

System.out.println("Sparrow chirps.");

}

}

public class Main {

public static void main(String\[\] args) {

Animal dog = new Dog();

dog.makeSound(); // 输出:Dog barks.

Animal sparrow = new Sparrow();

sparrow.makeSound(); // 输出:Sparrow chirps.

}

}

```

在上述代码中,`Dog`类实现了`makeSound`方法,而`Bird`类虽然继承了`Animal`类,但它自身是抽象类,因此可以不实现`makeSound`方法。最终,由具体的子类`Sparrow`实现`makeSound`方法。

3.3 抽象类可以包含具体方法

抽象类不仅可以包含抽象方法,还可以包含具体方法,为子类提供通用功能。例如:

```java

abstract class Animal {

abstract void makeSound();

void sleep() {

System.out.println("This animal is sleeping.");

}

}

class Cat extends Animal {

@Override

void makeSound() {

System.out.println("Cat meows.");

}

}

public class Main {

public static void main(String\[\] args) {

Animal cat = new Cat();

cat.makeSound(); // 输出:Cat meows.

cat.sleep(); // 输出:This animal is sleeping.

}

}

```

在上述代码中,`Animal`类包含一个具体方法`sleep`,所有继承`Animal`类的子类都可以直接使用这个方法,而无需重新实现。

3.4 抽象类可以有构造函数

尽管抽象类不能实例化,但它们可以有构造函数,供子类调用。例如:

```java

abstract class Animal {

String name;

Animal(String name) {

this.name = name;

}

abstract void makeSound();

void displayInfo() {

System.out.println("This is a " + name);

}

}

class Dog extends Animal {

Dog(String name) {

super(name);

}

@Override

void makeSound() {

System.out.println("Dog barks.");

}

}

public class Main {

public static void main(String\[\] args) {

Animal dog = new Dog("Bulldog");

dog.displayInfo(); // 输出:This is a Bulldog

dog.makeSound(); // 输出:Dog barks.

}

}

```

在上述代码中,`Animal`类有一个构造函数,用于初始化`name`字段。`Dog`类通过`super`关键字调用父类的构造函数。

4. 抽象类的设计和使用场景

抽象类在设计模式和软件架构中有广泛的应用,尤其在以下场景中:

4.1 定义模板方法

模板方法模式是一种行为型设计模式,其中抽象类定义了一个算法的框架,并将某些步骤延迟到子类中实现。例如:

```java

abstract class Game {

abstract void initialize();

abstract void startPlay();

abstract void endPlay();

// 模板方法

public final void play() {

initialize();

startPlay();

endPlay();

}

}

class Cricket extends Game {

@Override

void initialize() {

System.out.println("Cricket Game Initialized.");

}

@Override

void startPlay() {

System.out.println("Cricket Game Started.");

}

@Override

void endPlay() {

System.out.println("Cricket Game Ended.");

}

}

class Football extends Game {

@Override

void initialize() {

System.out.println("Football Game Initialized.");

}

@Override

void startPlay() {

System.out.println("Football Game Started.");

}

@Override

void endPlay() {

System.out.println("Football Game Ended.");

}

}

public class Main {

public static void main(String\[\] args) {

Game game = new Cricket();

game.play(); // 输出:Cricket Game Initialized. -> Cricket Game Started. -> Cricket Game Ended.

game = new Football();

game.play(); // 输出:Football Game Initialized. -> Football Game Started. -> Football Game Ended.

}

}

```

在上述代码中,`Game`类定义了一个模板方法`play`,具体步骤由子类`Cricket`和`Football`实现。

4.2 定义接口的一部分实现

在某些情况下,抽象类可以为接口的实现提供部分实现,而子类只需实现剩余的部分。例如:

```java

interface AnimalBehavior {

void eat();

void sleep();

}

abstract class Animal implements AnimalBehavior {

@Override

public void sleep() {

System.out.println("This animal is sleeping.");

}

}

class Dog extends Animal {

@Override

public void eat() {

System.out.println("Dog is eating.");

}

}

public class Main {

public static void main(String\[\] args) {

Animal dog = new Dog();

dog.eat(); // 输出:Dog is eating.

dog.sleep(); // 输出:This animal is sleeping.

}

}

```

在上述代码中,`Animal`类实现了接口`AnimalBehavior`的`sleep`方法,而`Dog`类只需实现`eat`方法。

相关推荐
小灰灰搞电子2 分钟前
Python 函数参数分隔符 *:Keyword-Only Arguments 原理与实践
开发语言·python
染的人8 分钟前
Java 10x15cm面单PDF转换A4格式PDF
java·开发语言·pdf
泡海椒13 分钟前
JQuick-java (JQuick-ASM)性能优化原理:字节码生成与缓存机制深度解析
java·缓存·性能优化
光电笑映16 分钟前
Linux 线程同步与互斥:锁的本质、条件变量与信号量的底层原理
linux·运维·服务器·开发语言·c++
Bs_MoneyMagnet17 分钟前
基于springboot+vue的家居生活商城平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
微三云 - 廖会灵 (私域系统开发)24 分钟前
Spring Boot实战:五级分销定价与自动分佣系统设计与实现
java·spring boot·后端
Json____24 分钟前
从零构建在线拍卖系统:Java 全栈开发实践
java·开发语言·管理系统·it学习·wwwoop.com
2601_9669496527 分钟前
批量 K 线不只是提速:因子研究中的数据质量、复权与回测偏差
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
matlab代码27 分钟前
基于matlab水果识别系统(西红柿、香蕉、梨、青椒)【源码64期】
开发语言·matlab
我命由我1234529 分钟前
Android Compose 开发,使用 ConstraintLayout,但是引入的是旧的 ConstraintLayout
android·java·java-ee·android studio·android jetpack·android-studio·android runtime