Java抽象类和接口

简介: Java抽象类和接口

前言


各位朋友们,大家好!今天我为大家分享的是Java的抽象类和接口,大家听到抽象类和接口可能就会想它到底有多抽象呢?很多初学者在学完了抽象类和接口之后可能大脑里面还没有抽象类和接口这个概念,也就像我们在学习离散数学的时候一样,课上跟着老师的步伐走可能当时能理解,但是每当下课铃声一响,你的脑子一片空白,并且在写老师布置的作业的时候会想:这个知识老师讲过了吗?大家别急,今天这篇文章我将带大家好好领略抽象类和接口的神奇之处。


抽象类


为什么会有抽象类这个概念


前面我们的大家可能都学过了继承,如果没学也别急,大家可以看看这篇文章Java继承(不能再留遗憾了)我们可以使用继承来将类的共性给提取出来作为父类来降低代码的复用率,但是我们想一想是不是有了继承就解决了一切呢?NO NO NO当然不是,我们来看一个例子:

class Animal {
    String name;
    float weight;
    public Animal(String name, float weight) {
        this.name = name;
        this.weight = weight;
    }
    public void Eat() {
        System.out.println(name+"吃猫粮");
    }
}
class Cat extends Animal{
    public Cat(String name, float weight) {
        super(name, weight);
    }
}
class Dog extends Animal {
    public Dog(String name, float weight) {
        super(name, weight);
    }
}
public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat("小花",20);
        cat.Eat();
        Dog dog = new Dog("大黄",30);
        dog.Eat();
    }
}

image.png


我们都知道猫和狗一般都有名字,有体重等等,都会吃东西,所以我们将这些共性提取到Animal父类中,然后猫和狗继承Animal类也就继承了父类的成员变量和成员方法,但是当我们调用子类猫和狗的Eat方法时,我们会发现狗也吃猫粮?这显然是不合理的,因为就算他们都能吃东西,但是他们吃的食物的种类是不同的,我们在父类中将Eat的方法给实现了就太局限了,所以这里我们就出现了抽象类,抽象类可以很好的解决这个问题。


什么是抽象类


抽象类是指被abstract关键字修饰的类。抽象类中可以有普通的成员变量,可以有普通的成员方法也可以有抽象方法。抽象方法是指被abstract修饰的没有方法体的方法,这也就类似于我们C语言的函数的声明,这里只是告诉你我要使用这个方法,但是具体怎样使用,我不告诉你。抽象方法的实现需要你继承了这个子类来实现,我们的抽象方法不需要考虑这个。但是我们需要知道的是:既然他是抽象方法,什么是抽象?就是我们触摸不到的东西,是我们需要脑子想出来的东西,所以抽象类不能被实例化,也就是说抽象类无法使用new这个关键字实例出对象,他只能被子类继承,并且你的子类必须重写你父类的所有抽象方法,否则,你的子类也是一个抽象类。说到重写,我们知道你要想被重写就不能使用private和final来修饰你的抽象方法。


14.png

15.png


如果用private或者final来修饰你的抽象方法,编译器将会报错,这也会使你尽早发现你的错误。


16.png


当你的子类没有重写父类的所有抽象方法时,编译器同样会报错,你要不就是用abstract修饰这个类,使这个类也成为抽象类,但是你欠下的早晚都要还的,既然你的这个类是抽象类,你也需要别的类来继承你的这个抽象类,你要想别的类不为抽象类,你不仅需要重写这个类的抽象方法,还需要将这个类没有重写的父类抽象类的抽象方法重写,所以我们还是将这个抽象方法重写了最好。

abstract class Animal {
    String name;
    float weight;
    public Animal(String name, float weight) {
        this.name = name;
        this.weight = weight;
    }
    abstract void Eat();
}
class Cat extends Animal {
    public Cat(String name, float weight) {
        super(name, weight);
    }
    public void Eat() {
        System.out.println(name+"吃猫粮");
    }
}

我们使用抽象类来解决开头的问题。

abstract class Animal {
    String name;
    float weight;
    public Animal(String name, float weight) {
        this.name = name;
        this.weight = weight;
    }
    abstract void Eat();
}
class Cat extends Animal {
    public Cat(String name, float weight) {
        super(name, weight);
    }
    public void Eat() {
        System.out.println(name+"吃猫粮");
    }
}
class Dog extends Animal {
    public Dog(String name, float weight) {
        super(name, weight);
    }
    public void Eat() {
        System.out.println(name+"吃狗粮");
    }
}
public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat("小花",20);
        cat.Eat();
        Dog dog = new Dog("大黄",30);
        dog.Eat();
    }
}

17.png


见识到抽象类的功能强大了没,既然抽象类就这么强大,那么我们来看看比抽象类更加抽象的-接口。


接口

什么是接口


为什么说接口是比抽象类更加抽象呢?因为在抽象类中可以有普通成员变量和方法,但是在接口中不存在普通的成员变量和普通方法,接口中只能有被public static final修饰的成员变量和public abstract修饰的抽象方法,但是在JDK8之后接口中可以存在default修饰的普通方法。


接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。


在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。


如何定义接口以及如何实现接口


定义一个接口


在定义接口的时候,我们只需要将定义类的时候的class换成interface就可以了。

public interface 接口名称{
  public static final int a;
  int b;
// 抽象方法
  public abstract void method1(); // public abstract 是固定搭配,可以不写
  public void method2();
  abstract void method3();
  void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

我们在定义成员变量或者方法时可以将public static final 和public abstract省略,在接口中成员方法会被默认为public static final修饰的,抽象方法也会被默认为public abstract。并且通常接口的名称是以“I”开头的。


实现接口


跟继承类似,我们用implements关键字来实现接口。

public class 类名称 implements 接口名称{
  // ...
}
public interface IRunning {
    void running();
}
public interface ISwimming {
    void swimming();
}
public interface IFlying {
    void flying();
}
class Cat implements IRunning {
    @Override
    public void running() {
        System.out.println("猫会走");
    }
}
class Fish implements ISwimming {
    @Override
    public void swimming() {
        System.out.println("鱼会游泳");
    }
}
class Bird implements IFlying {
    @Override
    public void flying() {
        System.out.println("鸟会飞");
    }
}
public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.running();
        Fish fish = new Fish();
        fish.swimming();
        Bird bird = new Bird();
        bird.flying();
    }
}

image.png


我们定义不同的接口,那些类具有这些特性,需要使用它,就直接实现它,这极大的提高了代码的灵活性。


实现多个接口


不仅如此,我们一个类还可以实现多个接口,这也可以说是解决了Java不能多继承的问题。

class frog implements ISwimming,IRunning {
    @Override
    public void swimming() {
        System.out.println("青蛙会游泳");
    }
    @Override
    public void running() {
        System.out.println("青蛙会走");
    }
}

接口之间的继承关系


接口与接口之间可以有继承关系,并且接口与接口之间可以多继承,也可说是接口的拓展。

public interface IRunning {
    void running();
}
public interface ISwimming {
    void swimming();
}
public interface IAmphibious extends IRunning,ISwimming{
}
class frog implements IAmphibious {
    @Override
    public void swimming() {
        System.out.println("青蛙会游泳");
    }
    @Override
    public void running() {
        System.out.println("青蛙会走");
    }
}

通过接口继承创建一个新的接口 IAmphibious 表示 “两栖的”. 此时实现接口创建的 Frog 类, 就继续要实现 running 方法, 也需要实现 swimming 方法.


抽象类和接口的区别

抽象类和接口都是Java中用于实现抽象类的机制,它们都不能被实例化,但是在使用方式、语法和用途方面有所不同。


1.实现方式

抽象类用关键字abstract来定义,包含普通方法、抽象方法、成员变量、成员方法和构造函数等,并且可以包含非抽象的方法实现。而接口是一组没有实现的特定方法集合,用关键字interface来定义,它不能包含非常量的成员变量,只能包含方法签名和常量。


2.继承方式

一个类只能继承一个抽象类,因为Java不支持多重继承。而接口支持多重继承,因为一个类可以实现多个接口。


3.方法实现方式

在抽象类中,可以有非抽象的方法实现,子类可以直接继承和使用这些方法。而在接口中,所有的方法都是抽象的,必须在实现类中实现所有的方法。


4.操作能力

抽象类可以作为一个实现类,它可以有一些已经实现好的方法,而且也可以定义一些抽象的方法,由子类实现。而接口只是一个描述行为的规范,不能有方法实现。只有某个类实现了这个接口,才能使用该接口中定义的方法。


5.应用场景

抽象类通常用于为所有的子类提供公共的方法或属性,在框架和类库的设计中较为常见。而接口通常用于定义与实现类无关的、普适性的方法,更多地用于描述类之间的通信、约定和功能规范。

综上所述,虽然抽象类和接口都是Java中实现抽象类的机制,但是它们的设计目标、实现方式、继承方式、方法实现方式以及应用场景等方面存在一些明显的差别。


总结

在Java中,抽象类和接口都是用于定义抽象类、协议或规范的工具。抽象类用于为所有子类提供一个公共的接口,它通过定义抽象方法、非抽象方法、变量和常量等实现这种目的。接口则是一组没有实现的特定方法集合,通过实现接口,一个类可以定义一组行为或功能规范,而不需要对其进行具体实现。在实际编程中,应该根据具体的业务需求选择合适的方式来进行定义和实现。


目录
打赏
0
0
0
0
3
分享
相关文章
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
269 3
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
36 5
|
3月前
|
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
245 64
|
3月前
|
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
290 60
|
3月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
203 58
|
3月前
|
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
113 38
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
2月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
61 6
|
3月前
|
Java中内置的函数式接口
Java中内置的函数式接口
48 2
|
3月前
|
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
51 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等