草庐IT

Inheritance

全部标签

java - 在 Java 中扩展静态类是什么意思?

在网上查看一些java示例代码时,我遇到了以下语法:publicclassWordCount{publicstaticclassMapextendsMapper{privatefinalstaticIntWritableone=newIntWritable(1);privateTextword=newText();publicvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{//...}}//...}来自C#背景,其中静态类不能从另一个类继承,我对Map类之后的

java - 向继承方法添加注释的最佳方法

我有许多抽象父类(superclass),我的具体类从中继承了各种方法。其中一些方法需要在具体类中放置JPA或JAXB注释。目前我通过以下方式做到这一点:@MyLocalAnnotations@OverridepublicmethodinheritedMethodHere(yaddayadda){super.inheritedMethodHere(yaddayadda);}有没有办法在不覆盖方法的情况下做到这一点?重写一个方法只是为了提供本地注释似乎是一种浪费。 最佳答案 不幸的是,没有比您现在正在做的更好的方法了。考虑到您的JPA

java - 为什么方法可以被覆盖而属性不能?

我有课publicclassA{publicStringattr="Aattribute";publicvoidmethod(){System.out.println(this+","+this.attr);}publicStringtoString(){return("ObjectA");}}和另一个继承自它的类publicclassBextendsA{publicStringattr="Battribute";publicvoidmethod(){super.method();}publicStringtoString(){return("ObjectB");}}请注意,B的met

java - ClassCastException 与 "cannot cast"编译错误

正在为我的OCAJavaSE7程序员I考试学习,新手问题。我有一个我不明白的示例问题。以下代码可以编译,但会在运行时抛出ClassCastException:interfaceRoamable{}classPhone{}publicclassTabletextendsPhoneimplementsRoamable{publicstaticvoidmain(String...args){Roamablevar=(Roamable)newPhone();}}当我将Roamablevar=(Roamable)newPhone();更改为Roamablevar=(Roamable)newStr

java - "inherited"是解释父类(super class)的静态方法可以被子类访问的正确术语吗?

澄清:这个问题不是关于访问修饰符的已确认B.m()和b.m()语句都适用于以下代码:classA{staticvoidm(){//somecode}}classBextendsA{}classExample{publicstaticvoidmain(String[]args){B.m();//runningA'sm()staticmethod}publicvoidtry(){Bb=newB();b.m();//runningA'sm()staticmethod}}我的问题是我们可以说“静态方法是继承的”吗?如果“继承”是正确的术语,如果我们向B类添加一个方法,我们将使用静态类的相同签名

Java:当 B 扩展 A 时,A x = new A() 和 A x = new B() 之间的区别

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:javainheritance-pleaseexplain我正在学习Java,我有两个问题:有什么区别:Ax=newA();和Ax=newB();考虑到:classAclassBextendsA有什么区别:Ax=newB();(A)x.run_function();假设A和B都有函数run_function,将执行哪一个?

java - 在不扩展任何内容的类中调用 super() 是不好的做法吗?

我经常看到人们在没有显式扩展任何内容的类中显式调用super()。publicclassFoo{publicFoo(){super();//dootherconstructorstuff}}现在我知道这是完全合法的,如果省略,编译器会添加调用,但我仍然认为这是不好的做法。每当我看到这个时,我想知道程序员是否对继承有一些误解以及所有类都隐式扩展Object这一事实。我是否应该将此添加到我们的编码标准/最佳实践中?当我看到团队中的其他开发人员这样做时,我是否应该召集他们这样做?这是我的个人问题,但我不知道我是否只是挑剔。 最佳答案 虽然

Java:继承构造函数

我想要一个构造函数,其参数可以自动被所有子类继承,但Java不允许我这样做classA{publicA(intx){//Sharedcodehere}}classBextendsA{//Implicit(intx)constructorfromA}classCextendsA{//Implicit(intx)constructorfromA}我不想为每个子类编写B(intx)、C(intx)等。有没有更聪明的方法来解决这个问题?解决方案#1。创建一个可以在构造函数之后调用的init()方法。这是可行的,尽管对于我的特定设计,我想要求用户在编译时验证的构造函数中指定某些参数(例如,不通过

java - 为什么在覆盖时不允许缩小方法的范围

在Java中,当我重写一个方法时,编译器会将任何试图缩小可见性的尝试标记为错误。例如:我无法将公共(public)方法重写为protected方法,但我可以将protected方法重写为公共(public)方法。我有兴趣了解这条规则背后的设计决策/想法。 最佳答案 子类应该始终满足父类(superclass)的契约。参见LiskovSubstitutionprinciple.方法的可见性是这个契约的一部分。因此,在父类(superclass)中公开可见的任何内容在子类中也应该公开。 关于

java - 是否可以隐藏或降低对 Java 中继承方法的访问?

我有一个类结构,我希望基类中的一些方法可以从直接从基类派生的类访问,而不是从派生类派生的类。根据Java语言规范,可以覆盖继承方法的访问规范,使它们更公开,但不能更私密。例如,这是我需要做的事情的要点,但是是非法的://DefinesmyMethodpublicclassBase{protectedvoidmyMethod(){}}//UsesmyMethodandthenhidesit.publicclassDerivedOneextendsBase{@OverrideprivatevoidmyMethod();}//can'taccessmyMethod.publicclassDe