变量与常量

2020-04-07  本文已影响0人  公子请留步LookMe
变量和常量,有一个共同的属性:量。量是一种传递数据的介质,量的实质是“值”。

一.常量和变量的概念描述

程序中定义的用来传递数据的介质(上面介绍的量),可以是变化的,也可以是固定不变的。

固定不变的量称为常量,随程序运行过程可以发生改变的量称为变量。

二.常量和变量的声明与定义

常量和变量在声明的时候,都需要指定具体的数据类型

变量的声明
[修饰符]  变量类型  变量名;

修饰符是可选的,但不是随意的。修饰符可以分为权限修饰符和其他修饰符,局部变量不可以用权限修饰符修饰。

变量在声明的时候需要指定数据类型,程序会根据指定的类型为变量在内存当中开辟一块相对应大小的空间,在程序运行的过程中,空间内的值是变化的。为了方便地获取和操作这个值,就给这个空间取一个名字,即变量名。空间内存储的值就是变量的值。
常量的声明
常量被final关键字修饰,从某种意义上讲,常量是一种特殊的变量,因为被final修饰而无法改变值。

习惯上,常量标识符全部大写。

常量可以先声明再赋值,但是一经赋值,就不能再改变它的值。实际编程过程中,一般都会在声明的同时给这个常量赋值。

三.变量的作用域

根据作用的范围,Java变量可以分为全局变量和局部变量这两大块。
某些资料上,对作用域继续划分,可以得到类级变量、对象实例级变量、方法级变量和块级变量。

1.类级变量

类级变量又称为静态变量,是使用static关键字修饰的变量。

类级变量只有一份,它不属于任何一个对象,而是由程序共享。
假如在游戏开发中,将敌人的血量设置为类级变量,
那么就会导致一个敌人死掉的时候,所有的敌人同时死掉了,因为他们共享了一个变量,一改全改。
public class TestStatic {
    public static void main(String[] args) {
        System.out.println(A.a); // 0
        A a1 = new A();
        a1.printA(); // 0
        A a2 = new A();
        a2.setA(); 
        a2.printA(); // 1
        a1.printA(); // 1
    }
}
 
class A {
    public static int a;
    
    public void setA() {
        a++;
    }
    
    public void printA() {
        System.out.println(a);
    }
}

2.对象实例级变量

对象实例级变量即成员变量。
成员变量必须在实例化一个实际对象之后才能被访问,而且每一个对象有属于自己的成员变量值。

public class TestObject {
    public static void main(String[] args) {
        B b1 = new B();
        b1.printB(); // 0
        B b2 = new B();
        b2.setB(); 
        b2.printB(); // 1
        b1.printB(); // 0
    }
}
 
class B {
    private int b;
    
    public void setB() {
        b++;
    }
    
    public void printB() {
        System.out.println(b);
    }
}

3.方法级变量和块级变量

方法级变量指的是在方法内部定义的变量,块级变量指的是在块内部定义的变量。它们都属于局部变量。

局部变量的作用域仅限在它所在的大括号之内。如果是方法级变量,可以在本方法之内任意地方使用,但是方法之外的任何地方都无法访问它。块级变量的作用域就更是局限在块内部,比如for循环定义的变量 i 就只能在for循环体之内使用。

局部变量在使用之前必须显式地赋初值,否则程序会报错(The local variable i may not have been initialized.其中 i 就是一个没有赋值的局部变量),但是上面提到的类级变量和成员变量,如果声明的时候没有赋值,系统会自动为其补上一个默认值(数值类型默认是0).
public class TestPart {
    
    public static void main(String[] args) {
        // 在这里访问test方法中的变量 i
        System.out.println(i); // i cannot be resolved to a variable.
    }
    
    
    public static void test() {
        int i = 0;
        System.out.println(i); // 这里可以访问到i
        for (int j = 0; j < 10; j++) {
            // 正常访问 j
            System.out.print(j + " ");
        }
        System.out.println(j); // j cannot be resolved to a variable
    }
    
}
##局部变量还有一个需要注意的地方:

在方法内部,局部变量能够覆盖成员变量,但是块级变量不能覆盖方法级变量。

如果想要在方法中访问同名的成员变量,需要使用this关键字。
public class TestCover {
    int j = 0;
    
    public void fun() {
        int j = 5;
        System.out.println("方法中的j:" + j); // 5
        System.out.println("成员变量j:" + this.j); // 0
        
//      // 如果继续在块中定义 j,编译器会报错,提示重复局部变量
//      for (int j = 0; j < 10; j++) {
//          
//      }
    }
    
    public static void main(String[] args) {
        TestCover tester = new TestCover();
        tester.fun();
    }
}

————————————————

在计算机中执行的过程

image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读