按照惯例,Java中的受保护的类成员只能在声明它的类中或从它的直接后代继承类中访问。但是,以下示例中的 protected 类成员可以从其他类访问,而不使用Java中的任何继承概念。
package classmembers;
final class Demo
{
private int a=10;
protected int b=20;
public int c=30;
public Demo(int a, int b, int c)
{
this.a=a;
this.b=b;
this.c=c;
}
protected void show()
{
System.out.println("a = "+a);
}
}
final public class Main
{
public static void main(String[] args)
{
Demo d=new Demo(10, 20, 30);
//System.out.print("\n"+d.a); Wrong, since a has private access
d.show(); //Working, even if it is protected
System.out.print("\n"+d.b); //Working, even if it is protected
System.out.print("\n"+d.c); //Working, since it is public, obviously
}
}
在此示例中,类型为int的 protected 类成员 b 以及在类演示中声明的方法 show()正在通过main()方法访问,即使它们被明确声明为 protected 并且没有使用任何继承概念。
在这种情况下,Java中受保护的类成员和公共类成员之间的区别是什么。它们一样吗?
答案 0 :(得分:11)
这是因为也可以从同一个包中的类访问受保护的成员。 (Main
和Demo
都在classmembers
包中。)
在这种情况下,Java中受保护的类成员和公共类成员之间的区别是什么。它们是一样的吗?
如果类具有不同的包,则修饰符只会有所不同。
请查看官方教程中的表格:Controlling Access to Members of a Class
Modifier Class Package Subclass World
------------------------------------------------------
public Y Y Y Y <---.
|---- difference!
protected Y Y Y N <---'
---
no modifier Y Y N N
private Y N N N
答案 1 :(得分:8)
protected
修饰符可确保包 - 私有访问权限。有关详细信息,请参阅Controlling Access to Members of a Class。
答案 2 :(得分:4)
protected也可以在同一个包中通过类访问。这就是你的例子有效的原因。
尝试使用不同包中的main创建一个类,但您将无法访问。
此致