如何在Java中使用私有方法

时间:2011-10-08 05:25:21

标签: java methods private-methods

我得到一个具有私有方法的类,例如setCoors(int x,int y)。该类的构造函数也包含setCoors。在另一个类中,我想要一个调用setCoors的方法setLocation。这可能吗?

新问题:

如果我不允许将方法设置为公开,这可能吗?

public class Coordinate{
    public Coordinate(int a, int b){
        setCoors(a,b)
    }
    private void setCoords(int x, int y)
}

public class Location{
    private Coordinate  loc;
    public void setLocation(int a, int b)
        loc = new Coordinate(a,b)
}

6 个答案:

答案 0 :(得分:5)

最好和最有帮助的答案取决于问题的背景,我相信,这并非完全明显。

如果问题是关于私人的意图含义的新手问题,那么答案“否”是完全合适的。那就是:

  • A的私人成员只能在A类
  • 中访问
  • A的包私有成员只能在A包中的类中访问
  • 受保护的A成员只能在A的包和A
  • 的子类中的类中访问
  • A的公共成员可以在A可见的任何地方访问。

现在, if ,好吧也许这是一段时间(谢谢Brian :)),问题来自一个更“高级”的背景,其中一个人正在研究“我是知道私人意味着私人,但是有一个语言漏洞“,那么,那么,这样的漏洞。它是这样的:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

class C {
    private int x = 10;
    private void hello() {System.out.println("Well hello there");}
}

public class PrivateAccessDemo {
    public static void main(String[] args) throws Exception {
        C c = new C();
        List<Field> fields = Arrays.asList(C.class.getDeclaredFields());
        for (Field f: fields) {
            f.setAccessible(true);
            System.out.println(f.getName() + " = " + f.get(c));
        }
        List<Method> methods = Arrays.asList(C.class.getDeclaredMethods());
        for (Method m: methods) {
            m.setAccessible(true);
            m.invoke(c);
        }
    }
}

输出:

x = 10
Well hello there

当然,这确实不是应用程序员所做的事情。但事实上可以完成这样的事情值得知道,而不是应该忽略的事情。恕我直言。

答案 1 :(得分:4)

private表示私有

如果你想要其他课程来调用它,也许你不应该把它变成私有的?

答案 2 :(得分:4)

不,private表示该方法只能在定义它的类中调用。您可能希望setLocation创建一个新的setCoords类实例,或者更改setCoords上的可见性。

编辑:您发布的代码将有效。请注意,Location类的任何实例都将绑定到其自己的Coordinate对象。如果在代码中的其他位置创建新的Coordinate对象,则无法修改其内部状态。换句话说,行

Coordinate myCoord = new Coordinate(4, 5);

将创建永远具有坐标myCoord4的对象5

答案 3 :(得分:3)

无法在定义它们的类之外访问private个方法

答案 4 :(得分:2)

孩子做功课:答案是否定的。家伙 - 需要一些疯狂的工作 - 为他的工作:答案是肯定的。更重要的是,你的setCoors方法不应该采用int参数。它应该需要两个SilverBullet个对象。

答案 5 :(得分:1)

private表示您只能在定义的类中访问它。