int i =10;System.out.println(i);//10int i =20;System.out.println(i);//20int i =100;System.out.println(i);//100
8、有了变量的概念之后,内存空间得到了重复的使用:
int i =10;System.out.println(i);...System.out.println(i);
9、通常访问一个变量包括两种访问形式:
第一种:读取变量中保存的具体数据 get/获取
第二种:修改变量中保存的具体数据 set/设置
i =20;//setSystem.out.println(i);//get
10、变量在一行中可以声明多个
int a,b,c
11、java中的变量必须先声明,再赋值,才能访问 int i;程序执行到这里,内存空间并没有开辟出来,变量i并没有初始化。所以没有赋值之前是无法访问的
举例:
publicclassVarTest01{publicstaticvoidmain(String[] args){//声明一个int型的变量,起名为iint i;//编译报错,变量i并没有初始化//System.out.println(i);//给i变量赋值,i变量在这里完成初始化,内存开辟
i =100;System.out.println(i);//i再次重新赋值
i =200;System.out.println(i);//一行可以同时声明多个变量//a和b尚未初始化,c赋值给300int a,b,c =300;//编译错误//System.out.println(a);//编译错误//System.out.println(b);System.out.println(c);
a =0;
b =1;System.out.println(a);System.out.println(b);}}
12、在同一个“作用域” 中,变量名不能重名,但是变量可以重新赋值
publicclassVarTest03{publicstaticvoidmain(String[] args){int i =100;System.out.println(i);
i =200;System.out.println(i);//会报错,同一个作用域中变量名重复int i =500;System.out.println(i);}}
publicclassVarTest03{//注意,这里的static不要去掉staticint k =90;publicstaticvoidmain(String[] args){//变量i的作用域是main方法//在整个main方法当中是有效的,可见的,可以访问的int i =100;System.out.println(i);//可以System.out.println(k);//可以//a变量的作用域是整个for循环,for循环结束之后,a变量的内存就释放了for(int a=0;a<10;a++){}//这里无法访问变量a//System.out.println(a);int j;//作用域是main方法for(j=0;j<10;j++){}System.out.println(j);//访问的是main方法中的j变量}publicstaticvoiddosome(){//这里无法访问main方法当中的变量;//已经出了i变量的作用域//System.out.println(i); //不可以System.out.println(k);//可以}}
14、变量的分类
根据变量声明的位置来分类:
局部变量:在方法体当中声明的变量叫做局部变量
成员变量: 在方法体外【类体内】声明的变量叫做成员变量
在不同的作用域中,变量名是可以相同的
在同一个作用域中,变量名不能重名
public classs VarTest04{//主方法:入口publicstaticvoidmain(String[] args){//i变量就是局部变量int i =3;System.out.println(i);//java遵循“就近原则”}//成员变量int i =200;//类体中不分先后顺序//类体中不能直接编写java语句【除声明变量之外】//System.out.println(i);publicstaticvoiddosome(){//局部变量int i =100;}}
publicclassDataTypeTest02{//变量还是遵守这个语法:先声明,再赋值,才能访问//成员变量没有手动赋值系统会默认赋值【局部变量不会】staticint f;//成员变量publicstaticvoidmain(String[] args){/*
int i;//局部变量
System.out.println(i);
*/System.out.println(f);//0}}
数据类型
默认值
byte,short,int,long
0
float,double
0.0
boolean
false【在c语言中,true是1,false是0】
char
\u0000
八种基本数据类型的默认值是一切向0看齐。
详细阐述各类数据类型
1、char
publicclassDataTypeTest01{publicstaticvoidmain(String[] args){//定义一个char类型的变量,起名c,同时赋值字符'a'char c ='a';System.out.println(c);//一个中文占用2个字符,char类型正好是2个字节//所以java中的char类型变量可以存储一个中文字符char x ='国';System.out.println(x);//编译错误//ab是字符串不能使用单引号括起来//char y = 'ab';//"a"是字符串类型//k变量是char类型//类型不兼容,编译错误char k ="a";//先声明char e;//赋值
e ='e';//再赋值
e ='f';}}
转义字符 转义字符会出现特殊字符之前,会将特殊字符转换成普通字符
\n 换行符
\t 制表符
\’ 普通的单引号
\\ 普通的反斜杠
\" 普通的双引号
publicclassDataTypeTest03{publicstaticvoidmain(Sting[] args){//普通的n字符char c1 ='n';System.out.println(c1);//这是一个换行符,属于char类型的数据//反斜杠在java语言当中具有转义功能char c2 ='\n';//System。out.println()和System.out.print()区别://println输出后换行,print表示输出,但是不换行//普通的t字符char x ='t';System.out.println(x);//制表符tab//强调制表符和空格不同,他们的ASCII不一样,体现在键盘是上两个不同的“按键”char y ='\t';System.out.print("A");System.out.println(y);System.out.println("B");//A B//要求在控制台上输出“反斜杠字符”//反斜杠将后面的单引号转义成不具备特殊含义的普通单引号字符//左边的单引号缺少了结束的单引号字符,编译报错/*char k = '\';
System.out.println(k);*//*
\\
解释:第一个反斜杠具有转义功能,将后面的反斜杠转义为普通的反斜杠字符
结论:在java当中两个反斜杠代表一个普通的反斜杠字符
*/char k ='\\';System.out.println(k);//在控制台上输出一个普通的单引号字符//第一个单引号和最后单引号配对儿char a ='\,';System.out.println(a);char f ='"';System.out.println(f);//输出"System.out.println("HelloWorld!");System.out.println("“HelloWorld!”");//内部是全角双引号//编译错误//System.out.println(""HelloWorld!"");//内部是半全角字符System.out.println("\"HelloWorld!\"");char m ='中';System.out.println(m);//JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式//在命令行输入native2ascii,回车,然后输入文字之后回车即可得到unicode编码char n ='\u4e2d';//‘中’对应的unicode编码是 4e2dSystem.out.println(n);//编译错误//char g = '4e2d';//编译错误//char g = 'u4e2d';//通过:反斜杠u联合起来后面的一串数字是某个文字的unicode编码char g ='\u4e2d';//char类型的默认值char c10 ='\u0000';System.out.println(c10);//空字符System.out.println(c10+1);//1}}
publicclassDataTypeTest04{publicstaticvoidmain(Sring[] args){int a =10;int b =010;int c =0x10;System.out.println(a);//10System.out.println(b);//8System.out.println(c);//16System.out.println(a + b + c);//34//123这个整数型字面值是int类型//i变量声明的时候也是int类型//int类型的123赋值给int类型的变量i,不存在类型转换。int i =123;//456整数型字面值被当做int类型,占用4个字节//x变量在声明的时候是long类型,占用8个字节//int类型的字面值456赋值给long类型的变量x,存在类型转换//int类型转换成long类型//int类型是小容量//long类型是大容量//小容量可以自动转换成大容量long x =456;System.out.println(x);//2147483647字面值是int类型,占用4个字节//y是long类型,占用8个字节,自动类型转换long y =2147483647;System.out.println(y);//编译错误:过大的整数:2147483648//2147483648被当做int类型的4个字节来处理,但是这个字面值超出int类型范围//long z = 2147483648;//解决错误//2147483648字面值一上来就被当做long类型来处理,在字面值后面添加L//2147483648L是8个字节的long类型//z是long类型变量,以下程序不存在类型转换long z =2147483648L;System.out.println(z);}}
publicclassDataTypeTest05{publicstaticvoidmain(String[] args){//100L是long类型字面值//x是long类型变量//不存在类型转换,直接赋值long x =100L;//x变量是long类型,8个字节//y变量是int类型,4个字节//以下程序编译报错:大容量不能直接赋值给小容量//int y = x;//大容量转换成小容量,需要进行强制类型转换//强制类型转换需要加“强制类型转换符”//加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度。//所以强制类型转换谨慎使用,因为损失精度之后可能损失很严重。//强转原理://原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100//强转之后的数据:00000000 00000000 00000000 01100100//将左边的4个字节的二进制砍掉【所有的数据强转的时候都是这样完成的】int y =(int)x;System.out.println(y);//原始数据:00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000//强转之后的数据:10000000 00000000 00000000 00000000//10000000 00000000 00000000 00000000目前存储在计算机内部,计算机存储数据都是采用补码的形式存储//所以10000000 00000000 00000000 00000000现在是一个补码形式//将以上的补码转换到原码就是最终的结果long k =2147483648L;int a =(int)k;System.out.println(a);//损失精度严重,结果是负数 【-2147483648】//分析以下程序是否可以编译通过?//依据目前所学内容,以下程序是无法编译通过的//理由:50是int类型的字面值,b是byte类型的字面值,显然是大容量int转换成小容量byte//大容量转换成小容量是需要添加强制类型转换符的,以下程序没有添加强转符号,所以编译报错//但是,在实际编译的时候,以下代码编译通过了,这说明:在java语言当中,当一个整数型字面值//没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量。byte b =50;//编译通过byte b =127;//编译通过//编译报错,128这个int类型字面值已经超出了byte类型的取值范围,不能直接赋值给byte类型的变量//byte b = 128;//纠正错误,需要使用强制类型转换符//但是一定会损失精度//原始数据:00000000 00000000 00000000 10000000//强转之后:10000000【这是存储在计算机内部的,是一个补码形式,则它的原码是什么?】byte b =(byte)128;//-128System.out.println(b);/*
计算机二进制有三种形式:
原码
补码
反码
计算机在任何情况下底层表示和存储数据的时候都采用了补码形式
正数的补码:和原码相同
负数的补码:负数的绝对值对应的二进制码所有二进制数取反,再加1
补码:10000000
原码计算过程:
1.减1,01111111
2.全部取反,10000000(128)
3.根据补码确定为负数,则最终原码为-128
*///short s = 32767;//通过//short s = 32768;//编译报错//65535是int类型,4个字节//cc是char类型,2个字节//按照以前所学知识点来说,以下程序是编译报错的。//char cc = 65535;//通过//char cc = 65536;//编译报错/*总结:
当一个整数字面值没有超出byte,short,char的取值范围时,这个字面值可以直接赋值给byte,short,char类型的变量,这种机制SUN允许了,目的是为了方便程序员的编程。
*/}}
publicclassDataTypeTest06{publicstaticvoidmain(String[] args){//3.0是double类型的字面值//d是double类型的变量//不存在类型转换double d =3.0;System.out.println(d);//5.1是double类型的字面值//f是float类型的变量//大容量转换成小容量需要加强制类型转换符,所以以下程序编写错误//float f = 5.1;//解决方案://第一种解方案:强制类型转换float f =(float)5.1;//第二种解决方案:没有类型转换float f =5.1F;}}
byte b =3;//可以编译通过,3没有超出byte类型取值范围int i =10;byte b = i /3;//编译报错,编译器只检查语法,不会“运算”i/3,错误是int/int类型,结果为int类型,转成byte时,没有加强制类型转换符
//10和3默认是int类型,所以运算后的最大类型也是int,为3//所以是正确的int f =10/3;// 3//先计算10/3,为3,再根据自动类型转换,将3转换成3.0double dd =10/3;// 3.0//先将3转换成3.0,然后计算10.0/3.0,然后转换成double类型
dd =10.0/3;//3.33333333333333long g =10;//错误:g是long类型,计算g/3时,3会由int类型转换成long类型,于是g/3得到long类型,而将long类型转换成int类型,没有加强制转换符int h = g/3;int h =(int)g/3;//正确long h = g/3;//正确//错误:g先由long类型强制转换成int类型,再由int强制转成byte类型,而byte/int,则根据最大容量原则,最后为int类型,byte h = int,没有加强制类型转换符byte h =(byte)(int)g/3;//注意:编译器javac只检查语法,不进行计算byte h =3;//正确byte h =(byte)(int)(g/3);//正确,计算优先级原则,先计算右边括号中byte h =(byte)g/3;//不能转换,因为优先级问题,byte/int类型为int类型byte h =(byte)(g/3);//可以转换,因为运算结果没有超出byte取值范围//编译错误,short和byte运算,首先会转换成int类型再运算//所以运算结果为int,但由于编译器不会计算,只能判断语法,所以它判断将大容量int转换成小容量short,没有加强制类型转换,会报错short i =10;byte j =5;short k = i + j;short k =15;//编译通过,15没有超出short取值范围short k =(short)(i + j);//编译通过char l ='a';System.out.println(l);//a//将char类型强制类型转换成byte类型,但由于没有超出byte取值范围,不存在精度损失,仍为97System.out.println((byte)l);//97//先将char类型l转换成int类型,为97,再与100相加int m = l +100;System.out.println(m);//197