3

我有一个问题属于 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?
   }  
}

它有什么意义吗?还是我们必须默认采取的行为?

4

7 回答 7

5

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

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
}
于 2012-11-05T22:11:15.967 回答
5

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

  • public- 对所有代码可见
  • protected- 对同一包中的所有代码和子类可见,无论包如何
  • (默认)- 对同一包中的所有代码可见
  • private- 仅对同一类中的代码可见(包括嵌套类)

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

于 2012-11-05T22:12:01.537 回答
5

关键字的定义

受保护

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

我建议你阅读这个

于 2012-11-05T22:12:07.840 回答
4

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

看看这个词汇表,它深入展示了protected成员和方法是如何被继承的,以及关于继承的 Java 文档

于 2012-11-05T22:10:49.747 回答
3

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

于 2012-11-05T22:11:57.700 回答
3

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

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

因此,如果您的类与andC共享包,则它可以访问AB

于 2012-11-05T22:12:11.880 回答
0

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

于 2017-11-29T20:16:08.087 回答