zoukankan      html  css  js  c++  java
  • [javase学习笔记]-6.4 成员变量与局部变量

    前面我们学习了类的定义,我们不难理解,定义类事实上就是在定义类中的成员.

    成员包含成员变量和成员函数.

    说到成员变量,我们非常自然会想到前面提到过的局部变量,那么它们之间有什么差别呢?

    首先我们定义一个People类:

    class People//定义一个People类
    {
    	String name;//姓名属性
    	int age;//年龄属性
    	char sex;
    	void run()//跑的方法
    	{
    		System.out.println(name+"開始跑步了.");
    	}
    	void information()
    	{
    		System.out.println("姓名:"+name+";
    性别:"+sex+";
    年龄:"+age+".");
    	}
    }
    


    然后我们从四个方面来分析下这两种变量的差别.


    1.从它们的定义环境来分析,我们看一段代码.

    class PeopleTest 
    {
    	public static void main(String[] args) 
    	{
    		People kobe = new People();//创建一个People的对象kobe
    		String name = "jordan";
    		int age = 49;
    		char sex = '男';
    		kobe.name = "KOBE";
    		kobe.age = 37;
    		kobe.sex = '男';
    		kobe.information();
    		kobe.run();
    	}
    }
    我们能够看到People类中我们定义了name,age,sex这三个变量就是成员变量;而在main方法中我们定义了kobe,name,age,sex这四个变量都是局部变量,那么非常明显就看出了它们的不同之处:

    成员变量定义在类中,整个类中都能够訪问.

    局部变量定义在函数,语句,局部代码块中,仅仅在所属区域有效.


    2,从它们在内在中存放形式来分析:

    联系上一节以及4.3节的函数的内存分配两节我们非常自然知道这两种变量的差别在于:

    成员变量存在于堆内存的对象中.

    局部变量存在于栈内存的方法中.


    3,从它们的默认初始化来分析,我们执行上面的代码:

    class PeopleTest 
    {
    	public static void main(String[] args) 
    	{
    		People kobe = new People();//创建一个People的对象kobe
    		String name = "jordan";
    		int age = 49;
    		char sex = '男';
    		kobe.name = "KOBE";
    		kobe.age = 37;
    		kobe.sex = '男';
    		kobe.information();
    		kobe.run();
    		System.out.println("name:"+name+";
    sex:"+sex+";
    age:"+age+".");
    	}
    }
    结果例如以下:

    我们再把该代码稍做改动:

    class PeopleTest 
    {
    	public static void main(String[] args) 
    	{
    		People kobe = new People();//创建一个People的对象kobe
    		String name;
    		int age;
    		char sex;
    		kobe.name = "KOBE";
    		kobe.age = 37;
    		kobe.sex = '男';
    		kobe.information();
    		kobe.run();
    		System.out.println("name:"+name+";
    sex:"+sex+";
    age:"+age+".");
    	}
    }
    结果:

    我们看出一个非常显然的差别就是:

    成员变量都有默认初始化值.

    局部变量没有默认初始化值.

    所以我们在定义成员变量时,假设我们须要特定的初始值,我们就一定要显性初始化详细值.对于局部变量,假设我们不初始化,当操作该变量时编译会提示未初始化的错误.

    4.从它们的生命周期来分析,我们再对上面的代码进行一下改动:

    class PeopleTest 
    {
    	public static void main(String[] args) 
    	{
    		People kobe = new People();//创建一个People的对象kobe
    		String name = "jordan";
    		{
    			int age = 49;
    			char sex = '男';
    			System.out.println("name:"+name+";
    sex:"+sex+";
    age:"+age+".");//能够打印出三个局部变量的值
    		}
    		kobe.name = "KOBE";
    		kobe.age = 37;
    		kobe.sex = '男';
    		kobe.information();
    		kobe.run();
    		System.out.println("name:"+name+";
    sex:"+sex+";
    age:"+age+".");//报错,找不到sex和age这两个变量
    	}
    }
    结果:

    而当我们把最后一句打印语句凝视之后的结果:


    我们能够看到:

    成员变量随着对象的创建而存在,随着对象的消失而消失.

    局部变量随着所属区域的执行而存在,随着所属区域的结束而释放.


    最后,我们再来看一个比較须要注意的地方,那就是成员变量和局部变量的同名情况.

    我们把People类改动一下:

    class People//定义一个People类
    {
    	String name;//姓名属性
    	int age;//年龄属性
    	char sex;
    	void run()//跑的方法
    	{
    		System.out.println(name+"開始跑步了.");
    	}
    	void information()
    	{
    		String name = "JAMES";
    		int age = 29;
    		char sex = '女';
    		System.out.println("姓名:"+name+";
    性别:"+sex+";
    年龄:"+age+".");
    	}
    }
    结果:

    我们看到在打印出了局部变量的值,这是因为局部变量在栈的方法中,程序会把值直接赋值给局部变量,假设当在栈中找不到,则到堆内存中寻找指定的成员变量.这一点在以后的操作中一定要小心.

    成员变量都有默认初始化值.

    局部变量没有默认初始化值.

  • 相关阅读:
    一元运算符重载 前置和后置++ --(这种一般用成员函数来实现重载)
    运算符中的二元重载,为什么要调用友元函数而不是全局函数的问题
    关于数组的封装不知道为什么错了,具体代码如下
    关于对象的动态建立和释放
    关于构造函数中调用构造函数的危险
    关于析构函数,构造函数匿名对象的总结,以厚忘了,可以回来观看很全
    关于深拷贝和浅拷贝的疑问
    构造函数的调用大全
    构造函数的调用(其中不包括赋值构造函数)
    LeetCode:Add Digits
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8946966.html
Copyright © 2011-2022 走看看