美文网首页
Java 子类实现父类已经实现的接口

Java 子类实现父类已经实现的接口

作者: xiaofudeng | 来源:发表于2017-11-05 22:51 被阅读0次

结论

假设有

  1. class A implements Interface
  2. class B extends A
  3. class C extends A implements Interface.

那么:

  • B和C都可以向上转型为Interface
  • B和C在不覆盖接口定义的方法时都会用父类的实现
  • 在反射方法getInterfaces()中, A和C类都会有Interface, 但是B不会有Interface

验证

Viewable接口:

package interfaces;

/**
 * Created by xiaofu on 17-11-5.
 */
public interface Viewable {
    void view();
}

BasePhoto类:

package interfaces;

/**
 * Created by xiaofu on 17-11-5.
 */
public class BasePhoto implements Viewable {

    @Override
    public void view() {
        System.out.println("viewing base photo");
    }
}

Selfie类:

package interfaces;

/**
 * Created by xiaofu on 17-11-5.
 */
public class Selfie extends BasePhoto {

    // 可以直接覆盖父类实现的接口方法, 而不用再在class声明中再写implement Viewable了
    @Override
    public void view() {
//        super.view();
        System.out.println("viewing my selfie");
    }
}

Landscape类:

package interfaces;

/**
 * Created by xiaofu on 17-11-5.
 * 父类已经实现了Viewable接口
 */
public class LandscapePhoto extends BasePhoto implements Viewable {

    @Override
    public void view() {
        System.out.println("viewing landscape photo");
    }
}

Main类:

package interfaces;

/**
 * Created by xiaofu on 17-11-5.
 */
public class Main {

    public static void testImplementation(){
        Viewable basePhoto = new BasePhoto();
        Viewable selfie = new Selfie();
        Viewable landscape = new LandscapePhoto();
        basePhoto.view();
        selfie.view();
        landscape.view();
        // 输出
        // viewing base photo
        // viewing my selfie
        // viewing landscape photo
    }

    public static void testRelection(){
        BasePhoto basePhoto = new BasePhoto();
        BasePhoto selfie = new Selfie();
        BasePhoto landscape = new LandscapePhoto();
        System.out.println("basePhoto has Viewable interface: " + hasInterface(basePhoto));
        System.out.println("selfie has Viewable interface: " + hasInterface(selfie));
        System.out.println("landscape has Viewable interface: " + hasInterface(landscape));
        // 输出
        // basePhoto has Viewable interface: true
        // selfie has Viewable interface: false
        // landscape has Viewable interface: true
    }

    private static boolean hasInterface(BasePhoto photo){
        Class<?>[] interfaces = photo.getClass().getInterfaces();
        for(Class<?> c: interfaces)
            if (c.equals(Viewable.class))
                return true;
        return false;
    }

    public static void main(String[] args) {
        testImplementation();
        testRelection();
    }

}

如果实现的接口有类型参数

该类情况, 子类要么不声明implements直接Override父类中该接口的方法, 要么声明的时候只能用和父类一样的类型参数.
原因如下(原链接):

A class may not at the same time be a subtype of two interface types which are different parameterizations of the same generic interface (§9.1.2), or a subtype of a parameterization of a generic interface and a raw type naming that same generic interface, or a compile-time error occurs.
This requirement was introduced in order to support translation by type erasure (§4.6).

相关文章

  • Java 子类实现父类已经实现的接口

    结论 假设有 class A implements Interface class B extends A cla...

  • 枚举

    如果父类实现了 serializable 接口,子类不用再实现序列化接口,子类及父类成员变量即可序列化 如果父类没...

  • scala 调用java通过父类调用子类方法实现

    scala 调用java通过父类调用子类方法实现 java 父类 A 抽象类: java 子类 B 继承A类,并...

  • 接口

    一个类实现多个接口,用,分开. 父类 对象名 = new 子类(); 接口 名字 = new接口的实现类 接口与抽...

  • UML六大关系

    继承 子类继承父类或者子接口继承父接口,在UML图中用实线空心箭头表示。 实现 类实现接口的功能,在UML图中用虚...

  • 4-2 抽象基类

    相当于Java的接口,Java的类实现特性时,是要实现接口Python鸭子类型:Python去实现一个类的特性时,...

  • Java接口概念

    Java中继承关系是单继承,如果拥有多个父类的时候,可以使用接口进行实现。接口代表一种能力,子类进行实现意味着具备...

  • 第十三章接口

    Java中继承为单继承,只有一个父类 接口 特性 接口不能被实例化 实现类必须实现接口的所有方法 实现类可以实现多...

  • 接口与继承复习

    接口和继承 类继承--->子类完全继承父类特点 抽象类继承--->继承时抽象的部分不同的子类可以有不同的实现 接口...

  • 《设计模式之美》(一:杂谈)

    抽象类与接口区别 语法上:抽象类:有属性,可以有方法具体实现,子类必须实现父类的抽象方法 ;接口:接口只有方法定义...

网友评论

      本文标题:Java 子类实现父类已经实现的接口

      本文链接:https://www.haomeiwen.com/subject/nvtkmxtx.html