Java再谈_变量
Posted keathblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java再谈_变量相关的知识,希望对你有一定的参考价值。
1. 变量里存的什么
Java通过[类型 变量名]的方式声明了一个变量。
当我们声明一个变量的时候,相当于在内存中为它指定了一个地址,通过变量我们可以访问到它代表的这块内存空间。
我们可以理解成,变量里存的就是它代表的这块内存空间里存储的值。
- 对于基本类型的变量来说,存的就是其具体的数值、字符或布尔值。
- 而对于引用类型(对象)来说,存的是能够访问这个对象的内存地址,通过这个地址,我们可以访问到对象实际的内存,从而对它进行操作。
int a;// 这时只声明了一个变量,还没有初始化,Java是不能使用未初始化的变量的。
int b = 10;// 在声明变量的同时对它进行初始化。
Object c = new Object();// 声明了一个对象类型的变量,并通过new操作符创建了一个Object类型的实例,并将这个实例的引用赋给了变量c。
2. 变量的区别
Java中的变量,根据作用域不同,可以分为三类:
- 静态变量:静态变量属于类,同时,所有该类的实例都可以访问这个变量。
- 实例变量:实例变量属于实例所有,不同实例持有自己的实例变量,互不影响。
- 局部变量:局部变量为方法块中的变量,方法块执行完毕,则变量销毁。
默认值
如果不对变量进行初始化,Java不会给局部变量指定默认值,对静态变量和实例变量会指定初始值。
数值型为0,布尔型为false,引用型为null。
3. 变量传给方法的是什么
这里首先明确一个概念。
方法签名里的参数叫做形参,它们相当于只声明而没有初始化的变量。
调用方法时,括号里的参数叫做实参。
调用方法的过程。
- 按照方法名和传递进来的参数列表,找到对应的方法签名。
- 用你传递进来的实参的拷贝给对应的形参赋值。
- 执行方法中的代码。
有这么一句话,对于学习Java的人来说是比较熟悉的。
基本类型传递值,类类型传递引用。(引用是什么?就是地址啊,通过它可以访问对象啊。)
打个比方,声明一个变量,相当于开了个房(咳!咳咳咳!)。
基本类型的变量,存进去的就是个娃娃(0101这种二进制数);而类类型呢,存进去的是一个钥匙(地址)。
当把变量当做实参传递给方法的时候,基本类型给了你一个娃娃的复制品,而类类型给了你一把复制的钥匙。实际上它们给你的都是他们房间里放的东西的复制品。(也就是变量内存中存的数据的拷贝)
对于基本类型来说你用的只不过这些房间里东西的复制品,所以,这些房间里方的东西该是什么还是什么。这就是为什么对于基本类型来说,在方法中怎么操作形参的值,都不会影响到外边实参的值。
再说说类类型哈,你拿到复制好的钥匙,去开了那个房间的门,发现里边是个美女......然后你改变了这个房间里的状态,当有人用房间里的钥匙开了这个房间的门之后,看到的肯定是你改变后的状态呀。这就是为什么当我们传递一个类类型给方法时,方法内部修改这个对象的属性时,会影响实参所代表的对象的原因。
有人说,我在方法内部再创建一个对象给形参,会不会影响外面的实参呢?当然不会,你只不过是换了一把钥匙而已,不影响实参房间中存的那把钥匙。
有点乱,总结下:
- 对于传参,我的理解是,实参变量中存的是什么就传什么给方法。
- 修改形参的值,不会影响实参的值。
- 在方法内修改类类型的数据,可以对方法外的对象造成影响。
- 如果不想让方法内的操纵影响到实参代表的对象,可以传递一个对象的拷贝(一个与原有对象状态相同的新对象)给方法。
4. 变量的初始化顺序
在Java中有静态变量和实例变量。
静态变量的初始化可以在声明变量的同时初始化,也可以在静态代码块中初始化。这时会根据声明的顺序执行。
public static int a = 10;
static {
a = 20;
}// 最终a = 20
static {
b = 20;
}
public static int b = 10;// 最终b = 10
实例变量的初始化同理,不过比静态变量多一个在构造方法中初始化。构造方法是最后执行的,所以会以构造方法中的值为准。
引入继承
如果引入继承的话,执行的顺序为
- father static
- sun static
- father instance
- father construct
- sun instance
- sun construct
因为Java会先加载类,此时执行静态代码块中的内容。再执行父类的创建,最后执行子类的创建。
以上是关于Java再谈_变量的主要内容,如果未能解决你的问题,请参考以下文章