2014-11-14 71 views
0

我在下面的代码中使用受保护的修饰符,但它不像我所期望的那样工作。为什么这个受保护的属性不起作用?

这是我的Prob3.java文件,编译时我期望有错误ob1.x=4; 任何人都可以解释为什么我没有得到一个?

class Coordinates2D{ 
    protected int x,y; 
    public Coordinates2D(int x,int y){ 
     this.x=x; 
     this.y=y; 
    } 
    public int getX(){ 
     return this.x; 
    } 
    public int getY(){ 
     return this.y; 
    } 
    public void setX(int val){ 
     this.x=val; 
    } 
} 

public class Prob3{ 
    public static void main(String[] args){ 
     Coordinates2D ob1 = new Coordinates2D(3,4); 
     ob1.x=4; 
     System.out.println("Atributele ob 2D: "+ ob1.getX()+" , "+ob1.getY()); 
    } 
} 
+0

可能的重复:http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private'protected'允许在同一个包中访问。 – clcto 2014-11-14 18:35:31

+0

您正试图在类Coordinates2D之外设置对象值。因为ob1.x受保护,它会给你一个错误。 – 2014-11-14 18:35:31

+3

它们是否在同一个包中?如果他们是,那么这工作正常。受保护意味着它可以在包装内查看。如果你只希望它被那个班级看到,你应该使用私人的。 – AdamMc331 2014-11-14 18:35:40

回答

0

你没有得到错误的原因是因为你没有做错任何事情。但是,您认为您做错了,请让我解释一下:

关键字protected允许在同一个package的任何类中查看变量。

由于您的prob3类和Coordinates2D类位于同一个包中,因此可以同时访问受保护的变量。如果你想限制变量x和y的可用性,你应在其访问修饰符设置为私有:

private int x, y; 

尝试它,并留下您的代码相同的其余部分。你会得到你期望的编译器错误。

+0

谢谢。我理解这个主意。最后,我得到了PROTECTED概念的理解。 – 2014-11-14 18:53:00

+0

@TautAdrian很高兴知道。这绝对是一个棘手的问题,你并不孤单,你的困惑。 – AdamMc331 2014-11-14 18:54:56

1

protected关键字限制任一个变量或函数的可访问性的范围,以相同的封装内,或任何亚类继承与类所述可变或功能。这意味着只要两个类位于同一个包中,他们就可以使用关键字protected访问对方的属性和方法。在这种情况下,它们不仅在同一个包中,而且在同一个类文件中。如果要限制x,y的访问权限仅限于Coordinates2D级别,请改用关键字private

+1

只是为了让它更加清晰:如果你的类在同一个.java文件中定义,那么你的两个类都在同一个包中 - 因此,在你的场景中按照预期进行保护。 – JBA 2014-11-14 18:42:40

0

protected部件是可见的

  • 类本身
  • 类的任何亚类和
  • 在相同的包中的任何类。

由于这些类位于同一个文件中,因此它们位于同一个包中,因此它们将具有访问权限。