事物的属性--变量和常量
属性是由数据表示的
我们在表示一个对象的时候,只是在计算机中模拟出这个对象的模型。但是计算机只能处理和识别数字,也就是只能通过数字将对象的属性表示出来。
数据是多样的
既然我们必须要把属性转换为数据形式交给计算机,就必须先来看看计算机都可以吃哪些套路的数字类型,也就是要投其所好嘛。
其实在现实生活中的对象也是对应不同类型的属性。比如一个灯泡,它的电压是小数,他的螺纹数是整数,它的开关状态是布尔数。
呐,计算机可以处理的数字类型大致可以分为四类,分别为:整数、浮点数、字符型、和布尔型。
.。
计算机最原始的呆萌----01
二进制的数据,都懂,不是1就是0。人呢,有十个手指头,所以人使用的是十进制的数字。但是计算机是吃电的玩意,电嘛,就只有两个状态–接通和关断,就决定了计算机也只认识这两个状态。这就是你的视野有多大,你的格局就有多大,没错,计算机就是这有这麽大的格局。
但是我们要想跟计算机一起玩,那就得有把十进制转化为二进制的方法。
Java中不同类型的变量

小数的表示[^1]—浮点型
1.float类型:在普通的计算中,float类型可以满足需要,
2.double类型:如果不是真的有必要,并不建议盲目的使用double类型。
字母的表示—字符型
很显然,计算机斌不能直接的表示字母,哈哈哈。所以只有采用背后一套,当面一套的编码形式,每种不同的编码形式先定了一个明确的字符集。常见的字符集有
- ASCII
- unicode:Java中用的字符集。
Java中字符型变量的类型名为char。
数据的“包装”–基本类型的对象类型
对象有其对应的类,同样在数据这个方面。java的每一个数据的基本类型也有其对应的“类”,叫做对象包装器,可以说是基本类型所对应的对象类型。
整形的对象类型
- Integer
- 此外还有Long Short Character boolean
数据住在何处—Java的变量
类就相当于一个个饼干模子,由他可以定义一个个具体的变量,就像是用模子生产一个个饼干一样。也就是说呢,类是语言的特性,变量才是程序的主角。
先登记在入住—定义与初始化
变量定义的过程就是你去开房的过程 ,要定义的变量的类型就好比是房间的类型,要告诉计算机你需要一个甚麽样的变量,然后计算机安排一个存储这种类型的变量的空间,这就是服务员为你安排房间的过程。变量的名字就好比是房卡,后面所有变量的操作都是通过变量的名字来完成的。就像是服务员安排好一切之后,他会交给你一张房卡,通过这张房卡才能找到自己的房间,然后刷卡进入。对变量的复制就是你在宾馆里往自己的房间中放东西一样,用卡打开门,放东西进去,ok,搞定!!
Java的定义变量的语法为:
变量类型名 变量名;
上面介绍的只是基本类型变量,对于对象类型变量,情况就有所不同了
基本类型的变量的定义是直接表示存储数据的地址的,但对象类型的变量表示是他的一个引用。引用就是说它仅表示所存储的对象结构的一个首地址。
改变变量的值
这里要说的也就是赋值操作:
被赋值变量 = 值或者变量;
从上面的瞎说中可以知道,显然,基本类型变量在内存中为直接在变量名坐表示的地址中保存该变量的值。
上图中,整形变量int_1,int_2,int_3的值为有变方框中的数字。( 在实际的内存中,int类型的变量是要占用4个字节的存储空间的。)然后我们在Java中执行下面的赋值语句:
int_1 = 2222; //为int_1赋值2222
int_3 = int_2
不同精度的变量之间的赋值
变量之间的赋值关系可以总结如图:
图中,不同的变量可以向下赋值,相邻的不能赋值。
byte short int long ,float double up down!
变量的黑客帝国—克隆
-
克隆和赋值
赋值是个给某一变量指定一个值得操作。
克隆是把一个对象变成两个一模一样的对象。
给对象赋值时实际上没没有复制内存当中实际保存的内容,只是让不同的变量指向了同一个引用的首地址而已。 -
String类型,他在内存中存储的值是不能被改变的。同对象类型一样,String类型的变量只是代表指向一个特定的首地址的“引用”。
-
对象类型中会有一个名为clon|()的方法,他就是用来完成克隆操作的。
obj_2 = cbi_1.clon(); //将obj_1复制给obj_2
整个过程如图下,look一下:
-
什么时候使用clon呢
-
如果需要两个变量的值始终保持一致,那么使用赋值,因为他们所表示的实际上就是一个对象,里面的值肯定是一样的。
-
而克隆就是要防止这种“一致”。也就是说,当你要做某些操作,有可能破坏对象的属性值,最稳妥的办法就是先做一个备份—复制一个完全一样的保存下来。
变量的作用域
一个变量从它的定义开始作用。Java
Java支持在任何一个地方开始定义一个变量。其他语言比如某c就必须一下将变量的定义放在已给程序的开头。
- 变量的作用域,作用域说白了就是,这句话有多长!
就是从他的定义位置开始,知道定义所在的一堆大括号结束{}变量在大括号外就不可见了。
// An highlighted block
package zuo_yong_yu;
public class myClass_1 { /*定义一个myClass_1类型*/
int myInt_1=0;
int myInt_0;
public myClass_1(){
int myInt_2=1; /*构造方法中的myint_2定义*/
}
public int fun_1(){
int myInt_2=1;
return 0;
}
public static void main(String[] argv){
int myInt_2; /*main方法的myInt_2定义*/
{
int myInt_6;
int myInt_7;
}
for ( int myInt_5=0;myInt_5 < 10; myInt_5++ ) {
int myInt_7;
}
int myInt_9;
while ( true ) {
int myInt_8;
int myInt_3;
}
}
}
当用上面的的这个类型来定义他的对象时,再所定义的对象中,在函数main()和myClass_1()中都包含int类型的变量myInt_2。
很明显这两个变量在名称上完全一一致的,不同之处在于,他们在不同的函数中被定义的。。这使得两个函数的作用于不同,变量的定义在各自的函数范围之内有效,不会扩展到函数定义之外。
数据“接力赛”—变量作为函数参数
变量的作用域就是从它的定义开始,直至它所在的大括号结束。如果要在这个大括号中调用一个函数,函数的定义并没有在调用函数的那个大括号中,所以函数调用出的那些起作用的变量作用域不会延伸至所调用的函数中去。这就需要将函数的参数传递给它。
- 参数的传递过程
其实就是变量的赋值,因为它们的规则是完全一样的。
规则:对基本类型的变量复制是变量的值,而对于对象类型的变量,则复制的是他的首地址。
自动打包与解包
打包—Java自动将一个基本类型的变量变成一个和他的值相等的对象。实际上只是执行了下面的过程:
Integer myInteger = new Integer ( myInt );
Character myCharacter = new Character ( myChar );
Float myFloat = new Float( myFloat )
new是一个新生成的对象的语句 ,返回新对象的一个引用。
一定要记住,不同类型的变量是不可以直接进行赋值的,即使是在Java程序中可以这么写也不行,那是因为在这个赋值的过程中,Java对变量或数值的类型进行了自动转换,先将变量转换为目的变量的类型之后才进行赋值。
解包—就是将一个对象转换为他的基本类型的过程。
这个图上面提到过基本类型的变量只能想跟他对应类型的对象赋值,一个基本类型的变量不能够向其他数值类型的对象赋值,对于给对象赋值而言,变量不能向上面的图给出的金字塔那样来进行赋值,即使是方向对了也不行,可是对于自动解包来说,金字塔所给出的不同类型变量间的赋值方向,又能成立了。
不能改变值的"变量"—常量
变量和常量一模一样,除了不能被赋值,其他没有区别。
常量的用处
- 将一些难记得常数值转换为容易看得懂得、直观的变量名。
- 为经过量化,或用数字表示的事物赋予一个统一的、标准的名字。
- 为以后程序的修改与扩展提供便利。
常量的定义
在Java中,常量的定义与变量的定义只有两点区别:其一,要在变量类型的前面加上final关键字;其二,在定义之后只能被赋值一次。语法为:
常量类型 [= 常量值] //其中方括号的内容表示是可选的。
常量一旦被定义之后就不可以在改变了。
Java虽然已经很聪明,但并不是善解人意的家伙。
习题
int和Integer有什么区别?
答:Java提供两种不同的类型:引用类型和原始封装类型(或内置类型)。int是Java的原始数据类型,Integer是Java为int提供的封装类型,Java为每个原始类型提供类封装类。原始类型与他们的封装类型对应的关系为:boolean Boolean; char Charater;byte Byte;short Short;int Integer; long Long;float Float;double Double。引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的示例数据时所指定的默认值。对象引用实力变量的默认值为null,而原始类型实例变量的默认值与他们的类型有关。