私有成员函数访问

时间:2018-05-26 15:30:24

标签: java private member-functions

我是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

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

3 个答案:

答案 0 :(得分:0)

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

您无法直接访问私人物品,而这正是您在输入

时尝试执行的操作
   public int getA(){
       return a;
}

相反,你应该使用吸气剂,如

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

所以你的新显示应该是

List<Class_A>

答案 1 :(得分:0)

私有字段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所拥有的私有字段A_Class,但这是不可能的。例如:

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修饰符的更多解释。

答案 2 :(得分:0)

来自Oracle docs:

+-------------+-------+---------+----------+-------+
|  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()));

    }
}