当前位置: 首页 > news >正文

JAVA学习*抽象类

抽象类

在Java中,被abstract关键字修饰的类被称为抽象类。

特点

1、当一个类继承了抽象类,一定要重写抽象方法!!!

public abstract class Animal {
    public int age;
    public String name;
	//抽象方法
    public abstract void func();
    //普通类方法
    public void test() {
        System.out.println("调用Animal类的test()");
    }
}
public class Bird extends Animal {
//重写抽象方法
    @Override
    public void func() {
        System.out.println(this.name+"可以飞!");
    }
}
public class Fish extends Animal{
    @Override
    public void func() {
        System.out.println(this.name+"可以游泳!");
    }
}
public class Dog extends Animal{
    @Override
    public void func() {
        System.out.println(this.name+"可以狗刨!");
    }
}

注意:
1、抽象方法是有abstract关键字的方法,并且没有函数体,以分号结尾。

//eg.
public abstract void func();

2、当子类没有重写抽象类时,会报错。
在这里插入图片描述
这里提示要么声称Bird类为抽象类,要么重写func()抽象方法。
3、当抽象类继承了抽象类,此时子类抽象类可以不用重写,子类抽象类的子类一定要把所有的抽象方法都重写了!
例如:

public abstract class Animal {
    public int age;
    public String name;

    public abstract void func();
    public void test() {
        System.out.println("调用Animal类的test()");
    }
}
public abstract class AbstractBird extends Animal{
    public abstract void test();
}
public class Bird extends AbstractBird {
    @Override
    public void func() {
        System.out.println(this.name+"可以飞!");
    }

    @Override
    public void test() {
        System.out.println("测试");
    }
}

在Bird类中一定要重写func()和test()抽象方法。

2、抽象类不能实例化对象

在这里插入图片描述

3、抽象方法不能是static、final、private方法

因为static、final、private方法是不能被重写的,而抽象类一定要重写。

4、抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

在这里插入图片描述

5、抽象类中可以有构造方法

public abstract class Animal {
    public int age;
    public String name;

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
        System.out.println("调用Animal类构造方法");
    }

    public abstract void func();
    public void test() {
        System.out.println("调用Animal类的test()");
    }
}
public class Bird extends Animal {
    @Override
    public void func() {
        if(this.name!=null){
            System.out.println(this.name+"可以飞!");
        } else {
            System.out.println("name为空");
        }
    }

    public Bird(int age, String name) {
        super(age, name);
        System.out.println("调用Bird类构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Bird bird = new Bird(2,"黑子");
        bird.func();
        System.out.println("-----------");
        Animal animal = new Bird(1,"白白");//发生向上转型
        animal.func();//发生多态,调用子类func()方法。
    }
}

会先调用父类的构造方法来初始化父类的成员变量,然后再调用子类的构造方法,最后执行子类实现的抽象方法。

输出:
调用Animal类构造方法
调用Bird类构造方法
黑子可以飞!

调用Animal类构造方法
调用Bird类构造方法
白白可以飞!

抽象类的意义

1、抽象类不能实例化,其他的很多都和普通类差不多,通过定义抽象类能帮助我们检测需要由子类完成的方法是否被重写了,编译器会自动检查。
2、虽然抽象类不能实例化,但我们仔细想想,世界上并不存在叫Animal这个生物,这并不需要实例化。抽象类有点像一些事物的共性的总结,普遍性与特殊性的关系。用于对具有相似特征和行为的一类事物进行抽象、概括、总结。

相关文章:

  • 【深度学习与大模型基础】第6章-对角矩阵,对称矩阵,正交矩阵
  • os题:第二章 进程的描述与控制
  • 【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“
  • 计算机操作系统(6) (经典进程同步问题)
  • ORA-12541: TNS:no listener
  • 自定义捕捉与处理信号的底层逻辑
  • 希尔排序算法
  • 拖拽实现+摇杆实现
  • 【AVRCP】蓝牙协议栈深度解析:AVCTP互操作性核心机制与实现细节
  • 织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式
  • C++ 多生产者单消费者(MPSC)模式
  • DeepSeek辅助学术写作中期能力及提示词分享
  • C++反向迭代器
  • kafka指北
  • 计算机组成相关知识
  • Sqlserver安全篇之_启用和禁用Named Pipes的案列介绍
  • 【css酷炫效果】纯CSS实现立体旋转立方体
  • Spring Boot 整合 Nacos 注册中心终极指南
  • 嵌入式Linux——gcc和Makefile
  • C++ list类
  • 杞支雅男评《1517》|放眼世界,立足德国
  • 全国人大常委会今年将初次审议检察公益诉讼法
  • 国新办将就2025年4月份国民经济运行情况举行新闻发布会
  • 4月新增社融1.16万亿,还原地方债务置换影响后信贷增速超过8%
  • 袁思达已任中国科学院办公厅主任
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响