我有一个问题属于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?
}
}
它有什么意义吗?或者是默认情况下我们必须采取的行为?
答案 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
- 对同一个包中的所有代码和子类都可见,而不管包private
- 仅对同一类(包括嵌套类)中的代码可见例如,请参阅Java教程Controlling Access to Members of a Class或(有很多技术细节)section 6.6 of the Java Language Specification。
答案 2 :(得分:5)
答案 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一样)中访问该成员,并且此外,还可以在子类中访问其他包中的类。
因此,如果您的班级C
与A
和B
共享包,可访问。
答案 6 :(得分:0)
继承是传递性的:如果B类继承自A类; 和C类继承自B类;那么C也是一个 A类的子类/子类/后代。