【问题标题】:JAVA: How can I access a private method from another class, using a constructor?JAVA:如何使用构造函数从另一个类访问私有方法?
【发布时间】:2015-04-04 21:20:40
【问题描述】:

所以,我在一个名为 Lotion 的类中创建了一个方法,并将其命名为 read() 这个方法接受用户的输入。我的导师告诉我,方法 read() 必须是私有的。但是,他说他的演示/测试类应该能够访问方法 read()。他给了我们一个提示,说我们必须使用构造函数。但不幸的是,我仍然不明白它应该如何工作。谁能解释一下。

提前致谢。

【问题讨论】:

  • 你确定他说的是构造函数还是反射?
  • 他说的是构造函数。有没有可能。还有,什么是反射?
  • 他可能的意思是你应该有另一个(公共)方法或构造函数在内部调用私有方法,从而使其间接访问。不过,我不确定从构造函数中获取用户输入是一种好习惯。
  • ^ 正如 Thilo 所说,可能是通过 super 构造函数...

标签: java


【解决方案1】:

您当前的代码(在 cmets 中发布)

private void read() {
    System.out.println(
     "Enter the amount of liquid in the bottle (0-100): "); 
     volume = keyboard.nextDouble(); 
     if (volume > MAX || volume < MIN) { read(); } }
}

这会通过设置 volume 来初始化您的对象。

您可以从类构造函数中调用它:

  public Lotion(){
     read();
  }

这样,当您创建实例时,它会自动要求用户输入并将答案设置为实例字段。


一些设计说明(但不要与你的导师争吵):

  • 像用户输入这样的“繁重的工作”可能不应该作为构造函数的一部分来完成。
  • 如果要从构造函数调用方法,将它们设为私有是个好主意。否则它们可以被覆盖,然后将在未完全构造的对象实例上调用。
  • read 可以返回 double 而不是直接更新对象状态。

【讨论】:

  • 谢谢,我不知道它会自动要求它。我想我必须像其他方法一样调用它。例如:name.read();
  • 好吧,如果你把它放到构造函数中,它会自动完成所有这些。也许我们不应该把它放在那里(以获得更多控制权)。但这是一个设计问题。
  • 但是代码现在可以工作了,谢谢。您的项目保护者:-)
【解决方案2】:

利用反射,使用setAccessible方法访问私有构造函数。

【讨论】:

  • 这不太可能出现在初学者的 Java 课程中。
  • 同意,我怀疑这个练习的重点是使用反射。重点最有可能考虑语言中可用的不同范围。您无需使用反射来执行此处要求的操作。
【解决方案3】:

下面是解决方案。:) 下次我希望你在问之前做一些编码......:P

public class Lotion{
        public Lotion(){
            System.out.println(read("Constructor"));
        }

        private String read(String input){
            return input;
        }
    }
    class Tester{
        public static void main(String[] args) {
            new Lotion();
        }
    } 

【讨论】:

  • 但是我的方法是无效的。
  • 它没有要传递的参数
  • @jiija 然后在调用方法时使其无效并删除 syso 语句
  • @jiija...这只是一个例子。你需要根据你的东西让它工作
【解决方案4】:
  1. 由于您的 read() 方法是私有的,我们不能直接使用它。
  2. 只需在演示类中创建乳液类的对象。当我们创建对象时,我们正在调用乳液类的构造函数。
  3. 将用户输入作为该构造函数的参数传递
  4. 在构造函数内部调用 read() 方法。

【讨论】:

    【解决方案5】:

    我认为您的讲师在暗示可以从哪里调用私有方法以及您应该如何构建代码。私有方法只能在同一个类中被调用(默认情况下,不使用像字节码操作,甚至反射这样的底层技术,这两者都不是本练习的重点)。这也将包括构造函数。如果您再考虑一下,您应该拥有所需的一切......

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2011-08-03
      • 1970-01-01
      • 2017-07-13
      • 2011-02-05
      • 1970-01-01
      • 2022-07-22
      • 2020-07-11
      • 2021-01-03
      相关资源
      最近更新 更多