我有一个init方法,它在广泛的层次结构中被使用和覆盖。然而,每个init调用都扩展了前一个所做的工作。所以很自然地,我会:@Overridepublicvoidinit(){super.init();}这自然会确保调用和实例化所有内容。我想知道的是:我可以创建一种方法来确保调用super方法吗?如果所有的init都没有被调用,那么对象就会发生故障,所以我想在有人忘记调用super时抛出异常或错误。TYFT~Aedon 最佳答案 而不是尝试这样做——顺便说一句,我认为这是不可能实现的!--一种不同的方法怎么样:abstractcla
让我们看看下面的Java代码片段。packagetrickyjava;classA{publicA(Strings){System.out.println(s);}}finalclassBextendsA{publicB(){super(method());//Callingthefollowingmethodfirst.}privatestaticStringmethod(){return"methodinvoked";}}finalpublicclassMain{publicstaticvoidmain(String[]args){Bb=newB();}}按照约定,Java中的su
super是否比外部类有更高的优先级?考虑我们有三个类:A级B级ClassB中扩展ClassA的匿名类A类.java:publicclassClassA{protectedStringvar="AVar";publicvoidfoo(){System.out.println("Afoo()");}}类B.java:publicclassClassB{privateStringvar="BVar";publicvoidtest(){newClassA(){publicvoidtest(){foo();System.out.println(var);}}.test();}publicvoi
interfaceA{publicvoiddoSomething();}interfaceBextendsA{publicvoiddoSomethingElse();}publicclassAClassimplementsA,B{publicvoiddoSomething(){}publicvoiddoSomethingElse(){}}为什么Java允许这样的声明?当通过实现子接口(interface)(B)可以实现相同的目的时,实现这两个接口(interface)有什么用? 最佳答案 我认为“为什么”这个问题只能由Java设计人
所以java有类型删除,它删除类型参数(在运行时没有泛型类型)。有人可以解释为什么要保留父类(superclass)型类型参数吗?classStringListextendsArrayList{publicTypegetType(){Type[]typeArguments=((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments();returntypeArguments[0];}}这基本上意味着:newArrayList()//Icannotusereflectiontofin
考虑到这些类和累积函数,它们代表了我原始上下文的简化(但重现了相同的问题):abstractstaticclassFoo{abstractintgetK();}staticclassBarextendsFoo{intk;Bar(intk){this.k=k;}intgetK(){returnthis.k;}}privatestaticFoocombined(Fooa1,Fooa2){returnnewBar(a1.getK()+a2.getK());}我试图通过依赖一个单独的函数combined来执行项目的累积(最初是数据索引报告),它直接处理Foo类型的元素。Foooutcome=S
我长期以来在Java中使用一个习惯用法,用于在其(通常是抽象的)祖先类的方法中使用(非抽象)类的类信息(不幸的是我找不到这个名称模式):publicabstractclassAbstract>{privatefinalClasssubClass;protectedAbstract(ClasssubClass){this.subClass=subClass;}protectedTgetSomethingElseWithSameType(){....}}其子类的一个例子:publicclassNonGenericextendsAbstract{publicNonGeneric(){supe
我正在做一些练习以更好地理解Java中的内部类是如何工作的。我发现了一个非常有趣的练习。练习的条件是使printName()打印“sout”而不是“main”,并进行最小的更改。有它的代码:publicclassSolution{privateStringname;Solution(Stringname){this.name=name;}privateStringgetName(){returnname;}privatevoidsout(){newSolution("sout"){voidprintName(){System.out.println(getName());//theli
我在让SuperDev模式与IntelliJ一起工作时遇到了很多问题。这个问题和我在下面的回答是为了记录如何做到这一点,以供将来可能遇到此问题的其他人(以及我自己的引用): 最佳答案 1)将以下行放入模块的.gwt.xml代码中:2)在IntelliJ中做两份GWT运行配置,一份开启SuperDev模式,另一份关闭SuperDev模式。第一个配置(代码服务器):第二个配置(开发模式):3)运行代码服务器运行配置。它将给出如下输出:Thecodeserverisready.Next,visit:http://localhost:987
如何将java.util.Random中的Random调用到supertypeconstructor中?例如Randomrand=newRandom();intrandomValue=rand.nextInt(10)+5;publicSomething(){super(randomValue);//OtherThings}当我尝试这个时,编译器说我“无法在调用supertypeconstructor之前引用randomValue”。 最佳答案 super()调用必须是构造函数中的第一个调用,任何初始化实例变量的表达式只会在super