抽象类与接口

目录

一、抽象类

🦀概念

🐟细节

 二、接口

🌼引例

🌹细节


一、抽象类

概念

我们知道,重写是为了在子类中把父类中的方法重新再写一遍。

这样每个子类就可以实现它自己的功能。

那么父类是不是就当作一个模板了呢?

我们把这个当作模板的父类可以叫做抽象,例如:

abstract class shape{
    public abstract void draw();
}

细节

接下来讲解一下抽象类的注意事项:

1.抽象类里可以有普通方法和普通变量。

abstract class shape{
    public int a;
    public void init(){
        System.out.println("你好");
    }
    public abstract void draw();
}

2.一个类作为抽象类后,是不可以被实例化的,所以这个抽象类就是用来被继承的。

3.如果一个普通类继承了抽象类,那么这个普通类必须重写这个抽象类的所有抽象方法。

4.抽象方法也可以向上转型。

public class Test {
    public static void main(String[] args) {
        Shape shape = new Circle();
        shape.draw();
    }
}

5.一个抽象类A继承了一个抽象类B,那个抽象类A可以不重写B的抽象方法。

 

6.但是当一个普通类继承了,这个普通类必须重写A和B的所有抽象方法。

abstract class Shape{
    public abstract void draw();
}

abstract class Type extends Shape{
    public abstract void setBounds();
}

class rect extends Type{
    @Override
    public void draw() {
        System.out.println("a");
    }

    @Override
    public void setBounds() {
        System.out.println("b");
    }
}

7.最后抽象方法不能被final修饰。

        

 二、接口

引例

学完继承,我们知道Java没有多继承。

接口正是来弥补这个遗憾的。

比如我们创建一个动物类,还有许多它的子类,比如猫、鸟来继承动物。

猫会跑,鸟会飞,都是自己的特性,不能写入动物大类。

再来一条狗,也会跑,但是这样写很多跑的方法就太麻烦了。

所以跑可以写成一个接口,代表动物的能力。

//动物大类
class Animal{
    public String name;
    public Animal(String name){
        this.name = name;
    }
}

//会跑
interface IRunning{
    void run();
}

//会飞
interface IFlying{
    void fly();
}

//鸟类
class Bird extends Animal implements IFlying{
    public Bird(String name) {
        super(name);
    }

    @Override
    public void fly() {
        
    }
}

//狗类
class Dog extends Animal implements IRunning{
    public Dog(String name) {
        super(name);
    }

    @Override
    public void run() {
        
    }
}

//未知生物,又会飞,又会跑
class Unknown extends Animal implements IRunning, IFlying{
    public Unknown(String name) {
        super(name);
    }

    @Override
    public void run() {
        
    }

    @Override
    public void run() {
        
    }
}

细节

上面是一个总的例子,接下来我们来看接口的具体细节:

1. 接口中的方法默认都是public abstract的抽象方法,但也存在静态方法

interface IRunning{
    public static void walk(){
        System.out.println("a");
    }//可以有静态方法
    void run();//原型public abstract void run();
}

2.接口中的变量默认都是public static final的,所以必须要赋初值

3.接口不能被new实例化,但可以向上转型

4.当一个类实现一个接口,必须重写接口中的抽象方法

5.当一个类实现一个接口,重写方法前必须写public,因为接口的抽象方法默认就是pubic的,不能低于public

6.如果一个接口A继承一个接口B,这里的继承意味着拓展,类似于抽象类继承抽象类

interface IRunning{
    void run();
}

interface IWalking extends IRunning{
    void walk();
}

   

码字不易,望大佬点赞👍。会回访,大家一起学习🎉。

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶chuchu丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值