java基础(一):环境变量,关键字,标识符,数据类型,补码,常量,变量,运算符

1、工欲善其事,必先利其器(环境变量)

       安装JDK后,java和javac的命令是在jdk的bin目录下才能执行,为了在系统任意文件夹里随心所欲使用java的命令,和加载java类所在的目录,故要配置JAVA环境变量PATH、CLASSPATH和JAVAHOME

PATH   %JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin 
CLASSPATH    .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
JAVAHOME     D:\Program Files\Java\jdk1.8.0_251   //根据你实现的jdk安装目录

path环境变量:

    记录的是可执行性文件,如.exe文件,对可执行文件先在当前路径去找,如果没找到就去path环境变量中配置的路径去找。保证java和javac命令可以在任意目录下执行

classpath环境变量:

    记录的是java类的运行文件所在的目录,先在当前目录加载主类,没找到就到classpath环境变量中配置的路径去找。保证class文件可以在任意目录下运行

       配置好java的环境变量后,在任意目录创建一个HelloWorld.java,输入以下内容,打开cmd,cd进入进入HelloWorld.java文件的目录。在cmd命令行打javac  HelloWorld.java会生成一个HelloWorld.class文件,再java HelloWorld后,命令行会输入Helloworld。这样就完成第一个java程序了。java文件一般文件名和类名是相同的

public class HelloWorld{

    public static void main(String[] args) {
    	System.out.println("HelloWorld!!!"); 
    }

 }  //熟记这个程序写法
  

2、关键字的概述和使用

关键字:

        又称为保留字,由java语言事先定义好的,有特殊意义的。如在java中表示特定语法的for、switch、if,还有表示int、float等数据类型的声明字,这些都是java的关键字。

关键字的特点:

       1、完全小写的字母。

       2、在特殊的编辑工具中有特殊颜色显示。

       3、不能用作变量名、方法名、类名、包名和参数

3、标识符的概述和使用

标识符:在java中主要是给类、对象、方法、变量和常量命名的。

标识符命名规则:

      1、由26字母(区分大小写)、数字、_(下划线)和$(美元符号)组成。

      2、不能以数字开头,也不能以关键字命名。

常用的标识符例子:
        A:包    全部小写
            单级包:小写
                举例:test,com
            多级包:小写,并用.隔开
                举例:cn.itcast,com.baidu                
        B:类或者接口
            一个单词:首字母大写
                举例:Student,Demo
            多个单词:每个单词首字母大写
                举例:HelloWorld,StudentName
        C:方法或者变量
            一个单词:首字母小写
                举例:name,main
            多个单词:从第二个单词开始,每个单词首字母大写
                举例:studentAge,showAllNames()
        D:常量
            全部大写
            一个单词:大写
                举例:PI
            多个单词:大写,并用_隔开
                举例:STUDENT_MAX_AGE

4、java数据类型

       Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。比如定义一个变量int a="abc"会报错,不像python语言定义变量时不需声明类型,即a = "123"或a=int("123")。(这里先讲下java的基本类型)

        数字类型的表数范围:

数字类型占用存储空间表数范围
byte1byte-128 ~ 127
short2byte-2^15 ~ 2^15 -1
int4byte-2^31 ~ 2^31 -1
long8byte-2^63 ~ 2^63 -1
float4byte-3.403E38 ~ 3.403E38
double8byte-1.798E308 ~ 1.798E308

注意:

    long: 8个字节
    float:4个字节
    
    A:它们底层的存储结构不同。
    B:float表示的数据范围比long的范围要大
        long:2^63-1
        float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

   

    因为整数默认是int类型,浮点数默认是double。在定义Long或者Float类型变量的时候,要加L或者f

         基本类型的默认值:

public class Test {  

    static boolean bool;

    static byte by;

    static char ch;

    static double d;

    static float f;

    static int i;

    static long l;

    static short sh;

    static String str;

    public static void main(String[] args) {

        System.out.println("Bool :" + bool);   //false

        System.out.println("Byte :" + by);     //0

        System.out.println("Character:" + ch);  //

        System.out.println("Double :" + d);   //0.0

        System.out.println("Float :" + f);   //0.0

        System.out.println("Integer :" + i);   //0

        System.out.println("Long :" + l);   //0

        System.out.println("Short :" + sh);   //0

        System.out.println("String :" + str);  //null

    }

}  

 ( 注意 : 整形默认是int类型,浮点数默认是double类型,长整形最好用L标记,如long a =  1000000000000L 

 关于float a =12.345会报错?

        因为浮点数默认是double类型,12.345范围小于double的表数范围,正确的写法是float a = 12.345Ffloat a = (float)12.345,又或者直接赋值double类型double ab = 12.345  。

       但是float a = 12.345F 和float a = (float)12.345是有区别的。前者是直接赋值float类型,而后者是强制double类型转换为float类型(有时会存在损失精度问题)。

             基本数据类型的转换:

     1、boolean类型不能转换为其他的数据类型 

     2、默认转换

           (1) byte,short,char—int—long—float—double

           (2) byte,short,char相互之间补转换,他们参与运算首先转换为int类型。

              (两个byte相加,或一个byte和一个int相加也是自动转换为int类型

      3、强制转换               

            目标类型 变量名=(目标类型)(被转换的数据);

            如int a = 3,b=4;  byte c = (byte)(a+b),但注意有时强制转换会损失精度的问题(这里的转换损失精度了)。 

       

      4、思考题:下面的结果是?

           char b = 'b';
           System.out.println(b);
           System.out.println(b+1);
           System.out.println('a'+1);

           

           //答案如下

            b

            99

            98

变量相加和常量相加的区别?

       byte b1=3,b2=4,b;

       请问b=b1+b2;b=3+4; 哪句会编译失败?还有byte a=130;byte b=300;会         不会报错?

答:(1)由于两变量相加,b1和b2会先转换为int类型,byte类型的b=b1+b2相加转换后的int类型会编译报错,故b=b1+b2会编译报错。

       (2)常量值相加时,会先运算看和的值在不在赋值的值的表数范围内,在就不报错,不在就报错。故b=3+4不报错,byte a=130和byte b=300报错。

  

强制转换数据溢出后的结果怎么算?

        byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
        如执行byte b = (byte)130;
答:我们要想知道结果是什么,就应该知道是如何进行计算的。
        而我们又知道计算机中数据的运算都是补码进行的。
        而要得到补码,首先要计算出数据的二进制。
        
        A:获取130这个数据的二进制。
            00000000 00000000 00000000 10000010
            这是130的原码,也是反码,还是补码。
        B:做截取操作,截成byte类型的了。
            10000010 
            这个结果是补码。
        C:已知补码求原码。
                    符号位        数值位
            补码:    1            0000010
            
            反码:    1            0000001
            
            原码:    1            1111110

5、补码   

计算机中的运算都是通过补码进行的,但是补码是通过原码和反码转换而来的。下面进行有符号的数据表示法来表示+7和-7:

原码:正数的原码最高位为0,负数的原码最高位为1,其他的是数值位。

       符号位  数值位

+7   0           0000111 

-7    1           0000111

反码:正数的反码与原码相同,负数的反码与原码符号位相同,数值位取反(即1变0,0变1)。

       符号位  数值位

+7   0          0000111

-7    1          1111000

补码:正数的原码的补码与原码相同,负数的补码是反码加1的数。 

       符号位  数值位

+7   0          0000111

-7    1          1111001

由于byte类型的表数范围是-128 ~ 127,由刚才byte b = (byte)130的例子,得出

        (1):获取130这个数据的二进制。
            00000000 00000000 00000000 10000010
            这是130的原码,也是反码,还是补码。
        (2):做截取操作,截成byte类型的了。 //1byte等于8bit
            10000010 
            这个结果是补码。
        (3):已知补码求原码。
                    符号位        数值位
            补码:    1            0000010
            
            反码:    1            0000001
            
            原码:    1            1111110

所以常见的0到255数的强制转换为byte的数值如下:

数字    补码              byte型      

255     11111111          -1           

254     11111110          -2             

129     10000001        -127         

128     10000000        -128    //-128只有补码,无原码,无反码。

127      01111111        127

100      01100100       100

1          00000000        1

0          00000000         0

//注意:正数的原、反、补码都相同

6、常量、成员变量和局部变量

常量:可以理解为数值不能改变的量,常量通常以大写字母命名。在java中通过final关键字修改的赋值声明为常量,而且final修饰的常量必须赋值且赋值后不能再修改。如下表

public class Test {

      //静态常量

      public static final double PI = 3.14;

      //声明成员常量

      final int Y = 10;

      public static void main(String[] args) {

              //声明局部常量

               final double X = 3.3;

               }

          }

 变量:分成员变量和局部变量。他们区别如下

成员变量局部变量

1、成员变量可不赋值,会有默认值。

2、在类中方法外无static修饰的为实例成员变量。

3、在类中方法外用static修饰的为类成员变量。

4、实例成员变量在堆中是随着对象的创建,同时对应分配多块堆空间存储数据,每个对象使用自身的实例成员变量空间;而类成员变量是随着类的加载而加载到方法区,只分配一块空间存储数据共享给所有对象使用。

//堆和方法区都能被所有线程共享,方法区包含所有的class和static变量

1、局部变量必须显示赋值才能使用。

2、存在于方法体的形参。

3、定义在方法内的变量。

4、定义在代码块内的变量。

5、局部变量随方法的调用而存储在栈中,随方法调用完毕后自动销毁。

6、调用方法形参时,基本类型的局部变量是直接把数值存储在栈中,修改值对实际参数无影响,引用类型的局部变量是将堆中引用的地址存储在方法的栈内存中,修改值会改变实际参数。

 (注意:在方法调用时,同名的变量采用就近原则,局部变量优先级>成员变量

7、运算符

       运算符就是对常量和变量进行操作的符号,分为算术运算符,三目运算符,赋值运算符,比较运算符,逻辑运算符,位运算符。

              7.1、算术运算符:包括单、双、三目算术运算符。 

双目算术运算符: +加, -减,*乘,/除,%取余

public class Test {

    public static void main(String[] args) {
        System.out.println(23+5);   //28 
        System.out.println(6*5);     //30
        System.out.println(27/3);    // 9
        System.out.println(3/4);      // 0   除法时,商只取整除部分
        System.out.println(9%3);    // 0
        System.out.println(9%4);    // 1
    }

 }
  

单目算术运算符++自增1, --自减1

public class test {

    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        
        //int c = a++;
        //int d = b--;
        
        int c = ++a;
        int d = --b;
        
        System.out.println("a:"+a); //4, 4
        System.out.println("b:"+b); //3, 3
        System.out.println("c:"+c); //3, 4
        System.out.println("d:"+d); //4, 3

        int x = 4;
        int y = (x++)+(++x)+(x*10);
        //4+6+60
        //x=5,6
        System.out.println("x:"+x);  //x:6
        System.out.println("y:"+y);  //y:70
    }

 }

//a++或++a时,最后的a值都自增1,

//但注意区别int c =a++是先把a的赋给c后,a再自增量1;而int c=++a是a先自增量1再赋值给c。(记忆口诀:单目运算时,等号右边是变量时直接赋值,后才自增自减。)

设x=1,y=2,z=3,则表达式y+=z--/++x的值是多少?

答案是3。

三元算术运算符比较表达式?表达式1:表达式2;
/*
    练习:
        获取两个整数中的最大值
        获取三个整数中的最大值
        比较两个整数是否相同
*/
class OperatorTest {
    public static void main(String[] args) {
        //获取两个整数中的最大值
        int x = 100;
        int y = 200;
        
        int max = (x > y? x: y);
        System.out.println("max:"+max);
        System.out.println("--------");
        
        //获取三个整数中的最大值
        int a = 10;
        int b = 30;
        int c = 20;
        
        //分两步:
        //A:先比较a,b的最大值
        //B:拿a,b的最大值在和c进行比较
        int temp = ((a > b)? a: b);
        //System.out.println(temp);
        int max1 = (temp > c? temp: c);
        System.out.println("max1:"+max1);
        
        //一步搞定
        //int max2 = (a > b)?((a > c)? a: c):((b > c)? b: c);
        //这种做法不推荐。但要注意三目运算符号顺序是从右向左运算的
        //int max2 = a > b?a > c? a: c:b > c? b: c;
        //System.out.println("max2:"+max2);
        System.out.println("--------");
        
        //比较两个整数是否相同
        int m = 100;
        int n = 200;
        
        //boolean flag = (m == n)? true: false;
        boolean flag = (m == n);
        System.out.println(flag);
    }
}

             7.2、赋值运算符

/*
    赋值运算符:
        基本的赋值运算符:=
            把=右边的数据赋值给左边。
            
        扩展的赋值运算符:+=,-=,*=,/=,%=
            += 把左边和右边做加法,然后赋值给左边。
*/
class OperatorDemo {
    public static void main(String[] args) {
        //定义一个变量
        int x = 10;
        
        //其他用法
        int a,b; 
        a = b = 10;
        System.out.println(a); 
        System.out.println(b);
        System.out.println("-----------");   

        //定义一个变量
        int y = 10; 
        y += 20;
        System.out.println(y);
    }
}

              7.3、比较运算符

/*
    比较运算符:
        ==,!=,>,>=,<,<=
        
    特点:
        无论你的操作是简单还是复杂,结果是boolean类型。
        
    注意事项:
        "=="不能写成"="。
*/
class OperatorDemo {
    public static void main(String[] args) {
        int x = 3;
        int y = 4;
        int z = 3;
    
        System.out.println(x == y);
        System.out.println(x == z);
        System.out.println((x+y) == (x+z));
        System.out.println("------------");
        
        System.out.println(x != y);
        System.out.println(x > y);
        System.out.println(x >= y);
        System.out.println(x < y);
        System.out.println(x <= y);
        System.out.println("------------");
        
        int a = 10;
        int b = 20;
        
        //boolean flag = (a == b);
        //boolean flag = (a = b); //这个是有问题的,不兼容的类型
        //System.out.println(flag);
        
        int c = (a = b); //把b赋值给a,然后把a留下来
        System.out.println(c);
    }
}

            7.4、逻辑运算符

/*
    逻辑运算符:
        &,|,^,!
        &&,||
        
    特点:
        逻辑运算符一般用于连接boolean类型的表达式或者值。
            
        表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。
            算术表达式:a + b
            比较表达式:a == b
            
    结论:
        &逻辑与:有false则false。
        |逻辑或:有true则true。
        ^逻辑异或:相同为false,不同为true。
            举例:情侣关系。男男,男女,女男,女女
        !逻辑非:非false则true,非true则false。
            特点:偶数个不改变本身。
*/
class OperatorDemo {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = 5;
        
        //&逻辑与
        System.out.println((a > b) & (a > c)); //false & false = false
        System.out.println((a > b) & (a < c)); //false & true = false
        System.out.println((a < b) & (a > c)); //true & false = false
        System.out.println((a < b) & (a < c)); //true & true = true
        System.out.println("---------------");
        
        //|逻辑或
        System.out.println((a > b) | (a > c)); //false | false = false
        System.out.println((a > b) | (a < c)); //false | true = true
        System.out.println((a < b) | (a > c)); //true | false = true
        System.out.println((a < b) | (a < c)); //true | true = true
        System.out.println("---------------");
        
        //^逻辑异或
        System.out.println((a > b) ^ (a > c)); //false ^ false = false
        System.out.println((a > b) ^ (a < c)); //false ^ true = true
        System.out.println((a < b) ^ (a > c)); //true ^ false = true
        System.out.println((a < b) ^ (a < c)); //true ^ true = false
        System.out.println("---------------");
        
        //!逻辑非
        System.out.println(!(a > b)); //!false = true
        System.out.println(!(a < b)); //!true = false
        System.out.println(!!(a > b)); //!!false = false
        System.out.println(!!!(a > b)); //!!false = true
    }
}

/*
    &&和&的区别? 同理||和|的区别?
        A:最终结果一样。
        B:&&具有短路效果。左边是false,右边不执行。
        C:||也具有短路效果。左边是true,右边不执行。

        D:不过&&优先级比||还


    开发中常用的逻辑运算符:
        &&,||,!
*/
class OperatorDemo2 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = 5;
        
        //&&双与
        System.out.println((a > b) && (a > c)); //false && false = false
        System.out.println((a > b) && (a < c)); //false && true = false
        System.out.println((a < b) && (a > c)); //true && false = false
        System.out.println((a < b) && (a < c)); //true && true = true
        System.out.println("----------------");
        
        int x = 3;
        int y = 4;
        
        //boolean b1 = ((x++ == 3) & (y++ == 4));
        //boolean b1 = ((x++ == 3) && (y++ == 4));
        //boolean b1 = ((++x == 3) & (y++ == 4));
        boolean b1 = ((++x == 3) && (y++ == 4));
        System.out.println("x:"+x);
        System.out.println("y:"+y);
        System.out.println(b1);
    }
}

            7.5、位运算符

/*
    位运算符:
        &,|,^,~
        <<,>>,>>>
        
    注意:
        要做位运算,首先要把数据转换为二进制。
*/
class OperatorDemo {
    public static void main(String[] args) {
        //&,|,^,~
        
        int a = 3;
        int b = 4;
        
        System.out.println(3 & 4);
        System.out.println(3 | 4);
        System.out.println(3 ^ 4);
        System.out.println(~3);
    }
}
/*
    分析:因为是位运算,所以我们必须先把数据换算成二进制。
    
    3的二进制:11
        00000000 00000000 00000000 00000011
    4的二进制:100
        00000000 00000000 00000000 00000100
    
    &位与运算:有0则0。
        00000000 00000000 00000000 00000011
       &00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000000
        结果是:0
        
    |位或运算:有1则1。
        00000000 00000000 00000000 00000011
       |00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111
        结果是:7
        
    ^位异或运算:相同则0,不同则1。
        00000000 00000000 00000000 00000011
       &00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111
        结果是:7
        
    ~按位取反运算符:0变1,1变0
        00000000 00000000 00000000 00000011
       ~11111111 11111111 11111111 11111100 (补码)
       
       补码:11111111 11111111 11111111 11111100
       反码:11111111 11111111 11111111 11111011
       原码:10000000 00000000 00000000 00000100
        结果是:-4
*/
/*
    ^的特点:一个数据对另一个数据位异或两次,该数本身不变
*/
class OperatorDemo2 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        
        System.out.println(a ^ b ^ b); //10
        System.out.println(a ^ b ^ a); //20
    }
}

/*
    <<:左移    左边最高位丢弃,右边补齐0
    >>:右移    最高位是0,左边补齐0;最高为是1,左边补齐1
    >>>:无符号右移 无论最高位是0还是1,左边补齐0
    
    面试题:
        请用最有效率的方式写出计算2乘以8的结果?
            2 * 8
            
            2 << 3

*/
class OperatorDemo3 {
    public static void main(String[] args) {
        //<< 把<<左边的数据乘以2的移动次幂
        System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
    
        //>> 把>>左边的数据除以2的移动次幂
        System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
        System.out.println(24 >>> 2);
        
        System.out.println(-24 >> 2); 
        System.out.println(-24 >>> 2);
    }
}
/*
    计算出3的二进制:11
        00000000 00000000 00000000 00000011
    (00)000000 00000000 00000000 0000001100
        
    >>的移动:    
    计算出24的二进制:11000
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
        
        11111111 11111111 11111111 11101000
        1111111111 11111111 11111111 111010(00) 补码
        
        补码:1111111111 11111111 11111111 111010
        反码:1111111111 11111111 11111111 111001
        原码:1000000000 00000000 00000000 000110
        
        结果:-6
        
    >>>的移动:
        计算出24的二进制:11000
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
        
        11111111 11111111 11111111 11101000
        0011111111 11111111 11111111 111010(00)
        
        结果:
*/

一道面试题目:用多种方式实现两个整数变量的交换,如下:

/*
	面试题:
		请自己实现两个整数变量的交换
		注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
class OperatorTest {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		
		System.out.println("a:"+a+",b:"+b);
		
		//方式1:使用第三方变量(开发中用的)
		/*
		int c = a;
		a = b;
		b = c;
		System.out.println("a:"+a+",b:"+b);
		System.out.println("------------");
		*/
		
		//方式2:用位异或实现(面试用)
		//左边:a,b,a
		//右边:a ^ b
		/*
		a = a ^ b;
		b = a ^ b; //a ^ b ^ b = a
		a = a ^ b; //a ^ b ^ a = b
		System.out.println("a:"+a+",b:"+b);
		*/
		
		//方式3:用变量相加的做法
		/*
		a = a + b; //a=30
		b = a - b; //b=10
		a = a - b; //a=20
		System.out.println("a:"+a+",b:"+b);
		*/
		
		//方式4:一句话搞定
		b = (a+b) - (a=b); //b=30-20=10,a=20
		System.out.println("a:"+a+",b:"+b);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值