Java基础之(十四)成员变量和局部变量

说明
在Java中,根据定义变量位置不同,可以将变量分为两大类:成员变量和局部变量。

这里写图片描述

成员变量

成员变量指的是在类范围内定义的变量,也就是前面所介绍的Field;局部变量指的是在方法里定义的变量。
成员变量被分为类Field和实例Field两种,见上图。其中类Field从类的准备阶段起开始存在,直到系统完全销毁这个类,类Field作用域与这个类的生存范围相同;而实例Field则从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例Field作用域与对应实例的生存范围相同。

只要类存在,程序访问该类的类Field语法格式如下:

类.类Field

只要实例存在,程序访问该实例的实例Field语法格式如下:

实例.实例Field

类Field也可以通过类的实例来访问:

实例.类Field

下面程序定义了一个Person类,在这个类中定义了两个成员变量:

Class Person{
    //定义一个实例Field
    public String name;
    //定义一个类Field
    public static int eyeNum;
}
public class TestPerson
{
    public static void main(String[] args) 
    {
        //Person类已经加载,则eyeNum变量起作用了,输出0
        System.out.println("Person的eyeNum类属性值:" + Person.eyeNum);
        //创建Person对象
        Person p = new Person();
        //通过Person对象的引用p来访问Person对象name实例属性
        //并通过实例访问eyeNum类属性
        System.out.println("p变量的name属性值是:" + p.name 
            + " p对象的eyeNum属性值是:" + p.eyeNum);
        //直接为name实例属性赋值
        p.name = "孙悟空";
        //通过p访问eyeNum类属性,依然是访问Person的eyeNum属性
        p.eyeNum = 2;
        //再次通过Person对象来访问name实例属性和eyeNum类属性
        System.out.println("p变量的name属性值是:" + p.name 
            + " p对象的eyeNum属性值是:" + p.eyeNum);
        //前面通过p修改了Person的eyeNum属性,此处的Person.eyeNum将输出2
        System.out.println("Person的eyeNum类属性值:" + Person.eyeNum);
        Person p2 = new Person();
        //p2访问的eyeNum类属性依然引用Person类的,因此依然输出2
        System.out.println("p2对象的eyeNum类属性值:" + p2.eyeNum);
    }
}

局部变量

说明
局部变量根据定义形式的不同,又可以分为如下三种:

  • 形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效
  • 方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到方法结束时失效
  • 代码块局部变量:在代码块中定义的局部变量,它的作用域是从定义该变量的地方生效,到代码块结束时失效

与成员变量不同的是,局部变量除了形参之外,都必须显式初始化,即必须先给方法局部变量和代码块局部变量指定初始值。

下面是局部变量的实例程序:

public class TestBlock
{
    public static void main(String[] args) 
    {
        //定义一个方法局部变量
            int b;
        //下面代码将出现错误,因为b变量还未初始化
            System.out.println("代码块局部变量b的值:" + b);
        //为b变量赋初始值,也就是进行初始化
            b = 5;
            System.out.println("代码块局部变量b的值:" + a);


        {
            //定义一个代码块局部变量a
            int a;
            //下面代码将出现错误,因为a变量还未初始化
            System.out.println("代码块局部变量a的值:" + a);
            //为a变量赋初始值,也就是进行初始化
            a = 5;
            System.out.println("代码块局部变量a的值:" + a);
        }
        //下面试图访问的a变量并不存在
        //System.out.println(a);
    }
}

Java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖的成员变量,则可以使用this关键字(对于实例Field)或类名(对于类Field)来访问该成员变量。

public class TestVariableOverride
{
    //定义一个name实例属性
    private String name = "李刚";
    //定义一个price类属性
    private static double price = 78.0;

    //主方法,程序的入口
    public static void main(String[] args) 
    {
        //方法里的局部变量,局部变量覆盖成员变量
        int price = 65;
        //直接访问price变量,将输出price局部变量的值:65
        System.out.println(price);
        //使用类名来作为price变量的限定,将输出price类属性的值:78.0
        System.out.println(TestVariableOverride.price);
        //运行info方法
        new TestVariableOverride().info();
    }

    public void info()
    {
        //方法里的局部变量,局部变量覆盖成员变量
        String name = "孙悟空";
        //直接访问name变量,将输出name局部变量的值:"孙悟空"
        System.out.println(name);
        //使用this来作为name变量的限定,将输出price实例属性的值:"李刚"
        System.out.println(this.name);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值