Java---抽象定义及举例

本文通过农民喂动物的例子,详细解释了抽象类和抽象方法在Java中的使用。抽象类用于定义公共接口,而抽象方法在子类中实现。通过这种方式,实现了代码的多态性,避免了在农夫类中为每种动物重载feedWater方法。此外,还探讨了类的组织、重写与重载的区别以及基础概念的重要性。
摘要由CSDN通过智能技术生成

一、概述

在OOP这个概念中,所有的对象都是通过类来描述的;但是并不是所有的类都是用来描述对象的。如果一个类没有包含足够的信息来描述一个具体的对象,这样的类称为抽象类。

抽象类:(1)抽象类不能实例化对象,如果实例化某个对象,编译无法通过。只有抽象类的非抽象子类可以创建对象(2)可以包含:成员变量、成员方法、构造方法等。(3)构造方法、类方法(用static修饰的方法)不能声明为抽象方法

抽象方法:(1)如果一个类包含抽象方法,那么该类一定是抽象类(2)任何子类必须重写父类的抽象方法,或者声明自身为抽象类

定义:abstract class 类名

二、示例:农民喂动物

Animal:抽象类--------getName()、move()、drink()

Reptile、Mammal:继承抽象类

蛇、老虎、山羊、兔子:分别继承Reptile或Mammal

fammer:bringWater()、feedWater(Animal animal)---- 负责将水带到指定的地方,然后动物移动去目的地,喝水

代码如下:

package abstractDemo;

/**
 * @author lpx
 * @Description TODO
 * @date 2021-04-07
 */
public abstract class Animal {
    abstract String getName();
    abstract void move(String destination);
    abstract void drink();
}
abstract class Reptile extends Animal{

}

abstract class Mammal extends Animal{

}

class Tiger extends Mammal{
    private static String name="tiger";

    @Override
    String getName() {
        return this.name;
    }

    @Override
    void move(String destination) {
        System.out.println("tiger move to "+destination+".");
    }

    @Override
    void drink() {
        System.out.println("tiger lower it is head and drink");
    }
}

class Goat extends Mammal{
    private static String name="goat";

    @Override
    String getName() {
        return this.name;
    }

    @Override
    void move(String destination) {
        System.out.println("goat move to "+destination+".");
    }

    @Override
    void drink() {
        System.out.println("goat lower it head to drink");
    }
}

class Rabbit extends Mammal{
    private static String name="rabbit";

    @Override
    String getName() {
        return this.name;
    }

    @Override
    void move(String destination) {
        System.out.println("rabbit move to "+destination+".");
    }

    @Override
    void drink() {
        System.out.println("rabbit put out it is tongue and drink");
    }
}

class Snake extends Reptile{
    private static String name="snake";

    @Override
    String getName() {
        return this.name;
    }

    @Override
    void move(String destination) {
        System.out.println("snake move to "+destination+".");
    }

    @Override
    void drink() {
        System.out.println("snake dived into and drink");
    }
}

class Farmer{
    public void bringWater(String destination){
        System.out.println("Farmer bring water to " + destination + ".");
    }

    public void feedWater(Animal a){ // polymorphism
        this.bringWater("Feeding Room");
        a.move("Feeding Room");
        a.drink();
    }

}

class Test{
    public static void main(String[] args) {
        Farmer fm=new Farmer();
        Snake snake=new Snake();
        Goat goat=new Goat();
        Tiger tiger=new Tiger();
        Rabbit rabbit=new Rabbit();

        fm.feedWater(snake);
        fm.feedWater(goat);
        fm.feedWater(tiger);
        fm.feedWater(rabbit);
    }
}

执行结果:

总结:

如果每种动物不是抽象出drink和move方法的话,就无法实现多态。农夫类就需要根据参数的不同重载多个feedWater。如果继续添加动物那么重载个数就越来越多。为了方便对比理解,我也按照常规思维去写了一下,代码如下:

package abstractDemo;

/**
 * @author lpx
 * @Description TODO
 * @date 2021-04-07
 */

class Tiger1{
    private static String name="tiger";

    String getName() {
        return this.name;
    }

    void move(String destination) {
        System.out.println("tiger move to "+destination+".");
    }

    void drink() {
        System.out.println("tiger lower it is head and drink");
    }
}

class Goat1{
    private static String name="goat";

    String getName() {
        return this.name;
    }

    void move(String destination) {
        System.out.println("goat move to "+destination+".");
    }

    void drink() {
        System.out.println("goat lower it head to drink");
    }
}

class Rabbit1{
    private static String name="rabbit";

    String getName() {
        return this.name;
    }

    void move(String destination) {
        System.out.println("rabbit move to "+destination+".");
    }

    void drink() {
        System.out.println("rabbit put out it is tongue and drink");
    }
}

class Farmer1{
    public void bringWater(String destination){
        System.out.println("Farmer bring water to " + destination + ".");
    }

    public void feedWater(Goat1 goat){ // polymorphism
        this.bringWater("Feeding Room");
        goat.move("Feeding Room");
        goat.drink();
    }
    public void feedWater(Tiger1 tiger){ // polymorphism
        this.bringWater("Feeding Room");
        tiger.move("Feeding Room");
        tiger.drink();
    }

    public void feedWater(Rabbit1 rabbit1) {
        this.bringWater("Feeding Room");
        rabbit1.move("Feeding Room");
        rabbit1.drink();
    }
}

public class Test1{
    public static void main(String[] args) {
        Farmer1 farmer1=new Farmer1();
        Tiger1 tiger1=new Tiger1();
        Goat1 goat1=new Goat1();
        Rabbit1 rabbit1=new Rabbit1();
        farmer1.feedWater(tiger1);
        farmer1.feedWater(goat1);
        farmer1.feedWater(rabbit1);
    }
}

手敲了这个例子,发现基础很重要呀,以前学习的不细致,导致很多地方迷糊不知道为啥那么写。

(1)一个.java文件中可以定义多个class类,但是只有一个可以定义为public,且这个类名必须和文件名相同

(2)抽象类继承抽象类,不用覆盖其抽象方法(原因也很简单呀,本身他就是抽象的不能实现方法体)。而非抽象类继承抽象类必须覆盖抽象方法,非抽象方法非必要。

(3)重写和重载的区别(高频面试题 🤭)

重载:定义相同的方法名,参数不同。属于编译时多态

重写:子类重写父类的方法@Override。属于运行时多态

今天先到这里啦,每天和大家共同学习共同进步,看到就是缘分,记得点赞👍哦。bye~~~

 

Java中,抽象类是一种特殊的类,它不能被实例化,通常用来作为其他类的模板或基础。它们的主要目的是为了提供一些通用的行为或者共享的功能,同时允许子类覆盖或扩展这些功能。以下是几个抽象类应用的例子: 1. **图形组件**:在图形用户界面设计中,你可以创建一个抽象的`Shape`类,包含方法如`draw()`。然后,所有具体的形状如`Circle`, `Rectangle`, `Triangle`都继承这个抽象类,并实现`draw()`方法,展示各自特定的绘制方式。 ```java abstract class Shape { abstract void draw(); } class Circle extends Shape { @Override void draw() { // 圆形的绘制逻辑 } } ``` 2. **动物行为模型**:比如创建一个`Animal`抽象类,包含`eat()`和`speak()`等方法,然后`Dog`, `Cat`等具体动物类继承并实现这些方法。 ```java abstract class Animal { public abstract void eat(); public abstract String speak(); } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃食物"); } @Override public String speak() { return "汪汪"; } } ``` 3. **策略模式**:定义一系列算法,将每个算法封装在独立的抽象类中,让子类可以选择不同的算法。例如,温度转换可以抽象成`TemperatureConverter`类。 ```java interface TemperatureConverter { double convert(Celsius celsius); } class FahrenheitConverter implements TemperatureConverter { @Override public double convert(Celsius celsius) { // 华氏度转换逻辑 } } // 子类中选择不同的转换器 public class Thermometer { private TemperatureConverter converter; // 设置转换器... } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值