【问题标题】:Why isn't this protected attribute working?为什么这个受保护的属性不起作用?
【发布时间】:2015-01-12 05:35:00
【问题描述】:

我在以下代码中使用了受保护的修饰符,但它没有像我预期的那样工作。

这是我的 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());
    }
}

【问题讨论】:

  • 可能重复:stackoverflow.com/questions/215497/… protected 允许在同一个包中访问。
  • 您正在尝试在 Coordinates2D 类之外设置对象值。因为 ob1.x 受到保护,它会给你一个错误。
  • 它们在同一个包中吗?如果是,那么这很好用。 protected 表示可以在包中查看。如果您只希望该类查看它,则应使用 private。
  • 正是我希望有一个编译错误,但它的工作原理。通常如果我在 MAIN 中使用 ob1.x=4 它应该也可以工作
  • 这两个类是否在同一个包中?

标签: java inheritance protected


【解决方案1】:

protected 关键字将变量或函数的可访问性范围限制在同一包内,或任何继承具有所述变量或函数的类的子类。这意味着只要两个类在同一个包中,它们就可以使用protected 关键字访问彼此的属性和方法。在这种情况下,它们不仅在同一个包中,而且在同一个类文件中。如果您想将x,y 的访问权限限制在Coordinates2D 类中,请改用关键字private

【讨论】:

  • 只是为了让它超级清楚:如果它们在同一个 .java 文件中定义,那么您的两个类都在同一个包中 - 因此受保护的作品在您的场景中按预期工作。
【解决方案2】:

您没有收到错误的原因是您没有做错任何事情。但是,您认为自己做错了什么,所以让我解释一下:

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

由于您的 prob3 类和 Coordinates2D 类在同一个包中,因此可以在两者中访问受保护的变量。如果你想限制 x 和 y 变量的可用性,你应该将它们的访问修饰符设置为 private:

private int x, y;

试一试,其余代码保持不变。你会得到你期望的编译器错误。

【讨论】:

  • 谢谢。我理解这个想法。最后我理解了 PROTECTED 的概念。
  • @TautAdrian 很高兴知道。这绝对是一个棘手的问题,而且你并不孤单。
【解决方案3】:

protected 成员可见

  • 类本身
  • 该类的任何子类,以及
  • 同一包中的任何类。

由于这些类在同一个文件中,它们在同一个包中,因此它们可以访问。

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2021-03-11
    • 2011-08-04
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2018-07-10
    • 2017-11-11
    相关资源
    最近更新 更多