Java再谈_变量

Posted keathblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java再谈_变量相关的知识,希望对你有一定的参考价值。

1. 变量里存的什么

Java通过[类型 变量名]的方式声明了一个变量。

当我们声明一个变量的时候,相当于在内存中为它指定了一个地址,通过变量我们可以访问到它代表的这块内存空间。

我们可以理解成,变量里存的就是它代表的这块内存空间里存储的值。

  • 对于基本类型的变量来说,存的就是其具体的数值、字符或布尔值。
  • 而对于引用类型(对象)来说,存的是能够访问这个对象的内存地址,通过这个地址,我们可以访问到对象实际的内存,从而对它进行操作。

技术图片

int a;// 这时只声明了一个变量,还没有初始化,Java是不能使用未初始化的变量的。
int b = 10;// 在声明变量的同时对它进行初始化。
Object c = new Object();// 声明了一个对象类型的变量,并通过new操作符创建了一个Object类型的实例,并将这个实例的引用赋给了变量c。

2. 变量的区别

Java中的变量,根据作用域不同,可以分为三类:

  1. 静态变量:静态变量属于类,同时,所有该类的实例都可以访问这个变量。
  2. 实例变量:实例变量属于实例所有,不同实例持有自己的实例变量,互不影响。
  3. 局部变量:局部变量为方法块中的变量,方法块执行完毕,则变量销毁。

默认值

如果不对变量进行初始化,Java不会给局部变量指定默认值,对静态变量和实例变量会指定初始值。

数值型为0,布尔型为false,引用型为null。

3. 变量传给方法的是什么

这里首先明确一个概念。

方法签名里的参数叫做形参,它们相当于只声明而没有初始化的变量。

调用方法时,括号里的参数叫做实参

调用方法的过程。

  1. 按照方法名和传递进来的参数列表,找到对应的方法签名。
  2. 用你传递进来的实参的拷贝给对应的形参赋值。
  3. 执行方法中的代码。

有这么一句话,对于学习Java的人来说是比较熟悉的。

基本类型传递值,类类型传递引用。(引用是什么?就是地址啊,通过它可以访问对象啊。)


打个比方,声明一个变量,相当于开了个房(咳!咳咳咳!)。

基本类型的变量,存进去的就是个娃娃(0101这种二进制数);而类类型呢,存进去的是一个钥匙(地址)。

当把变量当做实参传递给方法的时候,基本类型给了你一个娃娃的复制品,而类类型给了你一把复制的钥匙。实际上它们给你的都是他们房间里放的东西的复制品。(也就是变量内存中存的数据的拷贝)

对于基本类型来说你用的只不过这些房间里东西的复制品,所以,这些房间里方的东西该是什么还是什么。这就是为什么对于基本类型来说,在方法中怎么操作形参的值,都不会影响到外边实参的值。

再说说类类型哈,你拿到复制好的钥匙,去开了那个房间的门,发现里边是个美女......然后你改变了这个房间里的状态,当有人用房间里的钥匙开了这个房间的门之后,看到的肯定是你改变后的状态呀。这就是为什么当我们传递一个类类型给方法时,方法内部修改这个对象的属性时,会影响实参所代表的对象的原因。

有人说,我在方法内部再创建一个对象给形参,会不会影响外面的实参呢?当然不会,你只不过是换了一把钥匙而已,不影响实参房间中存的那把钥匙。


有点乱,总结下:

  1. 对于传参,我的理解是,实参变量中存的是什么就传什么给方法。
  2. 修改形参的值,不会影响实参的值。
  3. 在方法内修改类类型的数据,可以对方法外的对象造成影响。
  4. 如果不想让方法内的操纵影响到实参代表的对象,可以传递一个对象的拷贝(一个与原有对象状态相同的新对象)给方法。

4. 变量的初始化顺序

在Java中有静态变量和实例变量。

静态变量的初始化可以在声明变量的同时初始化,也可以在静态代码块中初始化。这时会根据声明的顺序执行。

public static int a = 10;
static {
	a = 20;
}// 最终a = 20

static {
    b = 20;
}
public static int b = 10;// 最终b = 10

实例变量的初始化同理,不过比静态变量多一个在构造方法中初始化。构造方法是最后执行的,所以会以构造方法中的值为准。

引入继承

如果引入继承的话,执行的顺序为

  1. father static
  2. sun static
  3. father instance
  4. father construct
  5. sun instance
  6. sun construct

因为Java会先加载类,此时执行静态代码块中的内容。再执行父类的创建,最后执行子类的创建。

以上是关于Java再谈_变量的主要内容,如果未能解决你的问题,请参考以下文章

再谈 Java 的继承和超类 Object

Python面向对象编程第09篇 再谈类变量

Python面向对象编程第09篇 再谈类变量

再谈python的变量作用域

再谈类和对象

再谈闭包