我想知道是否可以在另一个 java 类中使用一个 java 类的变量。假设变量 Time 在 A 类中定义和计算,我如何在 B 类中使用它?
5 回答
其他答案建议增加变量的可见性。不要这样做。它打破了封装:您的类使用字段来存储特定信息的事实是实现细节;您应该改为通过类的 API(其方法)公开相关信息。在几乎所有情况下,您都应该将字段设为私有。
同样,其他一些答案建议可能将变量设为静态。不要随意这样做。您需要了解静态的真正含义:它表示这条信息与类型相关,而不是与该类型的任何一个特定实例相关。有时这是合适的,但它通常是通往不易测试代码的道路——而且在许多情况下,这显然是错误的。例如,一个Person
类可能有一个name
变量,但它当然不应该是静态的——它显然是关于一个人的信息。
无论如何,在公开信息之前,您应该仔细考虑 - 考虑是否存在相关类可以公开的更广泛的操作,而不是仅仅零碎地泄露其数据 - 但是当您确实想要公开字段的值时,请使用属性。例如:
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
通过通过方法公开它,您可以在不破坏现有客户端的情况下更改实现细节。
然后从另一个类中,您只需调用该getName()
方法:
// However you end up getting a reference to an instance of Person
Person person = ...;
String name = person.getName();
如果您确实有一个静态字段,则可以以相同的方式公开该值,但使用静态方法,您可以使用类名调用该方法。
小心返回可变的值,例如java.util.Date
. 这是使用 getter 方法而不是允许直接访问该字段的另一个原因 - 您可以使该方法在您需要的地方返回一个防御性副本。
另请阅读Java 中的访问说明符,它可能会有所帮助。
如果它被声明为 public,你可以使用ClassA.yourVariable
. 另一方面,对于私有访问修饰符,将 getter 包含到您的ClassA
. 上ClassB
,打电话ClassA.getYourVariable()
。
如果您将变量声明为 public 或 static,您将能够从另一个类访问它。
这是一个非常非常糟糕的主意:)
如果变量是static
,您可以A.Time
从任何可以访问该变量的代码中引用它。所有类 A只有一个Time
值。如果它是一个实例变量,并且您有一个a
class的实例A
,则可以将该变量称为a.Time
。class 的每个实例都有一个单独的值A
。
这取决于 Java 的访问规则:
- 如果字段是
public
,任何代码都可以访问它(这使得public
变量有点危险,除非它们也被声明final
) - 如果该字段是
protected
,则只有同一包或子类中的代码A
才能访问它 - 如果该字段具有默认访问权限,则只有与 A 类位于同一包中的代码才能访问它
- 如果该字段是
private
,则只有类中的代码A
(包括 的内部类A
)可以访问它。
或者,您可以在 A 类中提供访问器方法:
public class A {
. . .
public class getTime() {
return this.Time; // the "this." is optional
}
}