4

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

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

如果是的话,有没有办法让子类自动从超类继承字段,因为据我所知,没有办法一次从两个类继承?

感谢任何花时间回答的人。我意识到我的问题可能不切实际,实际上您可能只是覆盖了该字段或其他内容,但我并没有尝试做任何具体的事情,只是想了解 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);
        }
4

3 回答 3

4

B除了 class之外extends的任何类A都将继承A's字段。如果一个类C extends B,将从andC继承所有非私有实例字段和方法,即传递性成立。 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;
}

这将不起作用,因为通过x再次声明 in B,您将隐藏该x字段A。因此,现在Cx其视为您无权访问的B's private变量。x

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

于 2013-07-17T16:40:08.803 回答
3

Java 中的继承是可传递的。

如果您的类是Superclass < Class < Subclass,那么 Subclass 将继承 Superclass 提供的所有非私有实例字段和方法,而不会被 Class 或 Subclass 覆盖或隐藏。

Java 语言规范第 8.4.8 节:继承、覆盖和隐藏指定了一级继承:

类 C 从其直接超类和直接超接口继承父类和超接口的所有抽象和非抽象方法,这些方法是公共的、受保护的或在与 C 相同的包中声明为具有默认访问权限,并且既不被覆盖(第 8.4.8.1 节) ) 也不会被类中的声明隐藏(第 8.4.8.2 节)。

于 2013-07-17T16:39:57.337 回答
0

如果您的课程是:

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
}

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

SubClass sc = new SubClass();
sc.methodName();
于 2013-07-17T16:46:08.280 回答