[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+";\n性别:"+sex+";\n年龄:"+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+";\nsex:"+sex+";\nage:"+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+";\nsex:"+sex+";\nage:"+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+";\nsex:"+sex+";\nage:"+age+".");//能够打印出三个局部变量的值
		}
		kobe.name = "KOBE";
		kobe.age = 37;
		kobe.sex = ‘男‘;
		kobe.information();
		kobe.run();
		System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+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+";\n性别:"+sex+";\n年龄:"+age+".");
	}
}

结果:

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

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

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

原文地址:https://www.cnblogs.com/zhchoutai/p/8946966.html

时间: 2024-10-23 17:34:15

[javase学习笔记]-6.4 成员变量与局部变量的相关文章

[javase学习笔记]-8.2 成员变量与静态变量的差别

这一节我们看一看成员变量与静态变量的差别所在. 什么是静态变量呢?我们上节用statickeyword时就提到了静态变量.也就是说用statickeyword修饰的变量就是静态变量. 我们在6.4节学习了成员变量与局部变量的差别.这一节我们重点看看成员变量与静态变量之间的差别. 我们看代码: class Person { String name;//姓名,这是一个成员变量 static String country = "中国";//国籍,这是一个静态变量 public void pr

疯狂java学习笔记之面向对象 - 成员变量与局部变量

Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的特点: 没有创建实例前是不会分配内存空间的: 从有实例开始,实例变量就存在了: 实例被销毁,实例变量就不存在了: 0~N个实例变量,程序每创建一个实例,系统就为该实例分配一块内存 类变量的特点: 从有类开始,类变量就存在了,一个JVM中类信息只要一个即可. 每个JVM最多只加载一个类一次,系统就为该

JavaSE学习笔记(二)——变量和数据类型

一.  Java中的变量 1.1           字面值的概念 字面值是内存中的一块空间,这块空间存放有值,并且这个值是有类型的.如:在内存中的某个空间存放着100的值,类型是整型.在内存的另一个空间存放着true,代表真,是布尔类型. 例子:字面值举例 public class VariableTest01 { public  static void main(String[] args){ //  整型字面值 System.out.println(100); //  字符串类型字母值 S

Java基础学习-extends继承(成员变量,局部变量,成员方法)

package extend; /*面向对象-继承: * 多个类的共同成员变量和成员方法.抽取到另一个类中(父类),我们多个类就可以访问到父类的成员了 * */ class Game{ String name; double vesion;//版本号 String agent;//代理商 public void start() { System.out.println("游戏启动"); } public void stop() { System.out.println("游戏

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

javascript学习笔记---ECMAScript语法(变量)

变量声明关键字var: var i = 1: var t = "asd"; var test1 = "hi", test2 = "hello"; 声明变量不一定要初始化, var i;//ok 另一方面在使用变量前若未加关键字var,则此变量为全局变量(此特性需特别记住). 变量名字: 变量名需要遵守两条简单的规则: 第一个字符必须是字母.下划线(_)或美元符号($) 余下的字符可以是下划线.美元符号或任何字母或数字字符 命名变量规则: Came

C++学习笔记29,引用变量(1)

引用变量在创建的时候就必须初始化.无法创建一个未被初始化的引用. #include <iostream> using namespace std; int main() { int x=10; int y=20; int &r1; } 编译结果: 如果引用未被初始化,编译将报错. 修改引用: 引用总是指向初始化的那个变量,也就是说,引用一旦被创建并初始化之后就无法改变.这一规则有点让人迷惑.. 如果声明了一个引用的同时使用一个变量赋值了,那么这个引用就会一直指向这个变量. 在此后使用变

[Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

在类中,变量根据定义的位置不同,可以分为成员变量和局部变量. 成员变量是在类体内,方法之外定义的变量,局部变量是在方法中定义的参数. 成员变量 成员变量分为类属性和实例属性,定义时没有static修饰的称为实例属性,有static修饰的称为类属性,类属性和实例属性的区别就是类属性是属于类的,它并不属于哪一个对象,它从这个类的准备阶段就一直存在,一直到这个类完全销毁.实例属性属于对象,只有某个对象被创建时,它才被创建,对象被回收,从属于该对象的实例属性也就被销毁了. 类属性的定义语法: [修饰符]

[javase学习笔记]-7.6 this关键字之原理

这一节我们来讲一个关键字,就是this关键字. 我们还是通过例子来看吧: class Person { private String name; private int age; Person(String n,int a) { name = n; age = a; } public void speak() { System.out.println(name+":"+age); } } class ThisTest { public static void main(String[]