Java基础学习第三天(变量、数据类型转换、运算符)

一、变量

1、定义: 变量就是在程序运行过程中其值可以发生变化的量

2、声明(定义)一个变量的格式:
方式一:数据类型 变量名
方式二: 数据类型 变量名1,变量2….[一次性声明了多个相同类型变量]
注意:变量是必须先声明再使用, 在一个作用域中不能声明同名的变量。

3、变量名的命名规范: 首单词小写,其他单词首字母大写,其他小写。

4、两种数据类型
① 基本数据类型(8个)
◆ 整数的数据类型:
byte(字节):8位(bit) 2^8 = 256 -128~127
short(短整型):16bit
int(整型):32bit
long(长整型):64bit
注意: 如果一个整数没有加上任何的标识的时候,那么默认是int类型的数据。如果需要把该数据表示成一个long类型的数据,那么需要加数据后面加上L表示,L是不区分大小写的,但是建议使用大写。
◆ 小数的数据类型:
float(单精度浮点型):32bit(保留7位小数)
double(双精度浮点型):64bit(保留15位小数)
注意: 如果一个小数没有加上任何标识的时候,那么该小数默认是double类型的数据,如果需要表示成float类型,那么需要在小数的后面加上f表示,f不区分大小写的。
◆ 布尔类型: 只有true或者false两个值
boolean:1字节或者4个字节
注意: 如果使用boolean声明一个基本类型的变量时,那么该变量占4个字节;如果使用boolean声明一个数组类型的时候,那么每个数组的元素占1个字节。
◆ 字符类型:
char:2字节(16bit)
② 引用数据类型
字符串的数据类型是:String

class Demo3.1{
    public static void main(String[] args){     
        byte age = 120; //定义了一个byte类型的变量,变量名叫age,把120存储到了age变量中 
        age = 121;//改变变量的值      
        short money = 128;//定义了一个short类型的变量 
        int bossMoney = 1000000000;//定义了一个int类型的变量          
        long  allMoney = 10000000000000000L;//定义了一个long类型的变量    

        //存储小数
        float f = 3.14f;
        double d = 3.1415926537;
        boolean b = false;          
        char c = 'a';
        String str = "Hello World";
        System.out.println(str); //需要获取一个变量存储的数据,只需要使用变量名即可
    }
}

5、转义字符
特殊字符使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转移字符。

转义字符 解释
\r 相当于按下回车,把光标移动到一行的首位置上
\n 表示换行
\t 制表符,相当于Table键,为了让一列对齐,一个tab一般等于4个空格
\b 退格键,相当于BackSpace
\’ 单引号
\’’ 双引号
\ 表示一个斜跨
\t 制表符,相当于Table键,为了让一列对齐,一个tab一般等于4个空格
\b 退格键,相当于BackSpace

注意: 如果是在windows系统上操作文件的时候需要换行,是需要\r\n一起使用的;如果是在其他的操作系统上需要换行,仅需要\n即可。

import java.io.*;
class Demo3.2{
    public static void main(String[] args) throws Exception{
        File file = new File("F:\\Demo4.2.txt");
        FileWriter out = new FileWriter(file);
        out.write("大家好\r\n");
        out.write("你们辛苦了~");
        out.close();
    }

二、数据类型转换

1、数据类型转换:
小数据类型 > 大数据类型 [自动类型转换]
大数据类型 > 小数据类型 [强制类型转换]
强制类型转换的格式:小数据类型 变量名 = (小数据类型)大数据类型

2、要注意的细节
① 凡是byte、short 、 char数据类型数据在运算的时候都会自动转换成int类型的数据再运算。
② 两个不同数据类型的数据在运算的时候,结果取决于大的数据类型。

3、负数的存储原理
在计算机中,如果一个二进制最高位是1,那么该数肯定是一个负数;如果一个二进制最高位是0,那么该数据肯定是一个正数。
而,负数在计算机中存储方式是补码。
例如:-7 > 11111001
① 先取负数的绝对值,求出该绝对值的二进制代码(原码)
② 原码取反得到反码
③ 反码+1得到补码

class Demo3.3{
    public static void main(String[] args) {
        int i1 = 128;  //4个字节
        byte b =(byte) i1;  // 1个字节
        System.out.println(b);  // -128     
        //如果是负数,那么最高位肯定是1,正数的二进制位的最高位是0
        //sun给我们提供一个功能 Integer.tobinaryString()查看一个数据的二进制数据形式的
        System.out.println(Integer.toBinaryString(-7)); //11111001(补码)  

        //凡是byte、short 、 char数据类型数据在运算的时候都会自动转换成int类型的数据再运算             
        byte b1 = 1;
        byte b2 = 2;
        byte b3 = (byte)(b1+b2);
        System.out.println(b3); //3         
        System.out.println('a'+1); //98 

        //两个不同数据类型的数据在运算的时候,结果取决于大的数据类型
        int i2 = 10;
        long l = 20;
        i2 = (int)(i2+l); 
        System.out.println(i2);

        byte b = 10;  
        //10 是一个常量,编译器在编译的时候就能够确认常量的值了,byte b = 10,在编译到的时候,java编译器就会检查到10并没有超出byte的表示范围,所以允许赋值。
        int i3 = 10; 
        byte b = (byte)i3;  
        //java编译器在编译的时候并不能确认变量所存储的值,变量存储的值是在运行的时候才在内存中分配空间的
        System.out.println(b);
    }
}

三、运算符

1、算数运算符
+-*/ (除法) 、% (取模、取余数)、++ (自增) 、-- (自减)
连接符的作用: 让任何的数据都可以与字符串进行拼接
其中,如果+号用于字符串的时候,那么+号就是一个连接符,并不是做加法功能
注意:任何类型的数据与字符串使用连接符连接,那么结果都是字符串类型的数据

class Demo3.4 {
    public static void main(String[] args){ 
        //计算机每次运算的时候只能取两个数据运算
        Syste.out.println(1+2+3 +" world"+1+2+3); // 6world123  
        //过程:3+3 +" world"+1+2+3 > 6+" world"+1+2+3 > "6world"+1+2+3

        int a1 = 10;
        int b1 = 3;
        System.out.println(a1/b1); //3  
        double a2 = 12.0;
        int b2 = 3;
        System.out.println(a2/b2); //4.0

        //在java中做取模运算的时,结果的正负号是取决于被除数。
        System.out.println("结果:"+(10%3));  // 1
        System.out.println("结果:"+(10%-3)); // 1
        System.out.println("结果:"+(-10%3)); // -1
        System.out.println("结果:"+(-10%-3)); //-1

        //后自增在jvm的运行原理:因为后自增要使用到没有+1之前的值,那么jvm会先声明一个变量用于保存没有+1之前的值。
        //原理:
        //1. int temp = i; // 声明了一个临时变量用于记录了i没有加1之前的值
        //2. 自增 i = i + 1; 此时i=1
        //3. 返回temp,用作了表达式的结果
        //i的值发生了几次变化:i = 0 > 1 > 0
        int i = 0;
        i = i++; //后自增要使用到没有+1之前的值
        System.out.println("i= "+i);//i=0
    }
}

2、赋值运算符
赋值运算符:=+=-=*=/=%=

class Demo3.5 {
    public static void main(String[] args){ 
        int i = 10; // 把10赋予给i变量。
        i+=2;  // i = i+2; 
        System.out.println("i = "+i);//12

        byte b1 = 1;
        byte b2 = 2;
        //b2 = b2+b1; //报错。需要强制类型转换
        b2+=b1;  //b2=b2+b1;b2+=b1在编译的时候,java编译器会进行强制类型转换,不需要我们手动转换
        System.out.println("b2 : "+ b2);
    }
}

3、比较运算符
比较运算符: 比较运算符的结果都是返回一个布尔值的
== (判断是否等于)、!= (不等于)、> (大于)、< (小于)、>= (大于等于)、<= (小于等于)
其中,==用于比较两个基本数据类型数据(引用类型变量)的时候,比较的是两个变量所存储的值(引用类型变量所记录的内存地址)是否一致

class Demo3.6 {
    public static void main(String[] args){     
        byte b = 10;
        long l = 30;
        System.out.println(l>b); //true
        //两个不同类型的数据是否可以比较呢?可以的,但是两个不同类型的数据必须是兼用的数据
        //这个比较的过程会先把b转换了long类型的数据,然后再进行比较
        System.out.println('a'>50);//true
    }
}

4、逻辑运算符
逻辑运算符 :逻辑运算符的作用是用于连接布尔表达式的
& (与)、 | (或)、 ^ (异或)、 (非)、&& (短路与、双与)、|| (短路或、双或)
① 短路与和单与符号的相同与不同点:
相同点: 短路与和单与运算的结果是一样的
不同点: 使用短路与的时候,如果左边的布尔表达式为false,则不会在运算右边的布尔表达式,从而提高了效率。使用单与的时候,即使发现左边的布尔表达式为false,还是会运算右边的布尔表达式的。
◆ 只有左边的布尔表达式为false时,双与的效率才要高于单与的。
② 短路或与单或的相同点与不同点:
相同点:运算的结果是一致的
不同点:使用短路或的时候,当发现左边的布尔表达式为true时,则不会运算右边的布尔表达式。使用单或的时候发现左边的布尔表达式为true,还是会运算右边布尔表达式

5、位运算符
位运算符:位运算符就是直接操作二进制位的(把1看成true,0看成false)
& (与)、| (或)、^ (异或)、~ (取反)

class Demo3.7{
    public static void main(String[] args){
        System.out.println(6&3); // 2 
        System.out.println(6|3); // 7
        System.out.println(6^3); // 5
        System.out.println(~7);  // -8
    }
}

① 规律: 如果操作数A连续异或同一个操作数两次,那么结果还是操作数A
② 应用: 对数据加密(异或)使用异或对图片数据进行加密

import java.io.*;
class Demo3.8{
    public static void main(String[] args) throws Exception{
        //找到图片文件
        File inFile = new File("f:\\待加密的图片.jpg");
        File outFile = new File("d:\\加密的图片.jpg");
        //建立数据通道,让图片的二进制数据流入
        FileInputStream input = new FileInputStream(inFile);
        FileOutputStream output = new FileOutputStream(outFile);
        //边读,把读到的数据异或一个数据并写出
        int content = 0;//该变量用于存储读取到的数据
        while((content = input.read())!=-1){
             //如果没有到文件的末尾,那么继续读取数据
             output.write(content^12);
        }
        //关闭资源
        output.close();
        input.close();
    }
}

③ 位运算符可能会出现的笔试题目:
◆ 交换两个变量的值,不准出现第三方变量。

class Demo3.9{
    public static void main(String[] args){
        int a = 3;
        int b = 5;      
        /*
        方式1: 定义第三方变量
        int temp = a;  //3 
        a = b; //a = 5 
        b = temp;   
        */
        /*  
        方式2:相加法, 缺点: 两个int类型的数据相加,有可能会出现超出int的表示范围      
        a = a+b;  // a =8
        b = a-b; //b = 8 - 5 = 3
        a = a-b; // a = 8 - 3 = 5
        */
        /*      
        方式3: 可以使用异或。 缺点:逻辑不清晰       
        a = a^b;  // a = 3^5
        b = a^b;  // b = (3^5)^5 = 3
        a = a^b; //  a = (5^3)^3 = 5 
        */
        System.out.println("a = "+ a+" b= "+b);
    }
}

◆ 取出一个二进制数据的指定位数。要求读取该二进制数据的低4位
与运算

6、移位运算符
<<(左移)
规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移的位数
3<<1 = 3 *2(1) = 6
3<<2 = 3*2(2) = 12
3<<3 = 3*2(3) = 24
>>(右移)
规律:一个操作数在做右移运算的时候,实际上就是等于该操作数除以2的n次方,n就是右移的位数
3>>1 = 3 / 2(1) = 1
3>>2 = 3 / 2(2) = 0
>>>(无符号右移)
无符号右移与右移的区别:
进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补;如果操作数是一个负数,那么左边的空缺位使用1补。
而使用无符号右移的时候,不管是正数还是负数都统一使用0补。
④ 笔试题目:使用最高的效率算出2乘以8的结果。2<<3 = 2*2(3) = 16

class Demo3.10{
    public static void main(String[] args){
        //左移
        System.out.println(3<<1); // 6 
        System.out.println(3<<2); // 12
        System.out.println(3<<3); // 24         
        //右移
        System.out.println(3>>>1); // 1 
        System.out.println(3>>>2);  //0         
    }
}

7、三元运算符(三目运算符)
格式:布尔表达式?值1:值2
注意:使用三元运算符的时候,一定要使用该表达式返回的结果,或者是定义一个变量接收该表达式返回的结果。

class Demo3.11{
    public static void main(String[] args){
        int age = 26;
        String result = age>=18?"成年人":"未成年人";
        System.out.println(result);//成年人
    }
}

猜你喜欢

转载自blog.csdn.net/mr_gaoyang/article/details/79986384