iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java抽象类和接口怎么用
  • 338
分享到

Java抽象类和接口怎么用

2023-06-29 04:06:25 338人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Java抽象类和接口怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。抽象类什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”、“图形

这篇文章将为大家详细讲解有关Java抽象类和接口怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    抽象类

    什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”、“图形类”这些无法映射到具体的对象的类就是抽象类。

    抽象类是普通类的超集,意思就是普通类有的抽象类也有,只是它比普通类多了一些抽象方法而已。这些抽象方法可以有一个,也可以有多个。

    它存在的意义就是让子类来覆写它的抽象方法,抽象类和抽象方法的实现使用 abstract 关键字实现: 

    Java抽象类和接口怎么用

    此时Sharp类就是抽象类,可以看到它的图标和普通类都有所不同。

    抽象方法

    示例:

    public abstract void print();

    抽象方法所在的类一定是抽象类,抽象方法只有方法声明,没有方法体{}

    注意区分没有方法体和方法体为空的情况

    public abstract void print();//这是没有方法体

    public abstract void print(){  } //这是方法体为空,它是普通方法

    抽象类三大原则

    抽象类无法直接实例化对象。例如上面的 Sharp 类,Sharp  sharp  = new Sharp();//这是错误的

    子类继承抽象类,必须覆写抽象类中的所有抽象方法(前提是子类是普通类)

    Java抽象类和接口怎么用

    Triangle是一个普通类,此时没覆写方法就报错了,这时我们使用alt + enter 快捷键,点击第一行,再点击ok,就覆写了父类的抽象方法

    Java抽象类和接口怎么用

    Java抽象类和接口怎么用

    但是当子类依然是抽象类时,可以选择不覆写抽象方法

    Java抽象类和接口怎么用

    final 和 abstract 不能同时使用、private 和 abstract 不能同时使用

    Java抽象类和接口怎么用

    抽象类存在的最大意义就是被继承,而且它仍然满足继承关系的 is a 原则

    abstract class Person

    class Chinese extends Person  √  

    class Dog extends Person × //因为Dog not is a Person

    同时抽象类任然受到单继承的局限,此时我们就引出了接口来打破这两个局限

    接口

    Java使用 interface 关键字定义接口,接口中只有全局常量和抽象方法(jdk之前)JDK8扩展了default方法。子类使用 implements 实现接口

    一般接口的命名使用大写 ' I ' 字母开头,子类命名以 Impl 结尾

    全局常量:

    public static final int NUM = 10;

    抽象方法:

    public abstract String msg( );

    接口使用原则

    接口中只有 public 权限,且只有全局常量和抽象方法,所以 abstract、static、final、public这些关键字在接口内部都可以省略

    public interface IMassage {    int NUM = 10;//全局常量     String msg();//抽象方法}

    接口没有单继承限制,子类可以同时实现多个父接口,多个接口之间使用逗号分隔。此时子类必须实现父类接口中所有的抽象方法

    public interface IMassage {    int NUM = 10;//全局常量    String msg();//抽象方法} interface INews{    void getNews();} //子类public class MessageImpl implements IMassage,INews{     public String msg() {        return null;    }    public void getNews() {     }}

    接口可以使用 extends 继承多个父接口,下面的示例若类要实现接口 C ,就必须覆写 A、B、C中所有的抽象方法

        interface A{        void testA();    }    interface B{        void testB();    }    interface C extends A,B{            }

    接口依然不能直接实例化对象,需要通过向上转型实现

    public class MessageImpl implements IMassage,INews{     public String msg() {        return "hello JAVA";    }     public void getNews() {      System.out.println("hello n~");     }     public static void main(String[] args) {        IMassage m = new MessageImpl();        System.out.println(m.msg());     }}

    //输出:hello JAVA

    m只能调用msg方法,不能调用INews接口类定义的方法,需要用父类间的相互转换实现调用

            INews n = (INews)m;        n.getNews();

    //输出:hello n~

    子类若既要继承类又要实现接口,就先继承,后实现接口

    public class D  extends A  implements X,Y{  } 

    JDK两大内置接口

    java.lang.Comparable 比较接口

    引入示例:使用排序方法比较Student类中的对象

    public class Student {    private String name;    private int age;    public Student(String name,int age){        this.name = name;        this.age = age;    }    public String toString(){        return "Student{" +    "name=" + name+'\''+ ",age="+ age + '}';    }     public static void main(String[] args) {        Student s1 = new Student("张三",18);        Student s2 = new Student("李四",20);        Student s3 = new Student("王五",30);        Student[] students = {s3,s1,s2};        Arrays.sort(students);        System.out.println(Arrays.toString(students));    }}

    运行结果:

    Java抽象类和接口怎么用

    程序报错,因为Student类是自定义类型,当使用Arrays.sort方法对自定义类型进行排序时,自定义类型需要实现 Comparable 才具有可比较的能力

    因此我们将上述示例做如下改动:

    public class Student implements Comparable<Student>{    private String name;    private int age;    public Student(String name,int age){        this.name = name;        this.age = age;    }    public String toString(){        return "Student{" +    "name=" + name+'\''+ ",age="+ age + '}';    }    @Override    public int compareTo(Student o) {        if (this.age == o.age){            return 0;        }else if (this.age < o.age){            return -1;        }        return 1;    }     public static void main(String[] args) {        Student s1 = new Student("张三",18);        Student s2 = new Student("李四",20);        Student s3 = new Student("王五",30);        Student[] students = {s3,s1,s2};//乱序放入数组        Arrays.sort(students);        System.out.println(Arrays.toString(students));    } }

    //输出结果:
    [Student{name=张三',age=18}, Student{name=李四',age=20}, Student{name=王五',age=30}]

    可以看到数组按照年龄的升序排序,达到了预期效果。如果想要按照年龄降序排列,只需要修改 compareTo 方法中的一和负一

    Java抽象类和接口怎么用

    实现Comparable接口,必须覆写它的compareTo方法,该方法返回的数字:

    • =0 表示当前对象等于目标对象 o

    • >0 表示当前对象等于目标对象 o

    • <0 表示当前对象等于目标对象 o

    java.lang.Cloneable 克隆接口

    在程序中,克隆是指复制一个新的对象,而这个新对象的属性值是从旧对象中拷贝过来的

    Cloneable 接口是一个标记接口,本身没有任何抽象方法,当一个类实现了 Cloneable 接口,就表示该类具备了克隆的能力,这个能力是JVM赋予的,要知道在堆上开辟空间和对象创建都由JVM实现。

    我们需要覆写 Object 类的 clone 方法,点击向上转型的图标我们就能看到 Object 提供的该方法

    Java抽象类和接口怎么用

    Java抽象类和接口怎么用

    可以看到,clone 方法没有方法体,用 native 关键字修饰,叫做本地方法,clone方法不是Java语言实现的,而是c++实现的,要知道JVM就是由C++实现的。所以本地方法就表示Java调用了C++的同名方法,此处只是方法声明,具体的方法实现是在C++中。所以虽然它没有方法体,但它并不是抽象方法。

    Java抽象类和接口怎么用

    这里我们就能知道一个小知识点:没有方法体的方法不一定就是抽象方法

    代码示例:

    public class Cat implements Cloneable{    private String name;     @Override    protected Cat clone() throws CloneNotSupportedException {        return (Cat) super.clone();    }     public static void main(String[] args) throws CloneNotSupportedException {        Cat c1 = new Cat();        c1.name = "喵喵";        Cat c2 = c1.clone();        System.out.println(c1 == c2);        System.out.println(c2.name);    }}

    输出结果:

    Java抽象类和接口怎么用

    可以看到,输出 false表示c1和c2不是同一个地址,也就是说在堆上为c2开辟了一个新空间,将c1的值拷贝给了c2

    对象的深浅拷贝

    我们先看一个示例:

    class A{    int num;}public class B implements Cloneable{    A a = new A();     @Override    protected B clone() throws CloneNotSupportedException {        return (B)super.clone();    }     public static void main(String[] args) throws CloneNotSupportedException {        B b1 = new B();        B b2 = b1.clone();        System.out.println(b1 == b2);        System.out.println(b2.a.num);        b1.a.num = 100;        System.out.println(b2.a.num);    }}

    输出:false
    0
    100

    根据结果我们看到,将b1.a的值改为100后,b2.a也随之变化,就是说b1.a 和 b2.a 指向了相同的对象

    Java抽象类和接口怎么用

    这就是浅拷贝,拷贝出的 b1 对象只是拷贝了 b1 自身, 而没有拷贝内部包含的 a 对象. 此时 b1 和 b2 中包含的 a 引用仍然是指向同一个对象. 此时修改一边, 另一边也会发生改变.

    我们将代码做如下修改:

    class A implements Cloneable{    int num;     @Override    protected A clone() throws CloneNotSupportedException {        return (A)super.clone();    }}public class B implements Cloneable{    A a = new A();     @Override    protected B clone() throws CloneNotSupportedException {        B b = new B();        b.a = a.clone();        return b;    }     public static void main(String[] args) throws CloneNotSupportedException {        B b1 = new B();        B b2 = b1.clone();        System.out.println(b1 == b2);        System.out.println(b2.a.num);        b1.a.num = 100;        System.out.println(b2.a.num);    }}

    结果:false
    0
    0

    我们让A类也实现克隆接口,可以看到b1.a的修改没有影响b2.a,说明此时b1和b2内部包含的a对象也是不同的,这种拷贝就叫做深拷贝

    在Java中,实现深拷贝的方式有两种:一种是递归实现Cloneable,上述的例子就是递归实现的;另外一种就是通过序列化(Serializable 接口)来进行拷贝。这两种方法现在已经不常用了,现在实现深拷贝是将对象转为JSON字符串

    抽象类和接口的区别

    Java抽象类和接口怎么用

    关于“Java抽象类和接口怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: Java抽象类和接口怎么用

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

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

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

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

    下载Word文档
    猜你喜欢
    • Java抽象类和接口怎么用
      这篇文章将为大家详细讲解有关Java抽象类和接口怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。抽象类什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”、“图形...
      99+
      2023-06-29
    • java接口和抽象类怎么使用
      Java 接口和抽象类是面向对象编程的重要概念,用于实现代码的抽象和封装。以下是它们的使用方法:1. 接口:- 定义接口:使用 `i...
      99+
      2023-08-09
      java
    • Java抽象类和接口怎么使用
      本篇内容主要讲解“Java抽象类和接口怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java抽象类和接口怎么使用”吧!看一下具体的例子,有一些小细节平时可能不会注意。class ...
      99+
      2023-06-02
    • Java中的抽象类和接口怎么应用
      这篇文章主要介绍“Java中的抽象类和接口怎么应用”,在日常操作中,相信很多人在Java中的抽象类和接口怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的抽象类和接口怎么应用”的疑惑有所帮助!...
      99+
      2023-07-02
    • JAVA接口与抽象类怎么使用
      本篇内容介绍了“JAVA接口与抽象类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口概述当需要从几个类中派生出一个类,继承他们所有...
      99+
      2023-07-02
    • Java中抽象类和接口怎么实现
      本篇内容介绍了“Java中抽象类和接口怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、抽象类1.1 什么是抽象类?1.1 对抽象类...
      99+
      2023-06-26
    • Java中的抽象类和接口
      目录 一、什么是抽象类 抽象类在实现多态中的意义  二、接口是什么  通过接口实现多态 三、抽象类和接口的区别  各位铁汁们大家好呀😊! 😎今天让我们继续学习java,看看java中的抽象类和接口到底是什么...
      99+
      2023-08-31
      java Java接口 抽象类与多态
    • 【JAVA】抽象类与接口
      作者主页:paper jie_的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将ja...
      99+
      2023-09-08
      java 开发语言
    • Java中的抽象类和接口怎么理解
      这篇文章主要介绍“Java中的抽象类和接口怎么理解”,在日常操作中,相信很多人在Java中的抽象类和接口怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的抽象类和接口怎么理解”的疑惑有所帮助!...
      99+
      2023-06-30
    • Java抽象类和接口使用梳理
      目录抽象类抽象方法抽象类三大原则接口接口使用原则JDK两大内置接口java.lang.Comparable 比较接口java.lang.Cloneable 克隆接口对象的深浅拷贝抽象...
      99+
      2022-11-13
    • Java抽象类和接口如何使用
      本文小编为大家详细介绍“Java抽象类和接口如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java抽象类和接口如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是抽象类什么是抽象类呢?抽象类顾名...
      99+
      2023-06-30
    • Java抽象类与接口怎么掌握
      本文小编为大家详细介绍“Java抽象类与接口怎么掌握”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java抽象类与接口怎么掌握”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。abstractabstract介绍:...
      99+
      2023-06-30
    • Java中抽象类和接口介绍
      目录1、抽象类1.1 什么是抽象类?1.2 抽象类属于什么类型?1.3 抽象类怎么定义?1.4 抽象方法2、接口2.1 关于接口2.2 接口怎么定义?2.3 接口基础语法总结1、抽象...
      99+
      2022-11-12
    • Java抽象类和接口的比较
      这篇文章主要介绍“Java抽象类和接口的比较”,在日常操作中,相信很多人在Java抽象类和接口的比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java抽象类和接口的比较”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-17
    • 【JAVA】抽象类与接口--下
      ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 Ǵ...
      99+
      2023-09-03
      java 开发语言
    • JAVASE---抽象类和接口
      抽象类 抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类语法 在Java中,一个类如果被 abst...
      99+
      2023-09-21
      java 开发语言
    • Java抽象类与接口怎么定义使用
      这篇文章主要介绍“Java抽象类与接口怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java抽象类与接口怎么定义使用”文章能帮助大家解决问题。1.对象的比较两个对象要进行比较之前,我们首...
      99+
      2023-06-30
    • java接口和抽象类有什么区别
      Java接口和抽象类都是用来实现多态性的机制,但是它们有一些重要的区别:1. 实现方式:接口是通过实现关键字"implements"...
      99+
      2023-08-15
      java
    • 怎么引用Java抽象接口
      这篇文章主要讲解了“怎么引用Java抽象接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么引用Java抽象接口”吧!//抽象 abstract class conn{   St...
      99+
      2023-06-03
    • 深入浅析Java 抽象类和接口
      目录一、抽象类1.抽象类1.1抽象类的定义1.2抽象方法的定义方式1.3抽象类的定义方式2.抽象类和实例类的区别3.抽象类示例4.抽象类的特征二、接口1.接口1.1接口的定义1.1定...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作