很抱歉,最近事忙,所以很少有时间上来写东西,希望大家见谅。
今天有点偷懒,简单地给大家介绍一下变量的定义。
什么是变量,简单来说就是一个地址指针,而且这个指针的内容应该是可变的。而变量的作用就是给我们在写程序的时候临时存储要处理的数据。
在java里面,变量的定义如下:
[包路径.]类型名 变量名 [= 值];
一个真实的变量命名例子如下:
如果用人类的语言来描述上面的代码,可以解释为新创建一个java.util.Date对象地址块,存储到一个today的指针里面,并且today地址段里面保存的内容只能是java.util.Date的数据。
如果我们想省掉包路径,就只能够在java的文件头,package语句后面,class语句外面写以下一句:
例如上例:
凡是引用非本包路径(跟当前class所在的package不相同)的类时,都需要使用import引用或者要声明类的包名。就好像我们去拜访别人家的时候需要先知道他的住址一样。但是,在java里面,只要是来自java.lang的所有类都不需要列出包名就可以直接引用,它是默认被引入到所有类里面的。
谈到变量,就很自然会关心到它的作用域。根据作用域,我们可以分为局部变量(variable)和字段(field)。局部变量指在代码段里或者方法里面被临时创建出来的中间变量,这些变量通常在跳出代码段或者方法体之后就会被GC回收,[b]除非这个变量还在被其它对象引用中[/b]。这部分内容我们在说弱引用的时候会涉及到。
好了,来看看field和variable的区别:
在上面的代码中,会有两个错误,第一个是在aMethod()里面的String aField = "test" 另外一个是System.out.println(var2);
第一个错误,是因为变量不能和字段重名。因为jre很难知道同一个类里面相同名字的两个指针,哪个是来自于类本身的字段,哪个是方法的变量。另外,同一个地址段的变量名也不能相同。比如这样写也是不对的:
这样就会报错。
另一个错误,就是后面的System.out.println(var2)。因为程序出了for循环之后,var2的声明就被gc了解了,我们无法再找回它的地址指针,即使它可能仍然存在于内存中!
为什么要了解变量的作用范围呢?这跟赋值有关。
首先,说说怎么为变量赋值,很简单,和定义变量的时候有点类似:
唯一的不同就是没了变量名前的指针类型定义,对吧?
由于字段是一个类的全局变量,所以它可以保持夸方法的值,例如:
上面就是我们著名的JavaBean字段写法,一个字段,配有一个getter方法和setter方法。通过这两个方法,外部可以存储一些特定的数据到一个实例里面,并且可以随时调用会最后存储的数据。而且不同实例由于其内存段的独立也可以保证同一个字段的值不会被交叉引用到,从而发生一些多线程的问题。
field字段作为全局变量,可以在整个类地址中共享,而且大家可以看到其定义需要多一个modifier,可以指示除了实例本身,还有谁可以对其进行修改。例如上面的例子,我们可以改造成
但是这样太危险,所以一般情况下我们都不建议大家把字段定义为public的,只建议定义为private或者protected的。
同样,变量的定于,无论是field还是variable,都允许使用final,而static只允许在field定义的时候使用。而当我们把field同时定义为static和final的时候我们就会叫它做常量,它的命名规则必须是使用全大写,并且单词之间用下划线区别。
上例里面,第一个是一个常量的定义方式。第二个例子是一个常见的对方法参数变量定义为final的用法,这样可以防止方法中途因为不小心而把敏感的输入参数给修改了。在上例中,username的赋值会出错,原因是两个方法参数不允许修改,地址已经给锁住了。
今天内容到此结束,因为有点仓促可能写得不太好,我稍后再修改一下吧。。。
明天我们要说this和super这两个指针内建指针。
今天有点偷懒,简单地给大家介绍一下变量的定义。
什么是变量,简单来说就是一个地址指针,而且这个指针的内容应该是可变的。而变量的作用就是给我们在写程序的时候临时存储要处理的数据。
在java里面,变量的定义如下:
[包路径.]类型名 变量名 [= 值];
一个真实的变量命名例子如下:
java.util.Date today = new java.util.Date();
如果用人类的语言来描述上面的代码,可以解释为新创建一个java.util.Date对象地址块,存储到一个today的指针里面,并且today地址段里面保存的内容只能是java.util.Date的数据。
如果我们想省掉包路径,就只能够在java的文件头,package语句后面,class语句外面写以下一句:
import 包路径.[类|*];
例如上例:
package ...;
import java.util.Date;
...
Date today = new Date();
凡是引用非本包路径(跟当前class所在的package不相同)的类时,都需要使用import引用或者要声明类的包名。就好像我们去拜访别人家的时候需要先知道他的住址一样。但是,在java里面,只要是来自java.lang的所有类都不需要列出包名就可以直接引用,它是默认被引入到所有类里面的。
谈到变量,就很自然会关心到它的作用域。根据作用域,我们可以分为局部变量(variable)和字段(field)。局部变量指在代码段里或者方法里面被临时创建出来的中间变量,这些变量通常在跳出代码段或者方法体之后就会被GC回收,[b]除非这个变量还在被其它对象引用中[/b]。这部分内容我们在说弱引用的时候会涉及到。
好了,来看看field和variable的区别:
package vardemo;
public class VarDemo
{
//这是一个field
public String aField;
static{
//这是这个静态代码段的临时变量
String var = "I'm a var in static segment!";
}
//一段走出这个代码段,上面的var变量就会不可用,但是aField仍然可用
public void aMethod()
{
String var = "I'm another var for this method!";
String aField = "test";
for(int i=0;i<10;i++)
{
String var2 = "tmp var in for loop";
}
System.out.println(var);
System.out.println(var2);
}
}
在上面的代码中,会有两个错误,第一个是在aMethod()里面的String aField = "test" 另外一个是System.out.println(var2);
第一个错误,是因为变量不能和字段重名。因为jre很难知道同一个类里面相同名字的两个指针,哪个是来自于类本身的字段,哪个是方法的变量。另外,同一个地址段的变量名也不能相同。比如这样写也是不对的:
public void aMethod()
{
String var = "test";
String var = "test";
}
这样就会报错。
另一个错误,就是后面的System.out.println(var2)。因为程序出了for循环之后,var2的声明就被gc了解了,我们无法再找回它的地址指针,即使它可能仍然存在于内存中!
为什么要了解变量的作用范围呢?这跟赋值有关。
首先,说说怎么为变量赋值,很简单,和定义变量的时候有点类似:
变量名 = 值;
唯一的不同就是没了变量名前的指针类型定义,对吧?
由于字段是一个类的全局变量,所以它可以保持夸方法的值,例如:
public class Person
{
private String name;
public void setName(String aName)
{
name = aName;
}
public String getName()
{
return name;
}
public static void main(String[] args){
Person p = new Person();
p.setName("JJ");
System.out.println(p.getName());
}
}
上面就是我们著名的JavaBean字段写法,一个字段,配有一个getter方法和setter方法。通过这两个方法,外部可以存储一些特定的数据到一个实例里面,并且可以随时调用会最后存储的数据。而且不同实例由于其内存段的独立也可以保证同一个字段的值不会被交叉引用到,从而发生一些多线程的问题。
field字段作为全局变量,可以在整个类地址中共享,而且大家可以看到其定义需要多一个modifier,可以指示除了实例本身,还有谁可以对其进行修改。例如上面的例子,我们可以改造成
public class Person
{
public String name;
public static void main(String[] args){
Person p = new Person();
p.name="JJ";
System.out.println(p.name);
}
}
但是这样太危险,所以一般情况下我们都不建议大家把字段定义为public的,只建议定义为private或者protected的。
同样,变量的定于,无论是field还是variable,都允许使用final,而static只允许在field定义的时候使用。而当我们把field同时定义为static和final的时候我们就会叫它做常量,它的命名规则必须是使用全大写,并且单词之间用下划线区别。
private static final String A_CONSTANT = "I'm a constant and I can never be changed".
public login(final String username,final String password)
{
username = "I'm trying to make it dirty";
....
}
上例里面,第一个是一个常量的定义方式。第二个例子是一个常见的对方法参数变量定义为final的用法,这样可以防止方法中途因为不小心而把敏感的输入参数给修改了。在上例中,username的赋值会出错,原因是两个方法参数不允许修改,地址已经给锁住了。
今天内容到此结束,因为有点仓促可能写得不太好,我稍后再修改一下吧。。。
明天我们要说this和super这两个指针内建指针。