Java面向对象8——抽象类和抽象方法(知识点+使用方法)

简介: 抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现

一、前言


本文会梳理有关抽象类和抽象方法的知识点,这会运用在接口中,而接口是在实际开发中非常重要的,所以知识点非常重要


二、抽象方法


1.定义


抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现


2.简单记忆方法


概念听起来很复杂难懂,那我们举例说明


比如有三个人A、B、C的职业都是程序员,到了返点都要吃饭,但是每个人吃的东西不一样,有人吃爱心便当,有人吃盒饭,有人吃快餐,那么他们都有共同的方法:吃,并且他们都可以同属于一个父类:程序员,那么我们可以把共同的方法吃抽取到父类(程序员)中,由于子类(ABC三个人)吃的东西不相同,即方法体不同,所以要把该方法定义为抽象方法


3.代码格式


修饰符 abstract 返回值类型 方法名 (参数列表);


例如


public abstract void eat();]


4.使用说明


如果要继承父类中的抽象方法,则必须重写该方法,否则就让子类也变为抽象类

示例:


d2d54227026049e987ba76c3cbf84052.png


如果想要偷懒的话,点击 Alt+Enter来查看解决方法


0c213452d826421b9c20ce43e48dcdba.png


我们在这里选择第二个,实现方法


1d5ab7568ec8498c9daf9c55ad5b8051.png


一个是父类中的抽象方法,另一个一个是接口(这个下一篇文章中会讲到)我们只需要全选然后点击回车就会自动帮我们生成重写的方法了


f206abc07b30400b86051184671486f2.png


此时我们只要改写方法体即可


三、抽象类


1.定义


当某一个类中存在抽象方法,那么这个类就要被定义为抽象类


2.代码格式


abstract class 类名 { 
}


例如:


abstract class Student { 
}


3.使用说明


继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类


4.注意点


1.抽象类不能实例化


fdca0d7417c2429e8349183ec9ba27b5.png


2.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。


理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。


当我们在一个非抽象的类中写抽象方法时,会报错


b3b6c6611f264c3ea965620046240237.png


但是在抽象类中写非抽象方法,又不会报错


c177527b4370428bba8ffa32ab7af714.png


抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。


1d5ab7568ec8498c9daf9c55ad5b8051.png


四、小练习


1.题目


属性 行为
青蛙Frog 名字、年龄(1) 吃虫子、喝水
狗Dog 名字、年龄(2) 吃骨头、喝水
兔子 名字、年龄(3) 吃胡萝卜、喝水


2.分析


ee094e67a85b414bb7bea4077be59ef2.png


eat是抽象方法,吃的东西不同,而drink都是喝水,所以不用使得该方法变为抽象方法


3.代码实现


1️⃣父类


public abstract class Animal {
    private String name;
    private int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Animal() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public abstract void eat();
    public void drink(){
    System.out.println("喝水");
  }
}


2️⃣Frog类


public class Frog extends Animal implements Swim {
    public Frog(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
        System.out.println("吃虫子");
    }
    @Override
    public void drink() {
        System.out.println("小青蛙喝水");
    }
}


3️⃣Dog类


public class Dog extends Animal implements Swim {
    public Dog(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
    System.out.println("吃骨头");
    }
  @Override
    public void drink() {
        System.out.println("小狗喝水");
    }
}


4️⃣Rabbit类


public class Rabbit extends Animal{
    public Rabbit(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
        System.out.println("吃胡萝卜");
    }
  @Override
    public void drink() {
        System.out.println("小狗喝水");
    }
}


5️⃣测试类


public class Test {
    public static void main(String[] args) {
        Frog f = new Frog("小青蛙",1);
        System.out.println(f.getName() + "今年" + f.getAge() + "岁\n它的行为有:");
        f.eat();
        f.drink();
        System.out.println("---------------");
        Dog g = new Dog("小狗",2);
        System.out.println(g.getName() + "今年" + g.getAge() + "岁\n它的行为有:");
        g.eat();
        g.drink();
        System.out.println("---------------");
        Rabbit r = new Rabbit("小白兔",3);
        System.out.println(r.getName() + "今年" + r.getAge() + "岁\n它的行为有:");
        r.eat();
        r.drink();
    }
}


五、结语


下一篇文章会讲述有关接口的知识点

相关文章
|
11天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
21天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
14天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
28 2
|
17天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2
|
19天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
16 2
|
21天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
19 2
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
22天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
15 2