4

将值分配给任何方法之外的变量和在构造函数中分配这些值之间有区别吗?

查看 Oracle 的 Java 教程,他们有:

public class Bicycle {

   int cadence = 0;
   int speed = 0;
   int gear = 1;

   void changeCadence(int newValue) {
      cadence = newValue;
   }

这与说/他们为什么不说有什么不同:

Bicycle(){
    int cadence = 0;
 } 
4

8 回答 8

6

如果您在构造函数中声明变量,它将是构造函数的本地变量,并且在您的类中的其他任何地方都不可见。

于 2013-03-25T22:14:31.403 回答
4

好吧,如果你在构造函数中定义一个变量,它是构造函数的本地变量。但是类中的变量是类状态的一部分。

但如果你的意思是:

class A {
    int i = 1;
    ...
}

对比

class B {
    int i;

    B() {
        i = 1;
    }
    ...
}

区别在于:在第一种情况下i,在所有情况下,默认值为 1,但在第二种情况下,i如果调用了所示的构造函数,则默认值为 1,可能在其他构造函数中,其他默认值是其他值(或 0如果没有分配给i)。

于 2013-03-25T22:20:01.610 回答
3

如果在 a 中声明 a variableconstructor则只能访问此变量inside this constructor。但是,您可以在 上创建一个变量,然后在您的或class上访问它。constructormethod

于 2013-03-25T22:14:56.467 回答
2

When you create object instance, global variables will be initialized. You can (but not have to) change some of them in constructor.

I think you mean

Bicycle() { 
   cadence = 0; 
} 
于 2013-03-25T22:17:34.300 回答
1

这种情况下的区别在于,您不仅在构造函数中分配变量(在第二种情况下)。你也在那里声明它。因此,该变量是构造函数的本地变量,并且从外部不可见。

于 2013-03-25T22:19:14.363 回答
1

在构造函数中:它将是局部变量

Java 包含以下类型的变量:

实例变量(非静态字段):在面向对象的编程中,对象将它们各自的状态存储在没有静态关键字声明的“非静态字段”中。类的每个对象对这些非静态变量都有自己的一组值,因此我们可以说这些与对象(类的实例)相关。因此这些变量也称为实例变量。如果未初始化,这些变量将采用默认值。

类变量(静态字段):这些与一个类共同相关,并且没有一个对象可以声称它们是它的唯一所有者。使用 static 关键字定义的变量由所有对象共享。在这里,对象不存储单独的值,但它们被迫在它们之间共享它。这些变量使用 static 关键字声明为“静态字段”。同一类的不同对象始终共享同一组值。所以这些变量就像全局变量一样,对于类的所有对象都是相同的。如果未初始化,这些变量将采用默认值。

局部变量:在方法或代码块中定义的变量称为局部变量。这些变量只能在方法或代码块中访问。如果未初始化,这些变量不会采用默认值。这些值需要在使用前进行初始化。

参数:参数或参数是方法声明中使用的变量。

于 2013-03-25T22:18:39.457 回答
1

构造函数与任何其他方法一样。在其中声明的变量仅在其中可用,并且当您超出范围时它们将被销毁。

于 2013-03-25T22:18:46.293 回答
0

我认为你的问题是:如果我们可以直接给变量(类)一个默认值,为什么要在构造函数中给它。如果这是问题所在,那么我认为这是因为即使对象未初始化,变量中的值也可用,这不是一种健康的做法,也没有多大意义。相反,在构造函数中给出值不仅会被隐藏,而且还会遵守 java 的 oops 规则。

于 2021-06-28T22:08:52.320 回答