最终(常量)实例(非静态)变量是否像类(静态)变量一样?

时间:2012-03-14 09:53:07

标签: java variables scope constants

在以下示例中,变量b声明为final,但不是static。这意味着它是一个常量实例变量。但是,因为它是常量,所以Passenger个对象都不能改变它的值。因此,将它声明为static并使其成为类变量更好,以便所有实例化对象只能使用一个副本吗?

class Passenger {
    int a;
    final int b = 0;

    void drive() {
        System.out.println("I'm driving!");
    }
}

5 个答案:

答案 0 :(得分:10)

final但非static变量的目的是拥有一个对象范围的常量。它应该在构造函数中初始化:

class Passenger {
    final int b;

    Passenger(int b) {
        this.b = b;
    }
}

如果您始终为0变量分配常量字面值(final),则没有多大意义。最好使用static,以便您只拥有b的单个副本:

static final int b = 0;

顺便说一下,我不认为你的意图是默认访问修饰符。

答案 1 :(得分:1)

如果你有多个Passenger类的实例,我会把它设为静态。虽然在讨论int变量时这没什么好处,但如果你有复杂的对象,这可以节省一些内存。这是因为静态变量属于一个类,而不属于一个实例,因此它的内存空间只保留一次,它将由类对象本身引用,而不是由实例引用。当然,您应该知道将b作为静态变量意味着对此变量所做的更改将反映在访问此变量的所有类中,但是因为您创建了它final不是这样的。

另请注意,使用您编写的代码,与Passenger相同的包中的类将能够通过b访问Passenger.b来读取{{1}}值(如果是静态的)

答案 2 :(得分:0)

在java中,static属性基本上意味着:与类型本身相关联,而不是类型的实例。

换句话说,您可以引用静态变量而无需创建该类型的实例......而在仅使用final的情况下,您需要实例化该类。

所以,是的,回答你的问题,我会说你是对的。 :)

答案 3 :(得分:0)

final原语与static final原语相同(效率更高)

final对不可变对象的引用,与static final引用相同。

对可变对象的final引用与对此static final引用的引用不同。

final int i = 0;
// same as
static final int = 0;

final String hi = "Hello";
// same as
static final String hi = "Hello";

final List<String> list = new ArrayList<String>();
// is NOT the same as
static final List<String> list = new ArrayList<String>();

最后一个例子的唯一时间是你有一个单身人士。对于单身人士来说,编写静态和非静态字段和方法的混淆是相当常见的,因为差异并不明显。 :|

答案 4 :(得分:0)

当您需要常量时,会定义final变量,因此您只需分配一次值即可。 相反,使用static定义一个由该类型的所有对象共享的变量(如全局变量),并且它不与某个对象本身相关联。