标识符语法

  1)java中定义标识符格式以字母,数字,下划线,$符合组成,不能以数字开头,且不能为    

      java中的关键字。
    
      2)标识符意义要明确,不要乱起
    
      3)标识符区分大小写例如 z和Z是不同的两个标识符

   4)java常用关键字

 

                  Java中的关键字

abstract

assert

boolean

break

byte

case

catch

char

class

continue

const

default

do

double

else

extends

enum

final

finally

float

for

goto

if

implements

import

instanceof

int

interface

long

native

new

package

private

protected

public

return

short

static

synchronized

super

strictfp

this

throw

throws

transient

try

void

volatile

while 

 

数据类型分类和转换


四类

八种

字节数

数据表示范围

byte

1

-128~127


short

2

-32768~32767


int

4

-2147483648~2147483648


long

8

-263~263-1

浮点型

float

4

-3.403E38~3.403E38


double

8

-1.798E308~1.798E308

字符型

char

2

表示一个字符,如('a','A','0','家')

布尔型

boolean

1

只有两个值true与false

 

1)布尔

基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错

2)基本数据类型中数值类型的自动类型提升

图中依次表示了各数值类型的字节数和相应的取值范围。在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。

java 设置long常量 java定义long变量_java



1 public class TestCast {
2  5     
3  6     public static void main(String[] args) {
4  7         byte a = 1000;   // 编译出错 
5  8         float b = 1.5;   // 编译出错 
6  9         byte c = 3;      // 编译正确
7 10     }
8 11     
9 12 }



jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型),会进行判断,如果此int型数值超过数值类型k,那么会直接编译出错。因为你将一个超过了范围的数值赋给类型为k的变量,k装不下,你又没有进行强制类型转换,当然报错了。但是如果此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。如图中的虚线箭头。这一点有点特别,需要稍微注意下。

在其他情况下,当将一个数值范围小的类型赋给一个数值范围大的数值型变量,jvm在编译过程中俊将此数值的类型进行了自动提升

 

自动类型转换

 

表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换

自动类型转换格式:

范围大的数据类型 变量 = 范围小的数据类型值

强制类型转换格式

范围小的数据类型  变量 = (范围小的数据类型) 范围大的数据类型值;

 



1 public class TestCast {
 2  4 
 3  5     public static void main(String[] args) {
 4  6         byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换
 5  7         int  a = 3;
 6  8         byte b = a; // 编译出错
 7  9         byte c = (byte) a; // 编译正确
 8 10         float d = (float) 4.0;
 9 11     }
10 12 
11 13 }



 

区别在于前者3是直接量,编译期间可以直接进行判定,后者a为一变量,需要到运行期间才能确定,也就是说,编译期间为以防万一,当然不可能编译通过了。此时,需要进行强制类型转换。

 

3)其他情况



1 public class TestCast {
 2  4 
 3  5     public static void main(String[] args) {
 4  6         long a = 10000000000; //编译出错
 5  7         long b = 10000000000L; //编译正确
 6  8         int c = 1000;
 7  9         long d = c;
 8 10         float e = 1.5F;
 9 11         double f = e;
10 12     }
11 13 
12 14 }



如上:定义long类型的a变量时,将编译出错,原因在于10000000000默认是int类型,同时int类型的数值范围是-2^31 ~ 2^31-1,因此,10000000000已经超过此范围内的最大值,故而其自身已经编译出错,更谈不上赋值给long型变量a了。

此时,若想正确赋值,改变10000000000自身默认的类型即可,直接改成10000000000L即可将其自身类型定义为long型。此时再赋值编译正确。

将值为1000的int型变量c赋值给long型变量d,按照上文所述,此时直接发生了自动类型提升, 编译正确。同理,将e赋给f编译正确。

接下来,还有一个地方需要注意的是:char型其本身是unsigned型,同时具有两个字节,其数值范围是0 ~ 2^16-1,因为,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。