Java 抽象类

写在前面

  1. 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象

  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类(如果一个类包含抽象方法,那么该类必须是抽象类)。

  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  4. 构造方法、类方法(用 static 修饰的方法)不能声明为抽象方法。

  5. 继承抽象类的子类必须给出抽象类中抽象方法的具体实现,除非该子类也是抽象类(任何子类必须重写父类的抽象方法,或者声明自身为抽象类)。

  6. 抽象类的静态方法,可以直接调用,与普通函数调用相同。

一、什么是抽象类?

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口

二、编写抽象类

在 Java 语言中使用 abstract class 来定义抽象类。

public abstract class Parent {
    private String id;
    private String name;
    public Parent(String id, String name) {
        System.out.println("抽象类的构造函数");
        this.id = id;
        this.name = name;
    }
    public static void print(){
        System.out.println("抽象类的静态方法print");
    }
    public void test(){
        System.out.println("抽象类的普通方法test: " + getId() + ", "+getName());
    }
    //抽象函数
    public abstract String display();
    public String getId() { return id;}
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String toString() {
        return "Parent{id='" + id + "', name='" + name + "'}'";
    }
}

抽象类和普通类没啥区别,都可以定义成员变量、成员函数、静态函数、构造函数。
如果在main函数中进行实例化是会报错的,编译都不通过:
在这里插入图片描述
那么我们如何使用抽象类的东西呢?使用继承

public class Child extends Parent{
    private String age;
    // 子类必须实现构造方法,并且 必须先 super()
    public Child(String id, String name, String age) {
        super(id, name);
        setAge(age);
    }
    public static void print(){
        System.out.println("子类的静态方法print");
    }
    public void test(){
        System.out.println("子类的普通方法test");
    }
    @Override
    public void display() {
        System.out.println("子类继承父类的抽象方法display");
    }

    public String getAge() {return age;}
    public void setAge(String age) {this.age = age;}
}

然后使用实例化Child的方式进行使用抽象类Parent:

public class AbstractTest {
    public static void main(String [] args) {
        /* 以下是不允许的,会引发错误 */
//        Parent parent = new Parent("1","baba");
//        parent.test();
        Child c = new Child("123","child", "18");
        c.test();
        c.display();
        Child.print();
        System.out.println();
        Parent p = new Child("321", "parent", "81");
        p.test();
        p.display();
        Parent.print();// 调用抽象类的静态方法
    }
}

运行结果:

抽象类的构造函数
子类的普通方法test: 123, child, 18
子类继承父类的抽象方法display:123, child, 18
子类的静态方法print

抽象类的构造函数
子类的普通方法test: 321, parent, 81
子类继承父类的抽象方法display:321, parent, 81
抽象类的静态方法print

若有不正之处,请谅解和批评指正,谢谢~
喜欢欢迎一件三连~
转载请标明:
https://blog.csdn.net/vihem/article/details/120786114

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值