【问题标题】:Java access a protected attribute [closed]Java访问受保护的属性[关闭]
【发布时间】:2025-12-18 05:50:02
【问题描述】:

我是 Java 新手,需要一些帮助

我有一个具有 2 个受保护属性的抽象超类

public abstract class Superclass {
  protected int a = 0;
  protected int b = 0;
  ...
  }

然后我有一个扩展超类的子类,我希望访问 a 和 b,但我不知道如何。我在网上搜索并没有找到任何东西。

public class Subclass extends Superclass {
  public boolean someMethod(){
  .....
  // at the end i need to do
  a += 1;
  return true
  }
}

我收到编译错误: “无法到达的声明者”

感谢您的帮助。

【问题讨论】:

  • 接口不能有字段成员。
  • 其实它是一个抽象类。搞糊涂了……对不起……
  • @Alessandro:您只需在子类中访问它,就像它是公共的一样。这没有什么不同,除了它在课堂之外是不可见的。你没有告诉我们你到底卡在哪里了。这仍然是一个非常不完整的问题。向我们展示您的代码、您的错误消息,并准确告诉我们哪些问题不起作用。
  • 你只需要一个智能IDE来帮你调试,不用担心。

标签: java attributes protected


【解决方案1】:

接口不能定义protected 成员。您应该会看到编译器错误。

protected 超类的成员可用于子类:您只需在extends 超类(抽象超类或其他)的任何类中引用它们。

请参阅访问修饰符表here

【讨论】:

    【解决方案2】:

    如果你有这个

    abstract class TestABC {
        protected int a = 0;
        protected int b = 0;
    }
    

    然后是这个:

    public class TestABCD extends TestABC{
        public void increaseA() {
          try {
            //do method including return
          } finally {
             a++;
          }
        }
    
        public String printIt() {
          System.err.println(t);
          increaseA();
          System.err.println(t);
        }
    
        public static void main(String[] args){ 
            TestABCD t = new TestABCD();
            t.printIt();
        }
    }
    

    可以看到我可以直接在println中访问t.a,因为我的main方法在子类里面。如果变量是private 而不是protected,您将无法访问它。

    【讨论】:

    • 好的,我知道。但我得到一个编译错误:无法访问的语句。我知道它受到保护。我不明白为什么它给我这个错误。
    • 您可以发布您的方法代码吗?我不能肯定地说,但听起来该方法在到达该行之前遇到了 return 语句。
    • 添加了代码。它的安静时间很长,所以我只是要求不工作的特定部分
    • 您需要在方法中访问变量。我更新了上面的示例,向您展示了它是如何工作的。
    • 是的,这就是问题所在,我在一个方法中访问它,它不断抛出无法访问的语句
    【解决方案3】:

    “无法到达的语句”意味着您的代码中没有路径可以让您到达程序中的这一行。它与受保护的领域无关。检查您的a+=1 之前是否有return 语句总是在到达此行之前退出您的方法。或者,如果您的 a+=1 位于永远不会执行的 if 块中,因为您指定的条件始终计算为 false

    【讨论】:

      【解决方案4】:

      该类应该可以像那样访问 a & b 但是如果你声明一个“隐藏”类的 a 或 b 如果你想要超类中的 a & b 你只需像这样使用它们

      有点像镜子屋,但有时当涉及到事情时它很方便

      【讨论】:

        【解决方案5】:

        如果您的子类使用受保护的方法扩展了超类,例如

        public abstract class SuperClass{
        
        protected int a = 0;
        protected int b = 0;
        
        }
        

        您所要做的就是直接在子类中调用这些变量,如下所示:

        public class SubClass extends SuperClass{
        
            public Subclass(){
               System.out.println("int a value:" + a);
               System.out.println("int b value:" + b);
            }
        }
        

        【讨论】:

        • 当我尝试这样做时出现以下编译错误:“unreachable statement”
        • 已更改,立即尝试。反正不应该给unreachable
        • 是的 - 忘记了“扩展”子句:-)
        【解决方案6】:

        您的问题与受保护的根本无关。这与您试图将代码语句赤裸裸地放在它们不属于的类中有关。而是将那行有问题的代码放在方法或构造函数中。

        public class Subclass extends Superclass {
          a += 1; // **** this line ****
        }
        

        注释行无效。类中唯一可以裸露的代码是变量声明或带有初始化的声明,而不是不涉及变量声明的语句。同样,将该行放在构造函数或方法中:

        public class Subclass extends Superclass {
          public Subclass() {
            a += 1; // **** this line ****
          }
        }
        

        【讨论】:

        • 是的,是的,我在方法中添加了它,但它仍然抛出无法访问的语句
        • @alessandro:显示代码,否则没有发生。