【问题标题】:Field inheritance on JavaJava 上的字段继承
【发布时间】:2013-07-17 16:34:06
【问题描述】:

字段是否只继承“上一级”?

我的意思是,如果我有一个超类到一个类,然后它有一个子类,并且超类有一个字段,那么类将继承它而子类不会。它是否正确?

如果是这样,有没有办法让子类自动从超类继承字段,因为据我了解,没有办法同时从两个类继承?

感谢任何花时间回答的人。我意识到我的问题可能不切实际,实际上您可能只是覆盖了该字段或其他内容,但我并没有尝试做任何具体的事情,只是想了解 Java 的工作原理。谢谢。

这是我的代码:

public class SuperClass {
    protected int entero;

    protected void method(){
        entero=1;
    }




public class SubClass extends Class {

    public SubClass(){}

}


public class Class extends SuperClass {

    public Class(){}




}



    public static void main(String[] args){
    Class object= new Class();
    SubClass subobject= new SubClass();
/*This is where I get an error, why?*/ 
        subobject.entero=2;
/*This one is fine*/
        object.entero=2;
        object.method();
        System.out.println(object.entero);
        }

【问题讨论】:

  • 我假设您在谈论受保护的字段,是吗?
  • 你能澄清一下这行的意思吗:“我有一个超类到一个类,然后有一个子类,超类有一个字段,类将继承它,子类将不会”吨。”这有点模棱两可。
  • @SteveP。 class SuperClass { protected int x; } class Class extends SuperClass {} class SubClass extends Class { } 澄清了吗?
  • 您不能覆盖字段。请告诉我们您要解决的问题,最好是使用代码。
  • 您的子类不扩展类或超类。这就是它没有任何 entero 字段的原因。

标签: java inheritance field


【解决方案1】:

任何类BextendsA 都将继承A's 字段。如果类C extends BC 将从AB 继承所有非私有实例字段和方法,即传递性成立。

如果一个字段是private,那么不能直接从子类中改变它;但是,您可以通过使用 setter/getter 方法来解决这个问题。

如果一个字段是protected,那么子类可以直接访问它。

编辑 1:

在评论中您说该字段是protected,但您仍然无法从子类访问它。我唯一能想到的就是你有这样的情况:

class A
{
   protected int x; 
}

class B extends A
{
   private int x; 
}

class C extends B
{
   private int z = x;
}

这将起作用,因为通过在B 中再次声明x,您将隐藏x 字段对A。所以,现在Cx 视为B's private 变量x,您无权访问。

编辑 2: 我不会删除上面的编辑,因为它提供了丰富的信息,但现在你发布了你的代码,这是因为你的 SubClass 实际上并没有 extend 任何东西(这后来在编辑中得到修复)。

【讨论】:

  • 谢谢。我已将我的代码添加到问题中。我不认为我正在这样做,但我无法从子类访问该字段。
  • 看我们的两段代码。我为BC 提供extend。你的“子类”没有extend 任何东西。
  • 好的,谢谢。我快速输入以说明我的问题,但没有注意到。非常感谢您的回答。
【解决方案2】:

Java 中的继承是可传递的。

如果你的类是超类,那么子类会继承超类提供的所有非私有实例字段和方法,而不会被类或子类覆盖或隐藏。

Java 语言规范section 8.4.8: Inheritance, Overriding and Hiding 指定了一级继承:

一个类 C 继承自它的直接超类和直接超接口都是抽象的 以及公共的超类和超接口的非抽象方法, 受保护,或在与 C 相同的包中声明为具有默认访问权限,并且两者都不是 被类中的声明覆盖(§8.4.8.1)或隐藏(§8.4.8.2)。

【讨论】:

    【解决方案3】:

    如果您的课程是:

    public class SuperClass {
        public void methodName() {}
        //SuperClass's stuff
    }
    
    public class MidClass extends SuperClass {
        //MidClass's stuff
    }
    
    public class SubClass extends MidClass {
        //SubClass's Stuff
    }
    

    那么在你的 main 方法中是完全有效的:

    SubClass sc = new SubClass();
    sc.methodName();
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2012-02-06
      • 2012-08-28
      • 2013-01-09
      • 1970-01-01
      • 2019-03-31
      • 2015-05-02
      相关资源
      最近更新 更多