静态引用和使用在 main 之外初始化的对象?
Static reference and using Objects which have been initialized outside of a main?
我有一个关于对象使用的问题...
我有一个名为 Area 的 class,其中包含一些方法。我想在创建 Area 对象的另一个 class 中访问这些方法。
public class calcAreaObj {
Area areaObj = new Area();
public static void main(String[] args){
areaObj.area(2,3,4);
}
}
为什么当 class 如上所述创建时我得到一个错误(“无法对非静态字段 areaObj 进行静态引用。但是当源代码被编写成 Area 对象是在主语句中初始化如下,没有错误...
public class calcAreaObj {
public static void main(String[] args){
Area areaObj = new Area();
areaObj.area(2,3,4);
}
}
这是因为在第一种情况下 Area 对象是在静态语句之外初始化的吗?如果是这样,为什么这很重要?
这是因为在 class 范围内定义时,areaObj
特定于 calcAreaObj
的每个实例。这并不是您真正想要的,因为 main
是一个静态方法(因此没有 calcAreaObj
的 实例 与之相关联)。您可以使用您发布的第二个代码示例,也可以按如下方式修改第一个代码示例:
public class calcAreaObj {
static Area areaObj = new Area();
public static void main(String[] args){
areaObj.area(2,3,4);
}
}
此外,如果 areaObj
没有任何状态,在这种情况下,您始终可以将 Area.area
声明为静态。
在第一个示例中,areaObj
是 calcAreaObj
的非静态成员。这意味着只能使用 calcAreaObj
.
的实例访问它
new calcAreaObj().areaObj.whatever(); //this will work
calcAreaObj.areaObj; //areaObj isn't a static member, won't work
简而言之:只要您还没有创建 calcAreaObj
的实例,非静态成员甚至都不存在。在第二个示例中,它在方法的范围内,因此可以访问。
对于第一种情况,您为 class 创建了一个局部变量,它与 main 中使用的对象无关。因此,您必须在 main 中再次初始化该对象。
有一条规则:任何块都有自己的变量。因此,如果您在块中初始化一个变量并尝试在块外使用它,则会给您带来错误。
例如:
public static void main(String [] arg){
{ Area a = new Area(); }
double number = a.area
}
这行不通...
我希望清楚
我有一个关于对象使用的问题...
我有一个名为 Area 的 class,其中包含一些方法。我想在创建 Area 对象的另一个 class 中访问这些方法。
public class calcAreaObj {
Area areaObj = new Area();
public static void main(String[] args){
areaObj.area(2,3,4);
}
}
为什么当 class 如上所述创建时我得到一个错误(“无法对非静态字段 areaObj 进行静态引用。但是当源代码被编写成 Area 对象是在主语句中初始化如下,没有错误...
public class calcAreaObj {
public static void main(String[] args){
Area areaObj = new Area();
areaObj.area(2,3,4);
}
}
这是因为在第一种情况下 Area 对象是在静态语句之外初始化的吗?如果是这样,为什么这很重要?
这是因为在 class 范围内定义时,areaObj
特定于 calcAreaObj
的每个实例。这并不是您真正想要的,因为 main
是一个静态方法(因此没有 calcAreaObj
的 实例 与之相关联)。您可以使用您发布的第二个代码示例,也可以按如下方式修改第一个代码示例:
public class calcAreaObj {
static Area areaObj = new Area();
public static void main(String[] args){
areaObj.area(2,3,4);
}
}
此外,如果 areaObj
没有任何状态,在这种情况下,您始终可以将 Area.area
声明为静态。
在第一个示例中,areaObj
是 calcAreaObj
的非静态成员。这意味着只能使用 calcAreaObj
.
new calcAreaObj().areaObj.whatever(); //this will work
calcAreaObj.areaObj; //areaObj isn't a static member, won't work
简而言之:只要您还没有创建 calcAreaObj
的实例,非静态成员甚至都不存在。在第二个示例中,它在方法的范围内,因此可以访问。
对于第一种情况,您为 class 创建了一个局部变量,它与 main 中使用的对象无关。因此,您必须在 main 中再次初始化该对象。
有一条规则:任何块都有自己的变量。因此,如果您在块中初始化一个变量并尝试在块外使用它,则会给您带来错误。
例如:
public static void main(String [] arg){
{ Area a = new Area(); }
double number = a.area
}
这行不通...
我希望清楚