【问题标题】:private member function access [duplicate]私有成员函数访问[重复]
【发布时间】:2018-05-26 15:30:23
【问题描述】:

我是java新手...如果我遗漏了什么,请告诉我。

我尝试访问私有方法,如下所示:

public class PublicClassPrivateMethodAndVariableAccess
{
    private int a=23;

    private void show()
    {
        System.out.println("a = "+a);
    }

    public static void main(String... arg)
    {
        PublicClassPrivateMethodAndVariableAccess pr = new PublicClassPrivateMethodAndVariableAccess();
        System.out.println("using method showing  pr.show() ");
        pr.show();
        System.out.println("pr.a = "+pr.a);
    }
}

这将显示输出为:

using method showing  pr.show()

a = 23

pr.a = 23

但是当我使用类似的代码以不同的方式访问私有方法时......:

class Testclass
{
    private int a=23;

    private void show()
    {
        System.out.println("a = "+a);
    }   
}

public class NoModifierClassPrivateMethodAndVariableAccess
{
    public static void main(String... arg)
    {
        Testclass pr = new Testclass();
        System.out.println("using method showing  pr.show() ");
        pr.show();
        System.out.println("pr.a = "+pr.a);
    }
}

...它显示错误如下:

NoModifierClassPrivateMethodAndVariableAccess.java:19: error: show() has private
 access in Testclass
                pr.show();
                  ^
NoModifierClassPrivateMethodAndVariableAccess.java:20: error: a has private access in Testclass
                System.out.println("pr.a = "+pr.a);
                                               ^
2 errors

我在问为什么第二个代码无法访问私有方法?

【问题讨论】:

  • private 方法仅在包含它的类中可见。示例 1:一切都在 PublicClassPrivateMethodAndVariableAccess 中,因此 show() 是可见的。在示例 2 中:您将方法放在另一个类中,因此该方法不可见。让它public.
  • “设为 public 或者保持私有并添加 getter 和/或 setter。
  • 谢谢我明白..在我的代码中,Testclass 是公共类还是私有类?

标签: java private member-functions


【解决方案1】:

你需要为你的私人物品制作一个吸气剂。

您无法直接访问私人项目,而这正是您在进入时尝试做的事情

System.out.println("pr.a = "+pr.a);

相反,您应该使用吸气剂,例如

   public int getA(){
       return a;
}

所以你的新显示器应该是这样的

System.out.println("pr.a = "+pr.getA());

【讨论】:

    【解决方案2】:

    来自 Oracle 文档:

    +-------------+-------+---------+----------+-------+
    |  Modifier   | Class | Package | Subclass | World |
    +-------------+-------+---------+----------+-------+
    | public      | Y     | Y       | Y        | Y     |
    | protected   | Y     | Y       | Y        | N     |
    | no modifier | Y     | Y       | N        | N     |
    | private     | Y     | N       | N        | N     |
    +-------------+-------+---------+----------+-------+
    

    在第一种情况下,您可以根据文档从同一类调用 show 方法。

    在第二种情况下,您从不同的类调用私有方法会导致编译器错误。

    如果你真的想从不同的类访问私有方法,那么你想看看Java中的Reflections

    例子:

    import java.lang.reflect.Method;
    
    class Testclass
    {
        private int a=23;
    
        private void show()
        {
            System.out.println("a = "+a);
        }   
    }
    
    public class NoModifierClassPrivateMethodAndVariableAccess
    {
        public static void main(String... arg) throws Exception
        {
            Class<?> clazz = Testclass.class;
            Method method = clazz.getDeclaredMethod("show");
            method.setAccessible(true);
            System.out.println(method.invoke(Testclass.class.newInstance()));
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      私有字段a 只能由其所属类A_Class 本身访问。例如:

      public class A_Class {
          private int a = 3;
          private void show() {
              System.out.println(a); // output is 3
          }
      }
      

      我们在这里:

      • A_Class
      • 访问私有字段a

      这就是您在第一个代码中所做的事情,并且效果很好。


      但是,在您的第二个代码中,您在类 B_Class 中试图访问由类 A_Class 拥有的私有字段 a,这是不可能的。例如:

      public class A_Class {
          private a = 3;
      }
      
      public class B_Class {
          void show() {
              private A_Class aclass = new A_Class();
              System.out.println(aclass.a); // error! a has private access
          }
      }
      

      我们在这里:

      • B_Class
      • 创建类A_Class的对象
      • 试图访问字段 a,该字段只能访问类 A_Class - 失败!

      Herehere 你可以找到更多关于 java 修饰符的解释。

      【讨论】:

      • 我再问你一件事......在我的代码中,Testclass 是公共的还是私有的?
      • Testclass 既不是 private 也不是 publicTestclass 没有修饰符,因此它是 package-可见的。这意味着,只有与Testclass 一起位于包中的类才能访问(参见)Testclass。也许这也对你有帮助:decodejava.com/java-class-access-modifiers.htm
      猜你喜欢
      • 2015-04-01
      • 2016-09-06
      • 2021-06-27
      • 2013-02-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多