[英]Java: Calling Object in Method Outside of Main with Static Methods
[英]Java calling object in method outside of main
我有一个简单的问题,我已经坚持了一段时间,我找不到答案。 基本上,我正在创建一个对象并尝试访问变量而不使用静态变量,因为我被告知这是错误的方法。 以下是该问题的一些示例代码。 我在第一个类中收到一个无法解析为变量的错误。 我希望能够做的是在main之外的其他方法中访问t.name
,以及在其他类中也是如此。 为了解决这个问题,我将使用Test2.name
并在Test2
类中使变量为static,如果我错了,请纠正我,但我认为这是错误的方法。 任何帮助将不胜感激=)
public class Test {
public static void main(String[] args) {
Test2 t = new Test2("Joe");
}
public void displayName() {
System.out.println("Name2: " + t.name);
}
}
public class Test2 {
String name;
public Test2 (String nm) {
name = nm;
}
}
我看到其他人已经发布了代码片段,但是他们实际上没有发布为什么这样做有用(在撰写本文时)。
您收到编译错误的原因是在您的方法中
public static void main(String[] args) {
Test2 t = new Test2("Joe");
}
变量t的范围就是那种方法。 您将Test2 t
定义为仅在main(String[] args)
方法中,因此您只能在该方法中使用变量t
。 但是,如果您要将变量设为字段(如此),并创建Test类的新实例,
public class Test {
Test2 t;
public static void main(String[] args) {
Test test = new Test();
test.t = new Test2("Joe");
test.displayName();
}
public void displayName() {
System.out.println("Name2: " + t.name);
}
}
然后您不应再收到任何编译错误,因为您声明变量t在类Test
范围内。
您可以将测试对象的引用作为方法displayName
的参数:
public class Test {
public static void main(String[] args) {
Test2 t = new Test2("Joe");
displayName(t);
}
public static void displayName(Test2 test) {
System.out.println("Name2: " + test.name);
}
}
注意:我还将displayName
静态方法。 在main
方法中,您只能访问静态方法而无需引用。
将Test类修改为此
public class Test {
private static Test2 t;
public static void main(String[] args) {
t = new Test2("Joe");
}
public void displayName() {
System.out.println("Name2: " + t.name);
}
}
为您的目的使用getter
。 这是您的问题的一个侧面解决方案,但通常这是您应该如何使用getter
检索实例变量。
public class Test {
public static void main(String[] args) {
Test2 t = new Test2("Joe");
displayName(t);
}
public static void displayName(Test2 test) {
System.out.println(test.getName());
}
}
public class Test2
{
private String name;
public Test2 (String nm)
{
name = nm;
}
public String getName()
{
return name;
}
}
永远记住,班级中的变量应该是private
。 这可以保护它免受来自课外的访问。 因此, getter
是访问它们的唯一方法。 并使用setter
或constructor
初始化它们。
我认为越少静电越好。
我将实例化Test并在其实例上调用displayName,然后将Test2的实例传递给displayName。 但这取决于总体目标是什么
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.