Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类的不同方法如何更改成员';s数据不同于全局变量_Java_Oop_Global Variables - Fatal编程技术网

Java 类的不同方法如何更改成员';s数据不同于全局变量

Java 类的不同方法如何更改成员';s数据不同于全局变量,java,oop,global-variables,Java,Oop,Global Variables,比如说,我有一个名为I的成员变量,我在类中的三个不同方法中更改它的值 那么,每次i的起始值都不同?这与拥有一个全局变量有什么不同?全局变量是一个强烈的“不”和“不”并且不被接受 public class ChangingMember { int i = 1; public static void main(String[] args) { ChangingMember obj = new ChangingMember(); System.out.println(obj.i);

比如说,我有一个名为
I
的成员变量,我在类中的三个不同方法中更改它的值

那么,每次
i
的起始值都不同?这与拥有一个全局变量有什么不同?全局变量是一个强烈的“不”和“不”并且不被接受

public class ChangingMember {
int i = 1;
public static void main(String[] args) {
    ChangingMember obj = new ChangingMember();
    System.out.println(obj.i);
    obj.test();
    obj.test1();
    obj.test2();
    System.out.println(obj.i);
}

public void test() {
    i++;
}

public void test1() {
    i++;
}

public void test2() {
    i++;
}

}

否,它将始终保持不变,因为变量不是静态的

如果创建ChangingMember类的新对象,则i的起始值将相同(1)。如果希望它在新对象上始终具有最后一个值,则必须将此属性设置为静态


静态int i=1

您需要访问对象才能调用这些方法。这意味着你对它有明显的依赖。它需要传递给任何使用它的类。只有明确授予此对象访问权限的代码才能更改变量。这与全局变量不同

void foo(ChangeingMember member) { // <-- dependency
    member.test1();    
}

void bar() { // <-- no dependency
    SomeGlobal.someMethod();
}
你仍然可以控制它的状态。只有当您授予对对象的其他代码访问权限时,才能更改状态:

foo(obj); // Giving 'foo' access to 'obj'

但是任何东西都可以访问全局变量。没有封装。

因为您只使用类的一个实例,所以可以使用它们的方法修改其变量。要使变量成为全局变量或与该类的其他实例共享,可以添加一个
static
修饰符。因此,代码将输出相同的结果

static int i = 1;

public static void main(String[] args) {
    ChangingMember obj = new ChangingMember();

    System.out.println(obj.i);

    new ChangingMember().test();
    new ChangingMember().test1();
    new ChangingMember().test2();

    System.out.println(obj.i);
}

现在,如果删除
static
修饰符,结果将不同。

在类初始化时分配的所有全局变量的值。

让我们逐行遍历代码

对象已创建,现在和分配给对象(obj)的所有全局变量的值为1

test()由object调用,它执行变量i的增量过程,变量i在object obj的范围内已经有值1

…因此它将增加。这同样适用于其余两种方法


注意:在编写代码时,请坚持使用更好的方法。

i++
++i
i+=1
都会将
i
的值增加1。是的,你是对的,我认为我们必须重新设计该值!它与全局变量不同,因为您可以创建另一个
ChangingMember
实例,其
i
字段将不同。
static int i = 1;

public static void main(String[] args) {
    ChangingMember obj = new ChangingMember();

    System.out.println(obj.i);

    new ChangingMember().test();
    new ChangingMember().test1();
    new ChangingMember().test2();

    System.out.println(obj.i);
}
 ChangingMember obj = new ChangingMember();
    obj.test();
public void test() {
    i++;
}