有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承在java中发生

我试图检查java接口在java&;我得到了一些结果

我很惊讶它在java中允许内部类。因此,我们可以很容易地产生钻石问题。即使java已经注意到了这一点

我所做的是

main接口。java

public interface MainInterface {


class MyTest{

        public MyTest(){
            System.out.print("AAAA");
        }
    }
}

测试。java(接口)

public interface Test extends MainInterface{
public void abc();

class MyTest{

    public MyTest(){
        System.out.print("AAAA");
    }
}
}

Test2。java(接口)

public interface Test2 extends MainInterface{

class MyTest {

    public MyTest() {
        System.out.print("BBBB");
    }
}
}

实现类

public class AllTest implements Test,Test2{

    public void abc() {

    }

}

主类

public class Main {

    public static void main(String[] args) {

        AllTest.MyTest test = new AllTest.MyTest();// at this line it conflict.
    }

}

我的问题是它的解决方案应该是什么? 2) 为什么java允许这样做?(众所周知,java由于菱形问题而停止了多次扩展。)


共 (2) 个答案

  1. # 1 楼答案

    接口中的内部类是隐式的static(就像方法是隐式的public,即使不使用public关键字)

    话虽如此,但并不存在冲突,您可以简单地将其实例化为:

    new InterfaceName.InnerClassName();
    
    // No error because InnerClassName is static
    // And no instance of the "InterfaceName" is required.
    

    或者,如果导入内部类:

    import com.somepackage.InterfaceName.InnerClassName;
    
    ...
    
    // Imported, you can simply:
    new InnerClassName();
    

    为什么可以同时实现TestTest2

    在实现TestTest2接口时,(隐式地)静态MyTest类仍然是TestTest2接口的内部类,而不是实现者AllTest类。只是如果没有名称冲突,也可以通过AllTest类引用它们

    类比:如果一个超类有一个公共静态字段,那么子类可以像引用自己的字段一样引用它,但它仍然属于该超类

  2. # 2 楼答案

    My Question is what should be its solution

    AllTest.MyTest test = new AllTest.MyTest();
    

    应该是

    Test.MyTest test = new Test.MyTest();
    

    或者

    Test2.MyTest test = new Test2.MyTest();
    

    why java allows to let it be?

    我真的不觉得有什么问题。如上所示,有一个简单的解决方法