[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)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
随机推荐
- [java] 虚拟机(JVM)底层结构详解[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本语法到 ...
- HDU 5842 Lweb and String 水题
Lweb and String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...
- 使用 IntraWeb (8) - 系统模板
我们可以自定义系统错误模板, 编辑 IWError.html 放到模板文件夹后, 它将替换默认的模板. {在主页面, 这是要模拟一个系统错误} procedure TIWForm1.IWButton1 ...
- spring cloud 学习(7) - 生产环境如何不停机热发布?
业务繁忙的系统,原则上是不允许停机的,那么问题来了,如果真有严重的bug要修复,不得不发布,怎么做到不停机发布,对业务无感知呢? eureka 提供了一系列rest url,可以对注册实例进行操作,比 ...
- 交叉编译Python-2.7.13到ARM(aarch64)平台
方法跟交叉编译Python-2.7.13到ARM(aarch32)平台基本一样, 不同的地方只是把工具链换成编译aarch64的工具链,这里可以参考用qemu搭建aarch64学习环境. 创建目录: ...
- What is the largest TCP/IP network port number allowable for IPv4
69 down vote The largest port number is an unsigned short 2^16-1: 65535 A registered port is one ass ...
- 用delphi实现完美屏幕截图
可以截取layered窗口(包括透明窗口)的代码: procedure CaptureScreen(AFileName: string);const CAPTUREBLT = $40000000;v ...
- iOS 获取本地视频的缩略图
+(UIImage *)getImage:(NSString *)videoURL { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSU ...
- 【mysql】sum处理null的结果
SELECT IFNULL() createSCNum, IFNULL() privateScNum FROM security_code_config WHERE tid = 'test_tenem ...
- Codeforces 394D Physical Education and Buns 胡搞
题目链接:点击打开链接 题意:给定n个数的序列(能够排序) 操作一次能够使得某个数++或--. 问最少操作几次使得序列变成一个等差序列 输出: 第一行输出最少操作的次数 第二行输出等差数列里的最小项 ...