Java多级继承 - 1级类中受保护的实例变量

时间:2012-11-05 22:07:51

标签: java class inheritance

我有一个问题属于Java中的多级继承。所有三个类都在同一个包中

我有A班:

public class A {
   protected int x;
}

public class B extends A {
   public void doSomething {
      // x is visible.agreed, as it is a direct subclass of A
   }  
}


public class C extends B {
   public void doSomething {
      // x is still visible, how come? I mean it is at the 2nd level 
     //  I am confused why?
   }  
}

它有什么意义吗?或者是默认情况下我们必须采取的行为?

7 个答案:

答案 0 :(得分:5)

标有protected修饰符的变量/方法对同一个pacakage中的所有类都是可见的,并且只对不同包中的子类可见。 以下是示例案例。

package a;
class A{
protected int x;
}
class B extends A{
//x can be accessed from this class
} 

class C extends B {
//x can be accessed from this class
}
class D{
//x can be accesed this class but you will have to create A's instance 
}

package B 
class One {
//cannot access x from this class
}
class Two extends A {
//can access x from this class
}

答案 1 :(得分:5)

Java中的访问级别修饰符是:

  • public - 所有代码均可见
  • protected - 对同一个包中的所有代码和子类都可见,而不管包
  • nothing (默认) - 对同一包中的所有代码都可见
  • private - 仅对同一类(包括嵌套类)中的代码可见

例如,请参阅Java教程Controlling Access to Members of a Class或(有很多技术细节)section 6.6 of the Java Language Specification

答案 2 :(得分:5)

关键字的定义

<强>受保护的

  

protected修饰符指定只能访问该成员   在它自己的包中(与package-private一样),另外,通过   另一个包中其类的子类。

我建议你阅读this

答案 3 :(得分:4)

Java protected关键字一直用于所有子类(和members of the package)。 如果 protected中有Object成员,则任何对象都可以访问它。相比之下,private仅对本地类(和内部类)可见,并且所有人都可以访问public

查看this glossary,其中详细介绍了protected成员和方法的继承方式以及Java documentation on inheritance

答案 4 :(得分:3)

您不能限制对子类中成员的访问。此规则适用于方法(您无法覆盖public方法并将其设为private),但您可以在此处看到类比。如果该字段为protected,则无论多深,它都会在每个子类中protected。当然,你不能覆盖Java中的字段,只是为了给你一个概述。

答案 5 :(得分:3)

请参阅:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

  

受保护的修饰符指定只能在自己的包(与package-private一样)中访问该成员,并且此外,还可以在子类中访问其他包中的类

因此,如果您的班级CAB共享包,可访问

答案 6 :(得分:0)

继承是传递性的:如果B类继承自A类; 和C类继承自B类;那么C也是一个 A类的子类/子类/后代。