草庐IT

java - 为什么父类(super class)的实例可以放入子类的数组中?

假设我们有2个类:classX{}classYextendsX{}在main函数中创建一个数组:Y[]yArr=newY[3]//createdY'sclassobjectsarrayX[]xArr=yArr;xArr[0]=newX()//VALID.WHY?怎么可能??因为xArr指的是Y[]对象,据我所知,它不能创建X对象。 最佳答案 Java编译器允许这样做,因为在Java中数组是协变的。也就是说,可以说:Superclass[]arr=newSubclass[3];这允许诸如您的xArr[0]=newX();之类的代码进行

java - 在它的抽象父类(super class)中使用子类的泛型类型?

在我的代码中有以下抽象父类(superclass)publicabstractclassAbstractClass{...}还有一些子类比如publicclassChildClassAextendsAbstractClass{...}publicclassChildClassBextendsAbstractClass{...}我正在寻找一种优雅的方式来以通用方式在抽象类中使用子类的通用类型(GenericTypeA、GenericTypeB等)。为了解决这个问题我目前定义了方法protectedabstractClassgetGenericTypeClass();在我的抽象类中并实现了

java - 如果我从类文件中删除 super 构造函数调用会怎样?

当构造函数没有显式调用父类(superclass)构造函数(或this())时,编译器会插入super()。如果从类文件中删除此调用(编译后)会发生什么情况? 最佳答案 我自己试过了。classTest{publicTest(){System.out.println("HelloWorld");}publicstaticvoidmain(String[]args){newTest()}}我编译并删除了invokespecialjava/lang/Object/()V使用类文件编辑器从构造函数中获取。JVM似乎拒绝加载该类:Excep

java - java 中的 this 和 super

this和super是关键字,不是吗?那么我如何使用它们以与方法相同的方式将参数传递给构造函数?简而言之,两者如何表现出如此不同的行为?? 最佳答案 this和super都是关键字是正确的。Javalanguagespecification明确定义他们必须如何表现。简短的回答是这些关键字的行为特殊,因为规范规定它们必须这样做。根据规范this可以使用primaryexpression(仅在某些地方)或在explicitconstructorinvocation.Thekeywordthismaybeusedonlyinthebody

java - 构造函数是如何执行的?

我正在对讲座幻灯片进行一些修改,它说构造函数按以下方式执行:如果构造函数以此开头,则递归执行指示的构造函数,然后转到第4步。调用显式或隐式指示的父类(superclass)构造函数(除非此类是java.lang.Object)。按照在此类中声明的顺序初始化对象的字段。执行此构造函数主体的其余部分。我不明白的是,构造函数永远不能以此“开始”,因为即使它不形成类层次结构/关系,也会默认插入super()。这如何符合上面的描述? 最佳答案 构造函数(对于除java.lang.Object之外的每个类)必须以“super()”开头以调用其父

Java:当 super 构造函数需要参数时如何初始化 child

我有classA{intvar;publicA(intx){var=x;}}classBextendsA{intvar2;publicB(intx,inty){super(...);var2=y;x=f(y);}}对于子类B,我需要计算在A的构造函数中使用的值x。如果我可以自由地将super移动到我的x=f(y)然后我可以将结果传递给A(super)的构造函数。但是super必须是B的构造函数中的第一行。有什么方法可以在第一次用正确的值初始化A吗?如果A.var是最终的并且我无法在构造后返回并更改它怎么办?当然,我可以放置super(f(y)),但我可以想象这会变得困难的情况。

java - 包含同一父类(super class)的不同对象的 ArrayList - 如何访问子类的方法

您好,我想知道是否有解决我的问题的简单方法,我有一个ArrayList:ArrayListanimalList=newArrayList();/*IaddsomeobjectsfromsubclassesofAnimal*/animalList.add(newReptile());animalList.add(newBird());animalList.add(newAmphibian());它们都实现了一个方法move()-当调用move()时Bird会飞。我知道我可以使用这个访问父类(superclass)的通用方法和属性publicvoidfeed(IntegeranimalIn

java - Java 中的通配符 Generic 和 <? super T> 意思,下界或上界

所以我在阅读泛型方法时感到很困惑。先说一下这里的问题:在这个例子中:假设我需要一个适用于任何类型T的selectionSort版本,方法是使用调用者提供的外部可比较对象。第一次尝试:publicstaticvoidselectionSort(T[]arr,ComparatormyComparator){....}假设我有:定义车辆类别创建了实现Comparator的VehicleComparator,同时按价格比较车辆。创建卡车扩展车辆实例化卡车[]arr;车辆比较器myComparator现在,我做:selectionSort(arr,myComparator);它不会工作,因为my

java - 如何使 toString() 方法返回父类(super class)私有(private)字段及其实例字段?

有没有办法让toString()包含超class的私有(private)字段?我尝试添加super.toString(),但是没用。请看下面的代码员工.javapackagetest;publicclassEmployee{privateStringname;privateintid;privatedoublesalary;publicEmployee(Stringname,intid,doublesalary){super();this.name=name;this.id=id;this.salary=salary;}publicdoublegetSalary(){returnsal

java - 对此 Java 示例中的 "super"关键字感到困惑

Java网站教程中的这个例子page.两个接口(interface)定义了相同的默认方法startEngine()。类FlyingCar实现了这两个接口(interface),并且由于明显的冲突必须重写startEngine()。publicinterfaceOperateCar{//...defaultpublicintstartEngine(EncryptedKeykey){//Implementation}}publicinterfaceFlyCar{//...defaultpublicintstartEngine(EncryptedKeykey){//Implementatio