2011-10-08 30 views
4

我给出了一个具有私有方法的类setCoors(int x,int y)。该类的构造函数也有setCoors。在另一个类中,我想要一个调用setCoors的方法setLocation。这可能吗?如何在Java中使用私有方法

新问题:

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

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) 
} 
+3

@RayToal - 你正在做一些大的假设。鉴于他不了解整个公众与私人事物,我怀疑他的班级是否已经完成了反思。当然,这也是一个假设......只是稍微小一点,因为他说明了构造函数调用私有方法...;) –

+0

@Brian我同意,是的,“否”的答案更有帮助,因为你'正确的问题来自Java开始的上下文。我并不反对将其他访问者的答案留在页面上,但如果有共识,它不属于我可以撤回它。尽管如此,我仍然无法确定_best_答案是否是合格的否;就像“没有你不能,只有这样 - 这是一个非常复杂的后门,可以让你做到这一点,但除了这些邪恶的黑客,没有人会这样做,你可以稍后再学习......”或者也许不是。 :) –

回答

4

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

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

Coordinate myCoord = new Coordinate(4, 5); 

将创建对象myCoord这将永远有坐标45

+0

因此,如果我不允许setColors公开。然后在setLocation中,我做这样的事情:setLocation(int a,int b){coords = new Coordinate(a,b)?假设setCoords为坐标类 – Dan

+0

是的,假设这是你想要的。没有看到课堂设计,很难说这是否是解决问题的正确方法。 – brc

4

private意味着它私人

如果希望其他类调用它,也许你不应该让私人?

+0

正如@丹在回答我的回答时所说的,他无法改变'setCoords'方法的可见性。 – brc

+0

不正确。它可以通过反射进行访问。他没有问他是否应该,他问他是否可以。现在我完全同意你应该告诉他他不应该这样做,但这并不能改变这个事实,即正确答案是“是,但是......” – CorayThan

3

没有private方法不能在定义它们

1

private意味着你只能访问它定义的类中的类外部访问。

4

最好和最有用的答案取决于问题的上下文,我相信这并不是完全明显。

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

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

现在,如果了,还好,也许这是一个拉伸(谢谢你,布莱恩:)),这个问题从一个更“高级”的上下文来了,其中一个正在考虑的“我知道私人问题意味着私密但是有语言漏洞“,那么,那么就是这样的漏洞。它是这样的:

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 

当然,这真的不是应用程序的程序员会做什么。但事实上,这样的事情可以完成是值得的知道,而不是应该忽略的东西。恕我直言,无论如何。

+0

说真的,你会“帮助”一个不了解公共和私人的反思的学生吗? –

+0

哈哈太有趣了。雷是对的,但我认为布莱恩更为正确。 ;)“不”是一个更好的答案。 :) –

+0

实际上,没有办法从问题中看出学生不了解公立与私立。这可能是一个高级班的研究问题。但你的问题是公平的。我将限定答案,谢谢。 –

2

孩子做作业:答案是否定的。男人需要一些疯狂的工作:答案是肯定的。更重要的是,你的setCoors方法不应该带int参数。它应该需要两个SilverBullet对象。