我有一个问题,该问题在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?
}
}
它是否具有重要意义?还是我们默认必须采取的行为?
用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
}
Java中的访问级别修饰符是:
-
public
-可见所有代码 -
protected
-在同一软件包中可见的所有代码和子类都可以看到 - nothing (默认) - 同一软件包中的所有代码可见
-
private
-仅在同一类(包括嵌套类)的代码
中可见
参见,例如,Java教程控制对班级成员的访问或(有关大量技术细节)Java语言规范的第6.6节。
关键字的定义
受保护
受保护的修饰符指定只能访问成员 在自己的包裹中(与包装私有关系一样),此外, 另一个软件包中其类的子类。
我建议您阅读此。
java protected
关键字的工作原理降低到 all sublasses(以及软件包的成员)。如果在Object
中有protected
成员,则任何对象都可以访问它。相比之下,private
仅可见本地类(和内部类),并且public
可从所有人访问。
可以查看此词汇表,该词汇表显示了如何继承protected
成员和方法,以及有关继承的Java文档。
您不能限制子类中对成员的访问。此规则适用于方法(您不能覆盖public
方法并将其制成private
),但是您可以在此处看到类比。如果字段为protected
,则每个子类中的protected
,无论多么深。当然,您不能在Java中覆盖字段,而只是为了给您一个概述。
请参考以下信息:http://docs.oracle.com/javase/tutorial/java/java/javaoo/accesscontrol.html
受保护修饰符指定成员只能在中访问其自己的软件包(如软件包 - 私有化)和,另外,由子类别在另一个软件包中的类。
因此,如果您的类C
与A
和B
共享软件包,其可访问的。
继承是传递的:如果B类从a类继承;C类从B类继承;那么C也是一个A类的子类/儿童班/后代。