Java 是否所有实例变量都在函数外部声明?

Java 是否所有实例变量都在函数外部声明?,java,variables,instance-variables,Java,Variables,Instance Variables,我知道变量可以用两种方式分类:- 第一种方法是根据其范围将其分为全局变量和局部变量。当一个类实例的所有方法(即整个类)都可以访问该变量时,则该变量称为全局变量;当该变量只能在一个类实例的一个代码块内访问时,则该变量称为局部变量 第二种方法是将它们分类为类/静态实例/非静态变量。类/静态变量是属于该类的变量,并且该类的所有实例都只存在这些变量的一个副本,并且由它们共享。实例变量是属于类实例的变量,并且为每个实例创建单独副本 我的导师说实例变量只能在函数之外声明。为什么会这样?局部变量不能是实例变量

我知道变量可以用两种方式分类:-

第一种方法是根据其范围将其分为全局变量和局部变量。当一个类实例的所有方法(即整个类)都可以访问该变量时,则该变量称为全局变量;当该变量只能在一个类实例的一个代码块内访问时,则该变量称为局部变量

第二种方法是将它们分类为类/静态实例/非静态变量。类/静态变量是属于该类的变量,并且该类的所有实例都只存在这些变量的一个副本,并且由它们共享。实例变量是属于类实例的变量,并且为每个实例创建单独副本


我的导师说实例变量只能在函数之外声明。为什么会这样?局部变量不能是实例变量吗?

如果在方法中声明了一个变量,它就是属于该方法的局部变量。当方法终止时,它将超出范围。使变量属于实例的唯一方法是直接在类下声明它,即在任何方法之外

编辑:

以下是@Yeikel建议的示例:

public class MyClass {

    private static int iAmAStaticMember = 1;

    private int iAmAnInstanceMember;

    public void someMethod() {
        int iAmALocalVariables = 4;
    }
}

如果它们是在方法内声明的,则它们仅在方法范围内。方法运行后,变量将被销毁

public class Something {

    int j = 0; // j lives as long as the class exists

    public doSomething() {
        int i = 0;
        // i is gone after method run
    }
}

只有全局变量可以分为实例变量和静态变量。函数中的变量是函数的局部变量,既不属于类也不属于对象。实例变量属于对象,静态变量属于类。

在Java中,有实例变量、静态变量和局部变量

静态变量是属于类本身的类级变量,因此所有类/对象都维护和使用一个副本。当类装入器装入类时,它们被激活,当类被卸载时,它们死亡

实例变量绑定到类的实例,即对象。因此,创建的每个对象都有一个变量的副本。基于访问修饰符,在类之外对其使用施加限制(通常是私有的,通过getter和setter访问)。它们在创建实例时变为活动状态,在垃圾收集器发现对象没有指向它的有效/正在使用引用时变为消亡状态

局部变量是方法级变量,即它们是方法的局部变量。这些变量是在调用方法时创建的(以静态方式或通过对象引用),在方法执行完成时或在方法将控制权返回给调用方时消失

    class Demo {

    // static variable - can be accessed by any class/object
    public static int num1 = 1;

    // instance variable - accessed by all objects of this class; if made private, can use accessor methods to access it
    public int num2 = 2;

    // num3 is a local variable (method arguments are also local variables)
    public void getSum() {
        int num3 = 3;
        return num2 + num3;
    }

}

希望这有帮助:)

在函数外部声明。。。Java中没有函数,只有方法。不,它们不能。它们的作用域仅限于在方法中声明后在方法中使用。如果在对象上调用的方法是实例或静态的,那么我认为在该方法范围内声明的任何变量都会与之匹配。这是一个没有实际意义的问题,因为这些变量的作用域只适用于该方法调用。@TimBiegeleisen它不是重复的。请仔细阅读问题。我问过为什么局部变量不是实例变量。我不相信这还没有被问到和回答,但我已经重新打开了。你可能应该添加示例代码来完成这个回答,但局部变量不是对象的一部分。@MrAP:我想这取决于你定义“对象的一部分”的语义。该方法是一种实例方法,因此直观地说,该方法的范围与对象的实例相关联。另一方面,如果您询问值本身是在堆栈上还是在堆上,那完全是另一回事。但这真的有区别吗?这里所问的问题有更深层次的目的吗?当我们谈论一个对象时,对象携带一个状态,它是实例变量,而方法定义对象的行为。因此,即使可以使用对象引用来访问对象,也不会将方法级变量引用为对象的一部分,因为方法可能会完成执行,并且局部变量会从堆栈空间中移除,而对象在堆内存中仍然是活动的。因此,您可以将实例变量关联为属于对象,因为只要对象存在,它就会一直存在。@David,您说过“该方法是一个实例方法,因此直观地说,该方法的范围与对象的实例相关联。”这意味着局部变量属于类的实例,因此为每个实例创建一个单独的副本。那么它们不也应该是实例变量吗?