JAVA语言程序设计 - 第二章

『JAVA语言基础』
 
变量、数据类型、运算符、表达式、控制流程
Java使用传统程序设计的特性,其中包括变量、运算和流程控制语句等,Java与C C++相似,其中抛弃了一些不合理的部分,主要有

 

  • 全局变量       Java中不能在任何类之外定义全局变量,只能通过在一个类中定义公用、静态、的变量来实现一个类中的全局变量
  • Goto语句      Java不支持C、C++中的GOTO语句,而是通过例外处理语句 try catch、final等来代替C中用goto处理遇见错误时跳转的情况
  • 指针             指针是C  C++中最灵活,也是最容易出错的数据类型。JAVA不支持指针操作,但通过引用等特性实现了指针功能及其灵活性。
  • 内存管理       C是用Malloc()和free()来分配和释放内存,而C++是通过new()和Delete()来进行的。JAVA语言自动完成内存垃圾回收的工作。

 

 『变量和数据类型』

  • Java强类行语言,每个变量都必须要有一个数据类型
  • 变量是用标识符号命名的数据项,是程序过程中可以改变的值。在使用前必须先声明,声明内容包括变量类型和变量名,变量声明的位置决定它的作用域。变量名必须是合法的标识符,不能说一个关键字或者保留字,在用以作用域中必须是唯一的。
  • 标识符由字母、下划线、美元符、和数字组成,且第一个字符不可以是数字。
  • JAVA中提供两种数据类型:简单型和引用型。简单数据类型包括整数型、实数型、字符型 和布尔型。引用类型可使用一个引用变量得到它的值或者得到由它所表示的值的集合的一种类型,而使用简单类型变量得到的是该变量的真实值
  • JAVA语言不支持C  C++中的三种数据类型:指针、结构、和联合。这三中结构在JAVA中由引用和类等来代替。
  • 变量在使用前要进行初始化,可以在声明时进行也可以利用赋值语句,方法的参数和异常处理的参数只能通过调用时的设置来初始化。
    final变量可以声明在任何作用域,final变量的值不能在初始化后进行改变

实数:double、float 

整数:byte、short、int、long

字符:char

布尔值:boolean 

 


 int:int为整数类型,在存储的时候,用4个字节存储,范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。

 

short:short也属于整数类型,在存储的时候,用2个字节存储,范围为-32,768到32,767,在变量初始化的时候,

 

short类型的默认值为0,一般情况下因为Java本身转型的原因,可以直接写为0。

 

long:long也属于整数类型,在存储的时候,用8个字节存储,范围为-9,223,372,036,854,775,808到9,223,372,036, 854,775,807,

 

在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。

 

byte:byte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128到127,在变量初始化的时候,byte类型的默认值也为0。

 

float:float属于实数类型,在存储的时候,用4个字节来存储,范围为32位IEEEE 754单精度范围,在变量初始化的时候,

 

float的默认值为0.0f或0.0F,在初始化的时候可以写0.0。

 

double:double同样属于实数类型,在存储的时候,用8个字节来存储,范围为64位IEEE 754双精度范围,在变量初始化的时候,double的默认值为0.0。

 

char:char属于字符类型,在存储的时候用2个字节来存储,因为Java本身的字符集不是用ASCII码来进行存储,是使用的16位Unicode字符集,它的字符范围即是Unicode的字符范围,在变量初始化的时候,char类型的默认值为'u0000'。

 

boolean:boolean属于布尔类型,在存储的时候不使用字节,仅仅使用1位来存储,范围仅仅为0和1,其字面量为true和false,

 

而boolean变量在初始化的时候变量的默认值为false。

 

自动拆箱

 

Java里面,每一种原始类型都对应着相应的包装类型,在JDK1.5之前(不包含JDK1.5),当包装类和原始类型进行相互转换的时候,需要调用包装类型的方法进行转换,不能通过操作符进行直接的计算。JDK 1.5以后提供了自动拆箱和自动装箱的功能,下边是一个原始类型和包装类型的一个对应表:

原始类型 对应的包装类型 默认值 存储格式 数据范围
short java.lang.Short 0 2个字节 -32,768到32767
int java.lang.Integer 0 4个字节 -2,147,483,648到2,147,483,647
byte java.lang.Byte
0 1个字节 -128到127
char java.lang.Character \u0000 2个字节 Unicode的字符范围
long java.lang.Long 0L或0l 8个字节

-9,223,372,036,854,775,808到

9,223,372,036, 854,775,807

float java.lang.Float 0.0F或0.0f 4个字节 32位IEEEE 754单精度范围
double java.lang.Double 0.0或0.0D(d) 8个字节 64位IEEE 754双精度范围
boolean java.lang.Boolean false 1位 true(1)或false(0)

自动拆箱的意思就是不需要经过用户手工编程,编译器会直接识别包装类和原始类型相互之间的转换以及运算,并且把包装类型拆成原始类型进行代码里面 规定的数值运算或者其他操作,这功能JDK的最低支持版本是1.5。其实对Java语言本身而言,Integer这种封装类实际上就是Java里面继承于 Object的类的对象实例,只是在1.4之前,必须调用方法xxxValue()来完成手工拆箱的操作,只是这个在JDK 1.5不会有此限制

 
Java里面的类型转换包括两种:自动转换(隐式转换);强制转换(显示转换)
自动转换
条件:A.这两种类型是兼容的;B.目的类型数的范围(位数)比来源类型的大
当以上2个条件都满足的时候,拓宽转换(widening conversion)就会自动发生,例如,int类型范围比所有byte类型的合法范围大,因此不要求显示的强制转换语句。对于拓宽转换,兼容程度可以看下边的继承树:
  java.lang.Object
  |—java.lang.Boolean
  |—java.lang.Character
  |—java.lang.Number
    |—java.lang.Byte
    |—java.lang.Float
    |—java.lang.Integer
    |—java.lang.Long
    |—java.lang.Short
    |—java.lang.Double
从上边的继承树可以可以看到,Boolean类型、Character类型、Number类型是两两不兼容的,所以在隐式转换的过程,不兼容的类型是不能进行自动类型转换的
  

强制转换

尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。如果2种类型是兼容的,那么Java 将自动地进行转换。例如,把int 类型的值赋给long 类型的变量,总是可行的。然而,不是所有的类型转换都是可以隐式实现的。有时必须使用一个强制类型转换,通用格式如下: 

(target-type)value 

 在强制转换过程,唯独可能特殊的是charint是可以转换的,不过会使用charASCII码值比如:

 nt a = (int)'a';

 a的值在转换过后输出的话,值为97

 

类型的自动提升,遵循的规则 

所有的byteshortchar类型的值将提升为int类型;

如果有一个操作数是long类型,计算结果是long类型;

如果有一个操作数是float类型,计算结果是float类型;

如果有一个操作数是double类型,计算结果是double类型;

 

Java的基本类型几点补充说明:

  • char类型是无符号16位整数,子面值必须用单引号括起来,如:'a'
  • String在Java里面是类,直接父类是java.lang.Object,所以String不属于Java里面的原始类型
  • 长整数字有一个后缀为“L”或者“l”,八进制数字前缀为“0”,十六进制的前缀为“0x”
  • 默认的基本浮点类型为double
  • float数据类型有一个后缀为“F”或“f”,Double数据类型后边可以跟“D”或者“d”,也可以不跟
  • char类型可以使用通用的转义字符,但是不是ASCII码,应该是Unicode格式的如'\u0000'
 
posted @ 2010-06-09 00:06  Neo.  阅读(464)  评论(0编辑  收藏  举报