首页 > 基础资料 博客日记

Javase--接口(2)

2024-04-01 20:00:07基础资料围观205

文章Javase--接口(2)分享给大家,欢迎收藏Java资料网,专注分享技术知识

继上文接口的使用,本文我们小编将带大家继续叙述接口。

2.4 接口的特征

1.接口是一种引用类型,但是不能直接new接口的一个对象

2. 接口中每一个方法都是public的抽象方法,== 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)==。

3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

  1. 重写接口中方法时,不能使用默认的访问权限(重写时的权限必须比原本的高)。
  2. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
  3. 接口中不能有静态代码块和构造方法,接口中只包含有抽象方法和常量
  4. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
  5. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
  6. jdk8中:接口中还可以包含default方法。

2.5 实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。下面通过类来表示一组动物.
在这里插入代码片

package Demo2;

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

另外我们再提供一组接口, 分别表示 “会飞的”, “会跑的”, “会游泳的”.

public interface Running {
    void run();
}
public interface Flying {
    void fly();
}
public interface Swimming {
    void swim();
}
public interface Leaping {
    void leap();
}

接下来我们创建几个具体的动物
鸭子,会飞的,会跑的,会游泳的

public class Duck extends Animal implements Running,Flying,Swimming{
    public Duck(String name) {
        super(name);
    }
    @Override
    public void fly() {
        System.out.println("鸭子正在飞!!!");
    }
    @Override
    public void run() {
        System.out.println("鸭子正在跑!!!");

    }
    @Override
    public void swim() {
        System.out.println("鸭子正在游泳!!!");
    }
    public static void main(String[] args) {
        Duck duck=new Duck("小黄鸭");
        duck.fly();
        duck.run();
        duck.swim();
    }
}

青蛙,是会跳的会游泳的

public class Drag extends Animal implements Leaping,Swimming{
    public Drag(String name) {
        super(name);
    }

    @Override
    public void leap() {
        System.out.println("青蛙正在跳!!!");
    }

    @Override
    public void swim() {
        System.out.println("青蛙正在游泳!!");
    }

    public static void main(String[] args) {
        Drag drag=new Drag("小青蛙");
        drag.leap();
        drag.swim();

    }
}

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类,同时实现多种接口。继承表达的含义是 is - a 语义,而接口表达的含义是 具有 xxx 特性 。

青蛙是一种动物,既能跑,也能游泳。
鸭子也是一种动物,既能跑,也能游, 还能飞。

2.6 接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。
接口可以继承多个接口, 达到复用的效果. 使用 extends 关键字:
创建两个接口

public interface Running {
    public void run();
}
public interface Swimming {
   void swim();
}

接口的多继承

public interface IAmphibious extends Running,Swimming{
//接口和接口直接实现多继承使用extends,类与类之间只有单继承   
}
public class Frog implements IAmphibious{//实现接口
    public Frog(String name) {
        this.name = name;
    }

    public String name;

    @Override
    public void run() {//实现了两个接口,两个接口中的抽象方法均应该重写
        System.out.println(this.name+"正在跑步");
    }

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

    public static void main(String[] args) {
        Frog frog=new Frog("小青蛙");
    }
}

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

接口间的继承相当于把多个接口合并在一起。

2.7 Clonable 接口和深拷贝

Java 中内置了一些很有用的接口, Clonable 就是其中之一。
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”。 但是要想合法调用 clone 方法,必须要先实现 Clonable接口, 否则就会抛出 CloneNotSupportedException 异常。

由上图可以看出实现了Cloneable接口还是会报错,那么这是为什么呢?
原因很简单有以下两点:1. Object类中的clone方法的返回类型是Object,而object时Student的父类,所以说此时需要进行强制类型转化。(Object是任意类的父类)。
2.下图注解了,知识点后期会讲到。

浅拷贝 VS 深拷贝
Cloneable 拷贝出的对象是一份 “浅拷贝”
观察以下代码:
浅克隆及输出结果


深克隆及输出结果



上图中99.99是因为,将上面的代码又执行了一遍,但是此时已经是深克隆的环境了。
由上面的对比可以得出,浅克隆克隆的是表面,深克隆会将m的值也改变,与浅克隆相比深克隆更加优良。

2.9 抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式。都需要重点掌握。同时又要认清两者的区别。
核心区别: 抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写),而接口中不能包含普通方法, 子类必须重写所有的抽象方法。
以下有张图方便友友们更加清楚的分析:

以上就是小编为大家带来的全部的内容,希望大家能有多多的收获!!


文章来源:https://blog.csdn.net/2302_79968236/article/details/136947885
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云