• 【Java】抽象类


    目录

    概述:

    示例代码:

    抽象类特点

     示例代码:


    概述:

    在Java中,一个没有 方法体 的方法应该定义为 抽象方法,而类中如果有 抽象方法,该类必须定义为抽象类

    抽象类和抽象方法abstract 关键字来修饰

    • 抽象类:abstract class 类名{}
    • 抽象方法:public abstract void eat();// 抽象方法中没有方法体 

     

    示例代码

    AnimalParent.java

    1. package com.面向对象.Demo24;
    2. //public class AnimalParent {
    3. public abstract class AnimalParent {
    4. /**
    5. * eat()方法没有方法体 具体 都是交给子类 重写的
    6. * 如果在方法上加上 abstract 进行修饰 为抽象方法
    7. * 如果在一个类中存在一个抽象方法 则该类必须是抽象方法
    8. */
    9. // public void eat(){
    10. // System.out.println("我在吃");
    11. // }
    12. public abstract void eat();
    13. }

    Cat.java

    1. package com.面向对象.Demo24;
    2. public class Cat extends AnimalParent {
    3. // 在我们抽象类中 的抽象方法 子类必须是要重写的
    4. @Override
    5. public void eat() {
    6. System.out.println("Cat-eat()-鱼");
    7. }
    8. }

    Dog.java

    1. package com.面向对象.Demo24;
    2. public class Dog extends AnimalParent{
    3. // 在我们抽象类中 的抽象方法 子类必须是要重写的
    4. @Override
    5. public void eat() {
    6. System.out.println("Dog-eat()-骨头");
    7. }
    8. }

    Test01.java

    1. package com.面向对象.Demo24;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. // AnimalParent animalParent = new AnimalParent(); //报错,'AnimalParent' is abstract; cannot be instantiated
    5. // 动物类是一个抽象的概念 没有具体的事物
    6. AnimalParent dog = new Dog();
    7. AnimalParent cat = new Cat();
    8. dog.eat(); //Dog-eat()-骨头
    9. cat.eat(); //Cat-eat()-鱼
    10. }
    11. }

    抽象类特点

    1. 抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
    2. 抽象类不能实例化;
    3. 抽象类由具体的子类进行实例化;
    4. 子类必须对父类(抽象类)中的所有抽象方法进行重写;
    5. 在抽象类中可以定义非抽象方法;
    6. 子类如果不重写抽象类中的抽象方法,则该类还是为抽象类;
    7. 抽象类中可以有构造方法,用于子类访问父类时的数据初始化。

     示例代码:

    AnimalParent.java

    1. package com.面向对象.Demo25;
    2. public abstract class AnimalParent {
    3. /**
    4. * 在抽象类中 是可以定义 成员属性
    5. */
    6. private int age;
    7. private final int code = 200;
    8. /**
    9. * 1.在方法上加上 abstract 进行修饰,则该方法是为抽象方法
    10. * (如果在该类中存在一个抽象方法,则该类必须是为抽象类)
    11. * 2.在一个抽象类中是可以存在多个抽象方法的
    12. * 3.在抽象类 可以定义 非抽象方法
    13. * 4.子类是必须重写父类中 所有 的抽象方法 (非抽象方法 子类没有必须 强制 重写的)
    14. * 5.如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
    15. * 6.抽象类——不能够实例化的 没有明确具体的事物 所以 抽象类必须 通过子类 实例化
    16. * 7.在抽象类中,不一定有抽象方法的(但是这样做不合理)
    17. * 8.抽象类中可以有构造方法,用于子类访问父类时的数据初始化。
    18. */
    19. public abstract void eat();
    20. public abstract void play();
    21. public AnimalParent() {
    22. System.out.println("AnimalParent-无参构造方法...");
    23. }
    24. // 抽象类 是可以定义 有参构造方法,子类访问父类初始化时 可以给父类的成员属性进行赋值
    25. public AnimalParent(int age) {
    26. this.age = age;
    27. System.out.println("AnimalParent-有参构造方法...");
    28. }
    29. /**
    30. * 非抽象方法(子类不需要强制重写的)
    31. */
    32. public void show() {
    33. System.out.println("非抽象方法-show()");
    34. System.out.println("age:"+age);
    35. System.out.println("code:"+code);
    36. }
    37. }

    Dog.java

    1. package com.面向对象.Demo25;
    2. public class Dog extends AnimalParent {
    3. /**
    4. * 默认每个类中都有一个无参构造方法 默认是可以不用写的
    5. */
    6. public Dog(int age) {
    7. super(age); //如果这里调用父类的有参构造方法,程序会默认在这里加上 super(),帮我们调用无参构造
    8. // 思考 在Dog类中 的有参构造方法中,会调用父类中的 有参构造方法吗?
    9. System.out.println("Dog-有参构造方法...");
    10. }
    11. @Override
    12. public void eat() {
    13. System.out.println("Dog-eat-骨头");
    14. }
    15. @Override
    16. public void play() {
    17. }
    18. }

    Cat.java

    1. package com.面向对象.Demo25;
    2. // 如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
    3. public abstract class Cat extends AnimalParent{
    4. }

    Test01.java

    1. package com.面向对象.Demo25;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. // new AnimalParent();//报错,'AnimalParent' is abstract; cannot be instantiated
    5. // 抽象类 没有明确具体的事物 所以 抽象类必须 通过子类 实例化
    6. AnimalParent dog = new Dog(20);
    7. dog.show();
    8. // AnimalParent cat = new Cat();//报错,∵ Cat类是 abstract
    9. }
    10. }

    下一篇文章:抽象类案例

  • 相关阅读:
    【苹果家庭推送iMessage】软件安装应用程序访问HealthKit HomeKit
    个人整理前端代码规范
    Java 21的StringBuilder和StringBuffer新增了一个repeat方法
    网络协议学习:第一天
    对Axios进行封装
    Transform+ASM插桩系列(3)——Transform+ASM的实战
    App出海起量难?传参安装打开获客增长新途径
    git克隆一直报错remote: HTTP Basic: Access denied
    RPA主要有那些特征,多久可以学会?
    14:00面试,14:06就出来了,问的问题有点变态。。。
  • 原文地址:https://blog.csdn.net/qq_57268251/article/details/133562996