iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java超详细分析抽象类和接口的使用
  • 232
分享到

Java超详细分析抽象类和接口的使用

2024-04-02 19:04:59 232人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是抽象类抽象类语法总结抽象类:接口怎么定义接口接口间的继承几个重要的接口接口comparablecomparator接口-比较器cloneable接口深入理解深拷贝与浅拷贝怎

什么是抽象类

什么是抽象类呢?抽象类顾名思义就是很抽象,就是当我们没有足够的信息去描述这个类的时候我们就可以先不用描述,这样的类就是抽象类。

用代码举个例子:

class Shape {
    public void draw() {
        System.out.println("我要画图形!!");
    }
}
class circle extends Shape {
    @Override
    public void draw() {
        System.out.println("我要画圆形!!!");
    }
}
class rect extends Shape {
    @Override
    public void draw() {
        System.out.println("我要画矩形!!!");
    }
}
public class TestDemo3 {
    public static void drawShape(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
        drawShape(new circle());
        drawShape(new rect());
    }
}

正好也通过这个小小的案例来复习一下多态,我们创建一个Shape父类,然后又创建两个子类分别为 rect类和circle类 然后利用这两个类使用同一个方法,产生的形态是不一样的这就是多态,但是

我们可以发现我只用了这两个子类来画图形分别是圆形和矩形,我并没有调用父类来实现这个方法,为啥呢???就是因为这个父类并不能画出图形,那这个父类的draw方法的实现岂不是没有用,我只需要它父类要有这方法,通过子类重写就可以了,不需要父类的方法有具体的实现。

没错,这就引入到我们今天的主题抽象类

上面父类的draw方法由于它的具体实现根本没有用处,所以我们就可以不写,这也正符合抽象类的定义,当不能有足够的信息去描述它,那我们就把它叫做抽象类。

抽象类语法

上面父类的draw方法没有具体的实现我们就可以把它叫做抽象方法。利用abstract来修饰

public abstract void draw();

但是这样为啥会报错呢??

原因是被abstract修饰的方法叫做抽象方法,如果一个类里面有抽象方法,那这个类一定是抽象类,所以类也要被abstract来修饰。

但是相反,抽象类里面一定有抽象方法么???

编译器并不会报错,所以答案是不一定,抽象类里面可以有抽象方法也可以没有抽象方法。

抽象类能否被实例化呢???

所以,抽象类是不能实例化的。 

抽象类能否像普通类一样定义成员变量和方法,构造方法呢???

抽象类与普通类的区别就是在与抽象类不能实例化,其他定义成员变量,成员方法,构造方法等等都是一样的。

 既然抽象类不能实例化,那他存在的意义是什么呢???

老铁思考的有道理,其实抽象类最大的意义就是被继承,因为抽象类不能实例化对象,只能依靠子类来重写父类(就是抽象类)的方法来完成业务需求。

怎么继承抽象类呢???有哪些注意的点呢???

 这样继承为啥会出错呢??原因是在子类继承抽象类的时候,子类需要重写父类的所有方法或者子类需要用abstract修饰(抽象类被抽象类继承或者子类重写抽象类(父类)的所有方法)。

这样就正确了。

这里还要注意当我们没有重写父类的方法时而是用abstract来修饰,这时当你在次继承这个子类的时候也就是这个子类变成了父类,下一个子类还是要继续重写这个父类的方法和这个父类的父类的方法。 

抽象方法能否别static和final修饰呢???

 抽象方法不能被static  和final 修饰,因为子类要重写父类的方法,同时可以省略访问修饰限定符,默认是public。

总结抽象类:

  • 我们把不能足够描述清楚一个对象的类叫做抽象类。
  • 被abstract修饰的方法称为抽象方法,被abstract修饰的类称为抽象类
  • 抽象方法必须在抽象类里面,也就是说,只要有抽象方法,类名也必须利用abstract来修饰,相反,抽象类里面可以没有抽象方法,也可以有抽象方法。
  • 抽象类不能实例化,除了不能实例化之外其他与普通类一样可以定义成员变量,成员方法,构造方法等。同时构造方法和类方法(被static修饰的方法)不能被abstract来修饰
  • 抽象方法的访问修饰限定符不能是private,如果省略默认是public,同时抽象方法不能被final修饰。
  • 子类继承抽象类的时候,子类必须重写抽象类的所有方法并且要有方法的具体实现,如果重写那子类还是抽象类,必须用abstract来修饰。
  • 抽象类中的方法没有具体实现,要通过子类重写在子类中实现。
  • 一个类只能继承一个抽象类

接口

说到接口我们会想到什么呢???我一开始想到的就是充电接口插排等等,比如充电接口,只要符合那个插口的标准,我们都可以使用那个接口来进行充电。这就是把标准进行统一起来,然后大家就可以根据不同的标准来使用不同的接口,比如苹果手机与安卓手机的手机接口就是不一样的,他们就是两种不同的标准,安卓手机用安卓的接口,苹果用苹果的接口这就将标准统一起来。

而在Java中也是一样的,我们把这个标准或者可以说是一种公共的规范叫做接口,只要符合这一接口的标准我们就可以使用它。

听着这抽象的概念你可能现在还是不太明白这到底是什么,我在来拿代码举个例子:

class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println(this.name+"吃饭***!");
    }
}

这里我定义了一个动物类,这个动物有名字,年龄,还有吃饭的行为。

class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println(this.name+"吃饭***!");
    }
    public void swim() {
        System.out.println("我要游泳~~~~");
    }
}
class Fish extends Animal {
}

接着我又定义了一个鱼类(子类)继承这个动物类(父类),我想让这个鱼有这个游泳的行为,但是这就会有一个问题,在父类定义了一个swim方法,接着我还要定义很多类,难道所有的类都要有这个游泳的行为么???答案是不可以的。所以我们就不能把这个swim方法定义在父类里面,那我们就可以把这个方法定义在子类(鱼类)里面,这样就符合了,但是如果我还要定义1000个动物都会游泳难道都要在自己类中写这个游泳的方法么??这样做显然是不可行的。那我们该怎么做呢??

我们可以就提供一个公共的接口,这也是一种标准,只要符合这一标准都可以使用这个接口或者可以说可以实现这一功能。

看了上面的引例我们应该接口是干什么的了,接下来我们来学一下接口的语法。

怎么定义接口

定义接口要使用interface关键字:

//创建一个接口
//创建接口要是用interface关键字  接口的命名最好是形容词其他的也可以
interface IFlying{
    //这就是一个flying接口
}

接口中的成员变量:

这样会报错,接口中的成员变量都是常量,所以必须初始化,接口中的成员变量会被隐式指定为public static final 修饰的。

interface IFlying{
    //接口中的成员变量默认都是被public static final修饰的常量
    //这里的成员变量不可改变
   public static final int a =10;
}

接口中的成员方法:

interface IFlying{
    //接口中的成员方法都是抽象方法,默认是public abstract 
    //其中public abstract 可以被省略
    //接口中的成员方法不能有具体的实现
    public abstract void eat();
    //一般就写成:
    //void eat();
    default void sleep(){
        //接口中的方法想要具体实现,要加上default修饰
    }
    //接口中可以有静态方法的具体实现
    public static void method() {
        System.out.println("我是静态的方法!!");
    }
}

接口能否实例化???

接口是不能被实例化的。

怎么使用接口???

实现的接口如下:

interface IFlying{
    void eat();
}
interface IRunning{
    void run();
}
interface ISwimming{
    void swim();
}
interface IClimbing{
    void climb();
}
//创建一个Ant类 
//利用implements关键字来实现接口
//一个类可以实现多个接口,接口之间利用逗号连接
//实现了接口必须要在接口中重写接口中的方法
//重写方法快捷键:鼠标移动到implements关键字上然后 alt+enter
class Ant implements IClimbing,IRunning{
    public String name;
    @Override
    public void run() {
        System.out.println(this.name+"要跑步");
    }
    @Override
    public void climb() {
        System.out.println(this.name+"爬山");
    }
}
  • 接口的使用时利用implements关键字与类连接,类与接口之间使用implements连接的。
  • 一个类可以实现多个接口,多个接口之间利用逗号连接。
  • class Ant implements IClimbing,IRunning.的意思是类Ant可以实现两个功能,既可以爬又可以跑。
  • 类实现接口时,必须要重写接口中的方法。如果不重写该类还是抽象类,要用abstract来修饰。
  • 接口能否有静态方法和代码块呢???

  • 接口中是不能有静态代码块和构造方法的。 

接口间的继承

我们这里总结一下类与接口之间的联系

  • 类与类之间是继承关系利用extends来连接   代表子类继承了父类
  • 类与接口之间是利用implements来连接, 代表类能实现某个功能
  • 接口与接口之间也可以进行联系,利用extends 接口A和接口B  interface A enxtends B 代表接口A拓展了接口B的功能。

这里来讲一下接口与接口之间的继承

我们利用extends关键字将两个接口连接起来,这样就实现了接口之间的继承。

例如:

interface IRunning extends IFlying{
    //类IRunning拓展了IFlying的功能
    void run();
    //接口与接口之间继承后IRunning拓展了IFlying功能
    //有了IRunning的功能的类也要重写IFlying这个方法
}
  • 类IRunning拓展了IFlying的功能
  • 接口与接口之间继承后IRunning拓展了IFlying功能
  • 有了IRunning的功能的类也要重写IFlying这个方法

几个重要的接口

接口comparable

我们这里举一个例子:

比如我们要进行给一个学生进行排序,我们之前学过Arrays的sort方法,好我们来尝试一下这个方法对学生进排序。

class Student{
    public String name;
    public int age;
    public double score;
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student[] student = new Student[4];
        student[0] = new Student("张三",18,88);
        student[1] = new Student("李四",98,98);
        student[2] = new Student("王二麻子",8,18);
        student[3] = new Student("赵老八",58,38);
        System.out.println(Arrays.toString(student));
        Arrays.sort(student);
        System.out.println(Arrays.toString(student));
    }
}

从这里发现Arrays.sort方法是比较具体的数字大小的,而我们这里比较学生这个对象并没有指定,我们究竟依靠什么来比较这个学生对象,目前这个学生有名字,分数,年龄,我们到底依靠什么比较是根据我们的需求来定,那我们要具体的比较学生对象的某一个学生怎么比较呢·???看报错信息也就是这个异常,我们需要提供这个comparable这个接口然后重写这个comparable方法。

怎样提供接口????

 我们根据类要实现一个接口是利用关键字implements来连接的。

 然后使用comparable这个接口,尖括号里面写上你要排序的类。

好这样我们就实现了这个接口,当然看前面那个红线就知道会有报错,这也就是当我们实现一个接口我们必须重写这个接口中的方法,然后Alt+enter重写这个接口中的方法。

好,我们就重写了这样的一个方法,比如我们要比较年龄按照升序排列:

然后调用Arrays.sort方法就可以进行排序了。

 同样我们还可以根据名字排序:

由于,名字是String类型也就是引用类型所以我们要调用compareTo方法来进行比较。

同样的我们还可以根据分数来排序这个学生对象。

comparator接口-比较器

我们刚才使用comparable这个接口会有一个缺陷,就比如当我们已经实现按照年龄排序好了,但是有个人突然把他改成了名字比较,如果是未来做项目开发的时候,那就会给程序猿造成很大的困扰,就怕有一天别人修改了那段代码,所以我们就有了这个comparator这个比较器,我们还是把他封装起来,不用在去学生这个类中去修改。

对学生年龄排序:

class AgeComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}

对学生分数排序:

class ScoreComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return (int)(o1.score - o2.score);
    }
}

对学生名字排序:

class NameComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}

我们还是利用Arrays.sort方法里面再加一个比较器的这个参数就可以比较了。

 public static void main(String[] args) {
        Student[] student = new Student[4];
        student[0] = new Student("张三",18,88);
        student[1] = new Student("李四",98,98);
        student[2] = new Student("王二麻子",8,18);
        student[3] = new Student("赵老八",58,38);
        System.out.println(Arrays.toString(student));
        AgeComparator ageComparator = new AgeComparator();
        Arrays.sort(student,ageComparator);
        System.out.println(Arrays.toString(student));
    }

这样我们将根据什么排序,实例化对应的对象,通过对象调用重写comparator的方法就可以进行比较,不需要担心类中被修改。

cloneable接口深入理解深拷贝与浅拷贝

我们之前学过数组中的克隆方法,就是把一个数组中的内容全部拷贝到另外一个数组中去。

今天我们学的cloneable接口可以将一个对象的属性拷贝到另外一个对象里面去。

怎么使用cloneable接口

我们创建一个人这个类,人这个类中有两个属性,一个是分数,一个是smartphone这个对象(引用类型)。

class SmartPhone{
    public int money = 9999;
}
class Person{
    public int score = 96;
    SmartPhone smartPhone = new SmartPhone();
}
public class TestDemo {
    public static void main(String[] args){
        Person person1 = new Person();
    }
}

我们现在要将这个person这个类实现cloneable接口,利用implements连接,同样的我们要重写这个cloneable这个接口中的方法。

这里我们要注意·重写cloneable这个方法,它的返回类型是object,object是Java中所有类的父类。

好,完成了接口的操作,我们接下来完成克隆的工作,我们怎么使用clone这个方法来进行克隆呢???

浅拷贝:

//浅拷贝
class SmartPhone{
    public int money = 9999;
}
class Person implements  Cloneable{
    public int score = 96;
    SmartPhone smartPhone = new SmartPhone();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "Person{" +
                "score=" + score +
                ", smartPhone=" + smartPhone +
                '}';
    }
}
public class TestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        Person person2 = (Person)person1.clone();
        System.out.println(person1.smartPhone.money);
        System.out.println(person2.smartPhone.money);
        person1.smartPhone.money=9;
        System.out.println("===============拷贝之后=================");
        System.out.println(person1.smartPhone.money);
        System.out.println(person2.smartPhone.money);
    }
}

 原因是什么呢??画一下图理解一下

 这就是浅拷贝,对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此

为浅拷贝。只要将money值进行修改两个对象的money的值都改变,没有彻底的拷贝。

深拷贝

//深拷贝
class SmartPhone implements  Cloneable{
    public int money = 9999;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "SmartPhone{" +
                "money=" + money +
                '}';
    }
}
class Person implements  Cloneable{
    public int score = 96;
    SmartPhone smartPhone = new SmartPhone();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person tmp = (Person)super.clone();
        tmp.smartPhone= (SmartPhone) this.smartPhone.clone();
        return tmp;
    }
    @Override
    public String toString() {
        return "Person{" +
                "score=" + score +
                ", smartPhone=" + smartPhone +
                '}';
    }
}
public class TestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        Person person2 = (Person)person1.clone();
        System.out.println(person1.smartPhone.money);
        System.out.println(person2.smartPhone.money);
        person1.smartPhone.money=9;
        System.out.println("===============拷贝之后=================");
        System.out.println(person1.smartPhone.money);
        System.out.println(person2.smartPhone.money);
    }
}

 此时为深拷贝,进行了彻底的拷贝。对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

到此这篇关于Java超详细分析抽象类和接口的使用的文章就介绍到这了,更多相关Java抽象类与接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java超详细分析抽象类和接口的使用

本文链接: https://www.lsjlt.com/news/147337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java超详细分析抽象类和接口的使用
    目录什么是抽象类抽象类语法总结抽象类:接口怎么定义接口接口间的继承几个重要的接口接口comparablecomparator接口-比较器cloneable接口深入理解深拷贝与浅拷贝怎...
    99+
    2024-04-02
  • Java超详细介绍抽象类与接口的使用
    目录1.抽象类的语法和特性1.1语法1.2特性2.接口的语法和使用2.1语法2.2特性1.抽象类的语法和特性 1.1语法 1.在Java中,一个类如果被abstract 修饰称为抽象...
    99+
    2024-04-02
  • Java超详细讲解抽象类与接口的使用
    目录一、抽象类1、抽象类的语法2、抽象类的特性3、抽象类的作用二、接口1、接口的概念2、接口使用3、接口特性4、实现多个接口5、接口间的继承6、常用的接口(1)Comparable接...
    99+
    2024-04-02
  • Java中的抽象类和接口实例分析
    这篇文章主要介绍了Java中的抽象类和接口实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的抽象类和接口实例分析文章都会有所收获,下面我们一起来看看吧。抽象类什么是抽象类?类和类之间有共同特征,...
    99+
    2023-06-29
  • Java中抽象类和接口的示例分析
    这篇文章主要介绍了Java中抽象类和接口的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、抽象类1.抽象类1.1抽象类的定义在Java面向对象当中,所有的对象都是用...
    99+
    2023-06-25
  • Java抽象类和接口如何使用
    本文小编为大家详细介绍“Java抽象类和接口如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java抽象类和接口如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是抽象类什么是抽象类呢?抽象类顾名...
    99+
    2023-06-30
  • Java抽象类与接口实例分析
    这篇“Java抽象类与接口实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java抽象类与接口实例分析”文章吧。1.抽...
    99+
    2023-06-30
  • Java抽象类和接口怎么使用
    本篇内容主要讲解“Java抽象类和接口怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java抽象类和接口怎么使用”吧!看一下具体的例子,有一些小细节平时可能不会注意。class ...
    99+
    2023-06-02
  • java接口和抽象类怎么使用
    Java 接口和抽象类是面向对象编程的重要概念,用于实现代码的抽象和封装。以下是它们的使用方法:1. 接口:- 定义接口:使用 `i...
    99+
    2023-08-09
    java
  • Java抽象类和接口使用梳理
    目录抽象类抽象方法抽象类三大原则接口接口使用原则JDK两大内置接口java.lang.Comparable 比较接口java.lang.Cloneable 克隆接口对象的深浅拷贝抽象...
    99+
    2024-04-02
  • 深入浅析Java 抽象类和接口
    目录一、抽象类1.抽象类1.1抽象类的定义1.2抽象方法的定义方式1.3抽象类的定义方式2.抽象类和实例类的区别3.抽象类示例4.抽象类的特征二、接口1.接口1.1接口的定义1.1定...
    99+
    2024-04-02
  • Java抽象类和接口的区别详情
    1、抽象类 vs 接口  方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态方法。 最终变量: 在 Java...
    99+
    2024-04-02
  • Java中的抽象类和接口
    目录 一、什么是抽象类 抽象类在实现多态中的意义  二、接口是什么  通过接口实现多态 三、抽象类和接口的区别  各位铁汁们大家好呀😊! 😎今天让我们继续学习java,看看java中的抽象类和接口到底是什么...
    99+
    2023-08-31
    java Java接口 抽象类与多态
  • Java 接口和抽象类的区别详解
    目录什么是抽象类和接口? 区别在哪里?抽象类接口抽象类和接口解决了什么问题?如何模拟抽象类和接口如何决定该用抽象还是接口?什么是抽象类和接口? 区别在哪里? 不同的编程语言对接口和...
    99+
    2024-04-02
  • 解析JavaSe的抽象类和接口
    目录1. 抽象类和抽象方法2. 相关面试题1、抽象类必须要有抽象方法吗?2、普通类和抽象类有哪些区别?3、抽象类能使用 final 修饰吗?3. 接口3.1 接口中的常量3.2 接口...
    99+
    2024-04-02
  • Java抽象类和接口怎么用
    这篇文章将为大家详细讲解有关Java抽象类和接口怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。抽象类什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”、“图形...
    99+
    2023-06-29
  • Java中的多态、抽象类和接口详解
    目录1.多态1.1 向上转型1.2 向下转型1.3 实现多态的条件1.4多态的特点与使用1.5多态的应用以父类类型作为方法的参数使用父类型作为方法的返回值1.6 多态的注意点2.抽象...
    99+
    2024-04-02
  • Java抽象类和接口的比较
    这篇文章主要介绍“Java抽象类和接口的比较”,在日常操作中,相信很多人在Java抽象类和接口的比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java抽象类和接口的比较”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • Java多态性抽象类与接口细致详解
    目录1、多态性1.1向上转型1.2向下转型2、抽象类2.1抽象类的基本概念3、接口3.1接口的基本概念3.2接口的使用限制3.3使用接口定义标准3.4抽象类与接口的区别1、多态性 多...
    99+
    2024-04-02
  • JAVA抽象类,接口,内部类详解
    目录一.内容抽象类抽象方法与抽象类抽象类的使用接口接口的概念接口的定义接口中的成员变量接口中的方法接口的继承接口的实现/使用接口与抽象类的差异面向接口编程内部类非静态内部类静态内部类...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作