我想问你在main方法内声明的变量是实例变量还是局部变量。
这是代码:
public class App {
public static void main(String[] args) {
Animal fish = new Fish();
...
}
}
[我正在观看Udemy的视频教程,讲师说fish
是实例变量。我认为方法内声明的变量是局部变量。
在类内部但在方法主体之外声明的变量称为实例变量。之所以称为实例变量,是因为其值是特定于实例的,并且不会在实例之间共享。
在方法体内声明的变量称为局部变量。您只能在该方法内使用此变量,而在该方法外看不到它们。
class A {
int data = 50; //instance variable
void method() {
int n = 90; //local variable
}
如果您在任何方法中声明任何变量,则它是局部变量。您的main方法可能是一种特殊的方法,但这是一种方法。因此,您在main中声明的任何内容也将是局部变量。
这由Scope调用。
方法主体范围变量只能在方法主体中访问(局部变量,参数)
因此,Oracle defines“实例变量”:
实例变量(非静态字段)从技术上讲,对象将其各自的状态存储在“非静态字段”中,即字段声明时不带static关键字。非静态字段也是已知的作为实例变量,因为它们的值对于每个实例都是唯一的一堂课
[我认为Udemy导师使用的是不幸的术语,它指的是“引用实例的变量”。换句话说,他是在通俗地使用“实例变量”一词,而不是用它的官方含义。
它是局部变量,因为它仅在main方法中可见,而实例变量可以在类中的所有方法中看到。
您可以参考此old thread来告诉局部变量和实例变量之间的区别
您的fish
变量是reference variable
。引用变量是那些保存对对象(在您的情况下为Fish
类的对象)的内存引用的变量。 Instance variables
是属于实例的那些变量。在Fish类中,您可能已经声明了一些定义对象属性的变量。例如:color
可以是定义特定鱼(Fish类的实例)的颜色的变量。现在为您解答,fish
变量是一个局部变量,因为它存在于您的主方法(这是另一个方法)中。因此,如果要使用其他方法访问同一对象,则需要将该对象的引用作为该方法的参数传递,如下所示:
public class App {
public static void main(String[] args) {
Animal fish = new Fish();
...
new App().anotherMethod(fish) //pass the memory reference of the object
}
public void anotherMethod(Fish fishRef){ // memory reference is now in fishRef
//fishRef now accesses the same object as your fish variable in main method
}
}