假设我有以下结构:abstractclassA{abstractbooleanfoo();}interfaceB{defaultbooleanfoo(){returndoBlah();}}classCextendsAimplementsB{//functionfoo}Java现在会提示类C必须从A实现抽象方法foo。通过在C中重新定义函数并简单地调用B.super.foo();,我可以相对轻松地解决这个问题。但是我不明白为什么接口(interface)B中的默认函数本身不能满足这个要求,我想更好地了解java的底层机制。 最佳答案
classOne{publicvoiddoThing(Oneo){System.out.println("One");}}classTwoextendsOne{publicvoiddoThing(Twot){System.out.println("Two");}}publicclassUgly{publicstaticvoidmain(String[]args){Twot=newTwo();Oneo=t;o.doThing(newTwo());}}结果:一classOne{publicvoiddoThing(Oneo){System.out.println("One");}}class
我知道这个问题已经被问了很多,但我认为通常的答案远不能令人满意。给定以下类层次结构:classSuperClass{}classSubClassextendsSuperClass{}为什么人们使用这种模式来实例化子类:SuperClassinstance=newSubClass();而不是这个:SubClassinstance=newSubClass();现在,我看到的通常答案是,这是为了将instance作为参数发送给需要SuperClass实例的方法,如下所示:voidaFunction(SuperClassparam){}//somewhereelseinthecode.....
当我运行以下代码时出现未报告的异常我的代码如下图classSuper{publicSuper()throwsException{System.out.println("SuperClass");}}publicclassSubextendsSuper{publicstaticvoidmain(String[]args)throwsException{Subs=newSub();}}出现以下错误:Sub.java:6:默认构造函数中未报告的异常java.lang.Exception公共(public)类Sub扩展Super{1个错误 最佳答案
publicclassWrapperClasses{voidoverloadedMethod(NumberN){System.out.println("NumberClassType");}voidoverloadedMethod(DoubleD){System.out.println("DoubleWrapperClassType");}voidoverloadedMethod(LongL){System.out.println("LongWrapperClassType");}publicstaticvoidmain(String[]args){inti=21;WrapperCla
假设我有一个如下的类层次结构:classVehicle;classCarextendsVehicle;classPlaneextendsVehicle;我有一个比较两个对象的函数publicgenerateDiff(Toriginal,Tcopy)上述方法在编译时保证两个对象都是Vehicle,但不能保证两个对象的类型相同。generateDiff(newCar(),newCar());//OKgenerateDiff(newPlane(),newPlane());//OKgenerateDiff(newCar(),newPlane());//WRONG我可以在编译时使用泛型实现吗?P
我需要这个,因为父类(superclass)中的构造函数正在调用一个在子类中被覆盖的方法。该方法返回一个值,该值传递给子类的构造函数。但是父类(superclass)构造函数必须在子类构造函数之前调用,所以我没有机会保存传入的值。 最佳答案 从父类(superclass)构造函数调用重写的方法根本行不通-不要这样做父类(superclass)构造函数必须始终在子类构造函数之前完成。当父类(superclass)构造函数正在执行时,所讨论的对象是父类(superclass)的(半初始化)实例,而不是子类!因此,如果您尝试从构造函数调用
我有一个父类A和一个子类B,B重写了A的方法f。publicclassA{publicStringf(){return"A";}}publicclassBextendsA{...publicStringf(){return"B";}publicstaticvoidmain(String[]args){Bb=newB();Aa=(A)b;System.out.println(b.f());//prints:B}}我创建了一个B类型的对象b,并将其转换为A类型并将其分配给A类型的变量a,然后调用a上的方法f。现在我希望调用父类的方法,因为我正在使用类型A的对象,但它没有,它调用方法的b版本
我正在制作TreeMap并希望以降序排列。我创建了以下比较器:Comparatordescender=newComparator(){@Overridepublicintcompare(Stringo1,Stringo2){returno2.compareTo(o1);}};我像这样构建TreeMap:myMap=newTreeMap(descender);但是,我收到以下错误:Themethodcompare(String,String)oftypenewComparator(){}mustoverrideasuperclassmethod我从来没有完全理解泛型,我做错了什么?
作为一个(迂腐的)初学者Java程序员,我想知道,将所有子类使用的公共(public)代码块移动到单独的protected(final)父类中的方法?诸如用通用值填充列表或通用过滤算法等任务...是否也可以使用protected静态方法?classA{protectedfinalListgetVariants(){...}protectedfinalListfilterResults(Listvariants){...}}classBextendsA{publicListdoSomethingUsefull(){ListcommonVariants=getVariants();...r