关于Java中接口继承接口

来源:互联网 发布:多普达p660同步软件 编辑:程序博客网 时间:2024/04/27 04:40

最近有些清闲,顺便回回炉,巩固一下Java基础,到翻到Collections 工具类 里有一个 Collecton.sort(List<T> list)方法,Ctrl 点了进去发现竟然实现了方法体,代码:

先来一段代码:

public interface List<E> extends Collection<E> {

......

  @SuppressWarnings({"unchecked", "rawtypes"})
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

.....

}

头一回看到这样写,于是又自己定义了一个接口并继承了Runnable并测试一下:

定义的接口:

package com.club;


public interface TestInterface extends Runnable {
@Override
default void run() {
// TODO Auto-generated method stub
System.out.println("hello");
}
}

实现类:

package com.club;


public class ImplTestInterface implements TestInterface {
@Override
public void run() {
// TODO Auto-generated method stub
TestInterface.super.run();
}


}

测试:

package com.club;


public class MainTest {
public static void main(String[] args) throws Exception {
ImplTestInterface test  = new ImplTestInterface();
Thread t = new Thread(test);
t.start();
}
}

打印结果:

hello


于是本菜查阅了各种资料:但是没查着,于是从Java 接口的特性这一特性去试着理解一下,

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

但还是解决不了的困惑...

如果按照某个类多实现的角度去想呢?接口也是类呀.

定义一个超级接口:

package com.club;


public interface SuperInterface {

void doSomething();
}

第一个接口:

package com.club;


public interface FirstInterface extends SuperInterface{
@Override
default void doSomething() {
// TODO Auto-generated method stub
System.out.println("doSomething overrid in FirstInterface");
}
}

第二个接口:

package com.club;


public interface SecondInterface  extends SuperInterface{
@Override
default void doSomething() {
// TODO Auto-generated method stub
System.out.println("doSomething overrid in SecondInterface");
}
}

实现类:


package com.club;


public class Test implements FirstInterface,SecondInterface {


@Override
public void doSomething() {
// TODO Auto-generated method stub
FirstInterface.super.doSomething();
}

public static void main(String[] args) {
Test t = new Test();
t.doSomething();
}
}

打印:

doSomething overrid in FirstInterface


在实现类中无论实现了多少个SuperInterface的子接口,却只能调用某一个子接口的实现方法.,从Java 语义上理解也说的通,避免C++多继承带来的麻烦

所以呢...目前先留个眼,等以后再来补充吧..或者等某个大牛来指点一下迷津,小弟不胜感激


也许从设计模式的角度上更好(但我没看完)





原创粉丝点击