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语句的最简单无限循环模式
{}

关于转义字符" "

比如九九乘法表

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

 

但是你要是用了" "制表符,就会变得非常整齐

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

 

 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{}的内容。

       

+++++++++

原文地址:https://www.cnblogs.com/mmlovejj/p/4875916.html