【JAVA |抽象类和接口】JAVA中的抽象类和接口 纯干货!!!

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈


✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨ 

目录

目录

一、前言

二、抽象类

1.abstract

2.抽象的类特性

三、接口

1.interface

2.接口的使用

3.接口的特性

4.多接口

5.接口的继承


一、前言

接口提供了一种抽象的方法定义和类型规范,可以帮助我们实现代码的灵活性、可扩展性和可维护性,接口可以看作是一种合约或协议,规定了类应该实现哪些方法。


二、抽象类

在面对对象的这个概念中,所有的对象都是通过类来描述的,但是并不是所有的类都是用来描述对象的,如果一个类中没有包含足够多的信息来描述一个具体对象的话,这样的类就是抽象类,主要作用还是为了编译器的检验防止我们出错


就好比这个Animal动物的类,名字,年龄,睡觉,这是所有动物的共性,并不能描述具体对象,像这样的类,我们就可以设置为抽象类

class Animal{

    public String name;
    public int age;

    public void sleep(){
        System. out. println("睡觉”);
    }
}


1.abstract

抽象类也是类,内部不仅仅包含了构造方法,普通方法跟属性,同时也有独有的抽象方法;

抽象类中可能不包含抽象方法,但有抽象方法一定是抽象类。

我们把用abstract 关键字修饰的类或方法称为抽象类和抽象方法

就好比下述代码

//抽象类
abstract class Animal{

    public String name;
    public int age;

//抽象方法(没有方法体)
    abstract public void sleep();
}

abstract 关键字修饰后的Animal类跟sleep方法就变成了抽象类和抽象方法


2.抽象的类特性

抽象类不能够实例化对象,当实例化一个抽象类对象的时候编译器会报错

public static void main(String[]args){

    Animal animal = new Animal();
}


抽象方法访问权限不能是private,同时不能被final跟static修饰,因为抽象方法必须被子类重写

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

    abstract private void sleep1();

    abstract public final void sleep2();

    abstract public static void sleep2()

}


抽象类存在的意义必须被继承,继承的子类要重写父类中的方法,不然便会报错(可以给子类加private,意为子类也为抽象类)

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

    abstract public void sleep();
}

class Dogl extends Animal{
}

class Dog2 extends Animal{

    @0verride
    public void sleep(){
    //重新方法
    }
}

abstract class Dog3 extenas An1mal{
}

Dog1方法中继承了父类但未重写于是报错,Dog2方法中对父类的抽象方法进行了重写正常编译,Dog3中加入了abstract 使得其也为抽象类。


三、接口

接口就是公共行为的行为规范标准,大家在实现它的时候只要符合规范标准,就可以一起使用,在JAVA中接口可以看成是:多个类的公共规范,是一种引用数据类型。  


1.interface

接口定义的方式与类相同,只不过把关键字class替换成了关键字interface,就定义了一个接口

就像下面这样我们定义了一个叫IUSB的接口

public interface IUSB{
    int key= 123;

    void openDevice();
    void closeDevice();
}

接口中的变量会被隐式指定为public static final,一般可以省略接口中的方法会被隐式指定为public abstract,一般可以省略。

public interface IUSB{
    public static final int key= 123;

    public abstract void openDevice();
    public abstract void closeDevice();

}


2.接口的使用

方法不能够直接去使用,必须有一个实现类来实现该接口,接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

类与接口之间是 implements 实现关系

比如下面这个代码KeyBoard方法就是一个实现类,可以在类中实现自己的方法但必须重写接口的所有抽象类,不然会报错

public class KeyBoard implements IUSB{

}

这样就正常编译

public class KeyBoard implements IUSB {

    @Override
    public void openDevice(){
        System.out.println("打开键盘");
    }
    
    @0verride
    public void closeDevice(){
    System. out.println("关闭键盘");
    }
    
    public void inPut(){
    System.out.println("键盘输入")
    }
}


3.接口的特性

接口类型也是一种引用的数据类型,不能够实例化对象,当实例化一个抽象类对象的时候编译器会报错

public static void main(String[] args){
    IUSB usb = new IUSB();
}


在重写接口中的方法时必须使用public因为实现类中访问权限要小于等于接口类,而接口默认的方法为public

我们可以看出来,在重写方法时不带访问权限或者带private均会报错,只能使用public

class A implements IUSB {

    @0verride
    private void openDevice(){
    }

    @0verride
    void openDevice(){
    }

    @0verride
    public void closeDevice(){
    }
}

 


接口中不能带有静态代码块跟构造方法,否则会报错

public interface IUSB{
    static{
        System.out.println("我是静态代码块");
    }

    public IUSB() {
        System. out.println("我是构造方法")
    }

        void openDevice();
        void closeDevice();
}


4.多接口

我们都知道在JAVA中的类不能实现多继承,但是一个类能实现多接口!

我们拿一段代码 举例子,首先构造出一个父类

public class Animal{
    protected String name;

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

再构造出几个接口

public interface ISwimming{
    void swim();
}

public interface IRunning {
    void run();
}

public interface IFlying{
    void fly();
}

构造一下实现类并且继承父类Animal

猫只能跑,所以用IRunning接口

public class Cat extends Animal implements IRunning{

    public Cat(String name){
        super(name);
    }

    @Override
    public void run(){
        System.out.println(this.name +"正在用猫腿跑");
    }
}

鱼只能游,所以用ISwimmin接口

public class Fish extends Animal implements ISwimming{

    public Fish(String name){
        super(name);
    }

    @Override
    public void swim(){
        System.out.println(this.name +"正在用鱼尾游");
    }
}

青蛙能游能跑,所以用ISwimmin接口和IRunning接口

public class Frog extends Animal implements ISwimming,IRunning{
    public Frog(String name){
        super(name);
    }

    @0verride
    public void run(){
        System.out.println(this.name + "正在用蛙腿跑");
    }

    @Override
    public void swim(){
        System. out.println(this.name + "正在用蛙腿游");
    }
}

鸭子能游能跑能跳,所以用ISwimmin接口、IRunning接口和IFlying接口

public class Duck extends Animal implements IRunning, ISwimming, IFlying{
    public Duck(String name){
        super(name);
    }

    @Override
    public void fly(){
        System.out.println(this.name + "正在用鸭翅膀飞");
    }

    @0verride
    public void run(){
        System.out.println(this.name + "正在用鸭腿跑");
    }

    @0verride
    public void swim(){
        System.out.println(this.name + "正在用鸭腿游");
    }
}

当然也可以不继承父类的单独的一个类也是可以使用接口

机器人可以跑,所以用IRunning接口

public class Robot implements IRunning{
    private String name;

    public Robot (String name){
        this.name = name;
    }

    @Override
    public void run(){
        System.out.println(this.name +"正在用机械腿跑”)
    }
}

我们来验证一下

public class Test{

    public static void run(IRunning name){
        name.run();
    }

    public static void swim(ISwimming name){
        name.swim();
    }

    public static void fly(IFlying name){
        name.fly();
    }

    public static void main(Stringl args){
        Cat cat = new Cat( name + "小喵");
        Duck duck = new Duck( name + "小鸭");
        Fish fish = new Fish( name + "小鱼");
        Frog frog = new Frog( name + "小蛙");
        Robot robot = new Robot( name + "机器人");

        run(cat):
        run(duck).
        run(frog);
        run(robot):

        swim(duck):
        swim(fish);
        swim(frog);

        fly(duck);
    }
}

验证通过


5.接口的继承

当然继承之间也是可以使用继承的

创建一个新接口IAmphibious,相当于把IRunning接口和ISwimmin接口合并在了一起

public interface IAmphibious extends ISwimming,IRunning{
}

希望对你有帮助

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值