标识符语法
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型。
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型。
原文地址:https://www.cnblogs.com/xiaozhang666/p/10301286.html