[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+".");
}
}
结果:
我们看到在打印出了局部变量的值,这是因为局部变量在栈的方法中,程序会把值直接赋值给局部变量,假设当在栈中找不到,则到堆内存中寻找指定的成员变量.这一点在以后的操作中一定要小心.
成员变量都有默认初始化值.
局部变量没有默认初始化值.
[javase学习笔记]-6.4 成员变量与局部变量的更多相关文章
- [javase学习笔记]-8.2 成员变量与静态变量的差别
这一节我们看一看成员变量与静态变量的差别所在. 什么是静态变量呢?我们上节用statickeyword时就提到了静态变量.也就是说用statickeyword修饰的变量就是静态变量. 我们在6.4节学 ...
- java笔记13之成员变量与局部变量
成员变量和局部变量的区别 1在类中的位置不同 局部变量:类的方法体内 成员变量:类的方法之外 2内存的不同位置 局部变量:在栈内存中 成员位置:在堆内存 3生命周期不同 局部变量:随着方法的调用而存在 ...
- Java基础学习-extends继承(成员变量,局部变量,成员方法)
package extend; /*面向对象-继承: * 多个类的共同成员变量和成员方法.抽取到另一个类中(父类),我们多个类就可以访问到父类的成员了 * */ class Game{ String ...
- Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序
当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...
- Java学习笔记十五:Java中的成员变量和局部变量
Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...
- 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量
Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...
- javaSE学习笔记(15) ---缓冲流、转换流、序列化流
javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...
- JavaSE学习笔记(13)---线程池、Lambda表达式
JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...
- JavaSE学习笔记(12)---线程
JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
随机推荐
- hadoop 基础视频1
hadoop 基础视频1 一, 大致内容: 1, 源起与体系结构2,实施Hadoop 集群3,分布式HDFS, 大数据存储实战4,Map-Reduce 体系架构5,Map-Reduce 数据分析之一 ...
- [Java]MyBatis框架
在这里学习 >>mybatis 简介和入门[视频免费观看] >>http://legend2011.blog.51cto.com/3018495/908956[MyBatis学 ...
- jQuery.fn.extend()和jQuery.extend()
jQuery.fn.extend( object ) 一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法. jQuery.fn.extend()方法继承了jQuery原型($.fn ...
- AtomicReference,AtomicStampedReference与AtomicMarkableReference的区别
AtomicReference 通过volatile和Unsafe提供的CAS函数实现原子操作. 自旋+CAS的无锁操作保证共享变量的线程安全 value是volatile类型,这保证了:当某线程修改 ...
- 二分法(折半查找法)小demo
使用此算法,必须有一个前提,那就是数组必须是有序的. package com.ly.tcwireless.international.test; import org.junit.Test; publ ...
- Nginx报Primary script unknown的错误解决
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 改成红色部分变量 root /usr/local/nginx/h ...
- LPC43xx SGPIO Configuration -- Why not use GPDMA ?
LPC43xx SGPIO Configuration The LPC43xx SGPIO peripheral is used to move samples between USB and the ...
- mui选择器和dom获取元素的区别(记得把mui对象转为dom对象才能调用用dom方法)
<!DOCTYPE html><html> <head><meta charset="UTF-8"><meta name=&q ...
- [Go] 编码规范
gofmt 大部分的格式问题可以通过 gofmt 解决,gofmt 自动格式化代码,保证所有的Go代码与官方推荐的格式保持一致,于是所有格式有关问题,都以 gofmt 的结果为准. 注释 在编码阶段应 ...
- 采用模拟账号读取Exchange server未读邮件的注意事项(链接邮箱问题)【转】
最近做项目碰到Exchange中,用EWS API方法读取的未读邮箱(ConnectingIdType.PrincipalName设置该属性的方法)附带代码部分: 核心代码 using Microso ...