java语言基础
关键字:其实就是一个计算机语言对指定的单词赋予了特殊的含义,比如class public static void ,都是固定的写法,你并不能随便的变化,也就是不是自己定义的。特点:都是英文小写单词。
标识符:比如class Demo中的Demo,就是在程序中起的名字。 包含0-9,a-z,$, _ 注意:1、数字不可以开头 2、名称不可以使用关键字 3、数字不可以开头 4、名字中不可以有其他符号包括空格


类型转换,类型转换分为自动类型转换和强制类型转换两种。
自动类型转换:将一种类型的值赋给另一种类型的变量时发生的类型转换,自动类型转换需要满足以下两个条件:1)转换前的类型和转换后的类型兼容;2)转换后的类型的表示范围大于转换前的类型的表示范围。通常的转换如下:
byte→short→char→int→long→float→double 白芍茶因狼服大宝
 1 public class TypeCast {
 2     public static void main(String[] args) {
 3         int i = 100;
 4         char c1 = 'a';//注意用char生命的是要加''的
 5         byte b = 3;
 6         long l = 567L;//声明长整形的变量,其后要加上类型符L
 7         float f = 1.89f;//声明float类型的变量,其后要加上类型符f
 8         double d = 2.1;
 9         int i1 = i + c1; // char类型的变量c1自动转换为int类型参加运算
10         long l1 = l - i1; // int类型的变量i1自动转换为long类型参加运算
11         float f1 = b * f; // byte类型的变量b自动转换为float类型参加运算
12         /* int类型的变量i1自动转换为与f1一致的float类型f1/i1计算结果为float类型. 然后再转换为与d一致的double类型。 */
13         double d1 = d + f1 / i1;
14         System.out.println("i1=" + i1);
15         System.out.println("l1=" + l1);
16         System.out.println("f1=" + f1);
17         System.out.println("d1=" + d1);
18     }
19 }
i1=197
l1=370
f1=5.67
d1=2.1287817269563676
强制类型转换:当要将一个类型表示范围的数赋值给表示范围小的数的时候,例如要将一个double类型的数赋值给int类的数的时候,就需要强制类型转换,语法格式如下:
data_type var1=(data_type)var2;
例如:
float flag = 30.33f;
int num = (int)flag;
在强制类型转换中会丢失精度。在上面的例子中num的值是30。
说明:由于float和double表示的都是约数,所以不要用它们表示需要精确的数,比如货币等,如果要表示精确值,需要使用java.math.BigDecimal类。
需要注意的细节
1、每个字母都有对应的ASCII码(注意每一句的结果)
package day2; public class n1 { public static void main(String[] args) { System.out.println("a"+1); System.out.println('a'+1); System.out.println('a'+'1'); System.out.println("5+5="+5+5); //System.out.println('5+5='+5+5); System.out.println(5+5); System.out.println("5+5="+(5+5)); } }
a1
98
146
5+5=55
10
5+5=10
 
a的ASCII码是97  1的ASCII是49。
关键点:字符串和任何数据做+动作,都是相连接,生成一个新的字符串
2、容易忽视的精度问题
比如:
package day2; import java.util.Scanner; public class n1 { public static void main(String[] args) { byte b1=1; byte b2=2; byte b; //b= b1+b2;//这里是会出现错误的
b= (byte)(b1+b2)//这里是对的 // b =b1+2;//这里也是不对的 b=1+2; // b=b+b1;//这里也是不对的 b+=b1;//这里虽然看起来和上面的一样,但是还是有区别的 System.out.println(b); } }
在这里涉及到自动强制转换的问题,还有不允许丢失精度的问题,还有一个赋值符号可以自动强制转换的问题。
byte类型的两个变量相加或者一个byte和其他的类型相加的时候会出现错误,是不允许的,容易丢失精度,因为变量的值是变化的,比如,给byte b1 = 127 byte b2 = 2 即使b = 127+2也会出现错误的情况。这是什么原因?因为在赋值的时候默认为把int型的常量赋值给byte类型的变量,程序自动识别这个byte型的变量是否能够容得下这个整形的常量,如果容得下,那么就会将这个数字转为byte类型,但是如果容不下就会报错byte b = b1+b2 或者byte b = b1+6这种情况出现了精度丢失的情况。
还有+=与=的问题:赋值符号有= += -+ /+ *= %= 赋值符号有一个功能就是自动强制转换数值类型,所以当人们怕出现错误的时候经常把b = b+b1 写成b+=b1
 
算数运算符:
常见问题1:
int x=427; x=x/100*100;
我们一看肯定=427,但是实际上程序的结果是400,因为两个整形的相除结果是不会得到double型的,在427/100的时候结果就已经变成了400
关于自增自减得问题:
一般不做运算的情况下++a和a++没有什么区别但是在变量参与运算的时候就出现了差别
比如
b=++a 运算过程: 右边a=a+1; a=4; 左边b=a; b=4 b=a++ 运算过程:因为++在a的后面说明先把a赋值给b,然后再进行自加运算: 现将a变量中的数据,进行临时存储 temp=a 自增运算 a=a+1 a=4 将临时存储的a的数据赋值给b b = temp
易错点:
package day2; import java.util.Scanner; public class n1 { public static void main(String[] args) { int a = 3; int bb = 2; int c = a++;//先进行临时存储,再赋值 int d = ++a; System.out.println(c+" "+d); } }
在这里我们也许会以为结果是3 4
但是正确结果是3 5(因为上面a已经进行过一次自加运算)
赋值运算:
易错点:特殊short
short s = 3; // s=s+6;//这里是错的 s+=6;//这里是对的
这是为什么呢?s是short,6是int,short会转变成int,再赋值给short的时候转换不过来会丢失精度
s+=6本身是赋值运算,因为+=是赋值运算,会有一个自动转换的过程,总之记住这种特殊情况
byte a ,b;
short c ,d;
a=a+b;
a=a+6;
c=c+d;
c=d+6;
a+=b;//yes
c+=d;//yes
a=1+3;//yes
c=3+2//yes
逻辑运算符:
&:只要两边有一个为false,结果就为false,两边都为true那么结果为true。无论左边是什么,两边都运算
|:只要两边有一个true结果就为true,两边都为false,结果为false。两边都运算
&&:当左边为false时,右边不参与运算,但是当左边是true的时候右边还是要看的
||:当左边为true时,右边不参与运算,当左边是false的时候右边还是要看的
^:两边结果一致,那么运算结果为false,如果不一致结果为true。
位运算符:(这个是比较重要的,因为运算起来比较快)用于操作二进制位的符号
左移<< 又移>> 无符号右移>>>
比如3<<2=12,每往左移一位就是乘以2的次幂,方便进行乘以2的次幂运算
3*2^2 = 12
3<<3 : 3*2^3 = 24
右移6>>1 6/(2^1)
6>>2:6/(2^2)
也就是说做乘右除
右移是除以2的次幂运算
左移的时候空位出现在低位,用0补位
右移的时候出现在高位,原来高位是什么就用什么补位
>>>空位出现在高位,无论高位是什么。空位都用0补
&:
6&3:
省略前面的0:
   110
&  011
------------
   010=2
6|3
110 | 011 ----------- 111 =7
***一个数异或另外一个数两次还是本身**********
~:取反 ~6=-7(因为-6是6取反加1,这个只取反,没有加1)
位运算的速度非常快,比加减乘除快
判断结构
if else if else
虽然是多行,但是是单条语句
虽然由多个代码块组成,但是只有一个会执行
比如:
package day2; import java.util.Scanner; public class n1 { public static void main(String[] args) { int x = 3; if(x>1) System.out.println("a"); else if(x>2) System.out.println("b"); else System.out.println("c"); System.out.println("over"); } }
a
over
虽然x>2这个条件也满足但是,记住if else if else 只能有一个执行
一个if 对应一个else
比如:
package day2; import java.util.Scanner; public class n1 { public static void main(String[] args) { int x = 3; if(x>1) System.out.println("a"); if(x>2) System.out.println("b"); if(x>3) System.out.println("dd"); else System.out.println("c"); System.out.println("over"); } }
a
b
c
over
 
注意switch结构,注意
switch(条件)
{ case X:
break;
case x:
break;
……
default:
……
}
举例
package day2; import java.util.Scanner; public class n1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(true) { int x = scanner.nextInt(); switch( x) { case 1: case 2: case 3: System.out.println("spring"); break; case 4: case 5: case 6: System.out.println("summer"); break; case 7: case 8: case 9: System.out.println("autome"); break; default: System.out.println("winter"); } } } }
if 和switch 语句的应用场景
1、如果对具体个数的数值进行判断,用if也可以,用switch也可以,但是建议使用switch因为switch会提高效率
2、如果要对区间进行判断的话,用if语句
3、如果运算结果是布尔型,用if语句
while do 与 do while区别
while (){do},满足条件执行语句,但是do{} while;无论是否满足条件,第一次的do都执行
for( ; ; )//for语句的最简单无限循环模式 {} while(true)//while语句的最简单无限循环模式 {}
关于转义字符"\t"
比如九九乘法表
package day3; public class test1 { public static void main(String[] args) { int i; int j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) System.out.print(j+"*"+i+"="+(i*j)+" "); System.out.println(); } } }
1*1=1 
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12   4*4=16   
1*5=5   2*5=10   3*5=15   4*5=20   5*5=25 //这个地方开始不对齐
1*6=6   2*6=12   3*6=18   4*6=24   5*6=30   6*6=36   
1*7=7   2*7=14   3*7=21   4*7=28   5*7=35   6*7=42   7*7=49   
1*8=8   2*8=16   3*8=24   4*8=32   5*8=40   6*8=48   7*8=56   8*8=64   
1*9=9   2*9=18   3*9=27   4*9=36   5*9=45   6*9=54   7*9=63   8*9=72   9*9=81   
 
但是你要是用了"\t"制表符,就会变得非常整齐
package day3; public class test1 { public static void main(String[] args) { int i; int j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) System.out.print(j+"*"+i+"="+(i*j)+"\t"); System.out.println(); } } }
1*1=1 
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	
 
JAVA语言综合题目
1、
package day3; public class test1 { public static void main(String[] args) { int x=1,y=1; if(x++==2 & ++y==2) {x=7;} System.out.println(x+" "+y); } }
2 2
分析:这道题看起来应该是x=7 y=2,但是实际上++在x的后面,也就是x有一个暂存变量的过程,现将x=1赋值给temp然后x再自加,这里是用的temp与2进行比较,所以这里就是false,右边++y=2没错
false &true = false,所以x=7不能执行,但是最终x++是做了自加运算的,所以x=2
2、
package day3; public class test1 { public static void main(String[] args) { int x=1,y=1; if(x++==2 && ++y==2)//一个是x先比较再自加,另外一个是先自加在比较 {x=7;} System.out.println(x+" "+y); } }
2 1
分析:x=2能理解,但是为什么y=1呢?因为这里涉及到&&,&&有个特点那就是左边只要错了右边就不执行了,左边x++!=2,所以右边不执行,所以y还是=1
 
3、
package day3; public class test1 { public static void main(String[] args) { int x=1,y=1; if(x++==2 | ++y==2) {x=7;} System.out.println(x+" "+y); } }
7 2
|是左右都看的,左边x++==2false,右边++y=2true,左右都执行了,false|true = true,所以x=7,y=2
4、
package day3; public class test1 { public static void main(String[] args) { int x=1,y=1; if(x++==1 || ++y==2) {x=7;} System.out.println(x+" "+y); } }
7 1
分析:x=1 x++==1 true 因为中间是||左边对了中间不读,结果就是true所以x=7,y=1
这么来说的话就是“|”如果左边对的话右边也是读的,“&”如果左边错误的话右边也是读的。“&&”,左边错了的话右边就不读了,“||”左边对的话,右边也不读了
5、
package day3; public class test1 { public static void main(String[] args) { boolean b = true; if(b==false) System.out.println("a"); else if(b) System.out.println("b"); else if(!b) System.out.println("c"); else System.out.println("d"); } }
b
记住 if(不能是赋值符号)
6、
package day3; public class test1 { public static void main(String[] args) { int x = 2,y=3; switch(x) { default: { y++; System.out.println("1"); } case 3: { y++; System.out.println("2"); } case 4: { y++; System.out.println("3"); } } System.out.println(y); } }
1
2
3
6
分析:如果忽视细节肯定以为这道题的答案是4 1,但是要注意的是case后面没有break啊,而且把default放在case前面和放在后面是完全不一样的,如果放在后面的话,如果case情况不符合就不会执行case里面的内容,但是要是default放在前面的话就不管case括号里面的内容是否符合都会执行case{}的内容。
+++++++++
                    
                
                
            
        
浙公网安备 33010602011771号