Java基础(抽象类)

目录

抽象类是什么?

抽象类出现的原因

抽象类的特点

abstract关键字

抽象类实现方式

抽象类一定是父类

抽象类限定条件

不能被实例化

不能修饰抽象类的关键字、访问符

final关键字

static关键字

private访问符

抽象类的构造器


此文章需要用到以下知识内容:

类与对象(继承、重载、重写)

类与对象(多态)

抽象类是什么?

抽象类就是有abstract关键字修饰的类,抽象类中有抽象方法,抽象方法只能对方法进行定义,不能进行方法实现。

抽象类出现的原因

继承的本质是代码的复用,但是在很多时候,当子类继承了父类的方法(例如:cat类继承animal类),父类中的很多方法并不适合子类。

class Animal{
    public void run(){
        System.out.println("动物会叫");
    };
}

这种情况下,一般需要用到方法的重写,但如果父类的子类有很多,每个子类就都需要进行重写,代码十分冗杂且大大降低了工作效率。

class Dog extends Animal{
    public void run(){
        System.out.println("狗会叫");
    }
}


class Cat extends Animal{
    public void run(){
        System.out.println("猫会叫");
    }
}


class Pig extends Animal{
    public void run(){
        System.out.println("猪会叫");
    }
}

另一方面,既然每个子类都需要重写父类的方法,那么父类的这个方法就没有实现的必要(每个子类都与此方法不同),子类就没有必要进行重写,直接在自己类别中定义方法就能解决问题。

如果是子类直接定义方法,就没必要继承父类,没有继承父类,多态就不能使用,代码的完善和丰富将会大大受阻(继承的本质是父类的引用指向子类的对象,必须需要继承)。

抽象类的特点

abstract关键字

abstract修饰的类叫做抽象类,abstract修饰的方法叫做抽象方法。

抽象类实现方式

abstract修饰的方法不需要在抽象类当中实现,但是必须在子类当中重写并实现,前提是子类不是抽象类。

abstract class Animal{
    public abstract void run();

}
class Dog extends Animal{
    public void run(){
        System.out.println("狗会叫");
    }
}
public static void main(String[] args) {
        Dog a=new Dog();
        a.run();
    }

程序输出为:

抽象类一定是父类

抽象类一定是父类,因为需要子类继承重写其方法。

抽象类限定条件

只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法。

class cat{
    public abstract void cat_run();
}

程序报错:

抽象类当中不一定非要有抽象方法,也可以写普通方法。

abstract class Animal{
    public abstract void run();
    public void eat(){
        System.out.println("动物吃食物");
    }

}

普通方法不报错,但是不能运行。

不能被实例化

抽象类不能被实例化(不能被创建对象),只能使用多态。

abstract class Animal{
    public abstract void run();
    public void eat(){
        System.out.println("动物吃食物");
    }

}

程序报错:

不能修饰抽象类的关键字、访问符

final关键字

final和abstract不能同时使用,final修饰的类不能被继承,final修饰的方法不能被重写,abstract修饰的类必须要继承。

abstract final class Animal{
    public abstract void run();
    public void eat(){
        System.out.println("动物吃食物");
    }

}

程序报错:

static关键字

abstract修饰的方法不能被static修饰,static修饰的方法属于类方法,abstract修饰的方法本身属于对象。

abstract static class Animal{
    public abstract void run();
    public void eat(){
        System.out.println("动物吃食物");
    }

}

报错:

private访问符

抽象方法不能使用private访问符修饰,private访问符是不能让自己以外的所有类访问,而抽象类需要继承和重写,两者从根本功能上冲突。

private abstract class Animal{
    public abstract void run();
    public void eat(){
        System.out.println("动物吃食物");
    }

}

程序报错:

抽象类的构造器

抽象类有构造器,但是它的构造器不能创建对象,其构造器的目的是为了完成一些必要的初始化操作(可以在子类配合super进行传参)。

abstract class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public abstract void run();


}

利用super进行传参。

class Dog extends Animal{
    public Dog(String name){
        super(name);
    }
    public void run(){
        System.out.println("狗会叫");
    }
}

定义main方法:

 public static void main(String[] args) {
        Dog a=new Dog("这是传给父类的参数");
        System.out.println(a.getName());
    }

程序输出:

到此,此文章结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值