Java-day-03

package com.ly.java.Main03;

@SuppressWarnings("all")
/**
 * 关于Java中的数据类型:
 * 1、数据类型的作用是什么?
 * 程序当中有很多数据,每一个数据都是相关类型的,不同数据类型的数据占用空间大小不同。
 * 数据类型的作用随时知道JVM在运行程序的时候给该数据分配多大的内存空间
 * 2、Java中的数据类型包括两种:
 * * 基本数据类型
 * * 引用数据类型
 * 3、关于基本数据类型:
 * * 基本数据类型包括四大类八小种:
 * 第一类:整数型、byte,short,int,long
 * 第二类:浮点型、float,double
 * 第三类:布尔型、boolean
 * 第四类:字符型、char
 * 4、字符串”abc“不属于基本数据类型,属于引用数据类型,字符属于基本数据类型:
 * * 字符串使用双引号"abc"
 * * 字符使用单引号’a‘
 * 5、八种基本数据类型各自占用空间大小是多少?
 * 基本数据类型   占用空间大小
 * -----------------------------------------------------------
 *      byte        1
 *      short       2
 *      int         4
 *      long        8
 *      float       4
 *      double      8
 *      boolean     1
 *      char        2
 * 6、计算机在任何情况下都只能识别二进制。0 or 1 : 断开 or 接通
 * 7、什么是二进制?
 *      * 数据的一种表现形式。十进制表示满十进一原则。二进制表示满二进一原则。
 * 8、字节(byte) :
 *      1 Byte = 1024 bit【1哥字节 = 8个比特位】1个比特位表示一个二进制位:1/0
 *      1 KB = 1024 Byte
 *      1 MB = 1024 KB
 *      1 GB = 1024 MB
 *      1 TB = 1024 GB
 *      1 TB = 1024 * 1024 * 1024 * 1024 * 8
 * 9、整数型当中的byte类型,占用1个字节,所以byte类型的数据占用8个Byte
 *      * 关于Java当中的数字类型,数字都是有正负之分的,所以在数字的二进制当中有一个二进制位被称为符号位。并且这个符号位在所有二进制位的最左边,0表示正数,1表示负数。
 *      * byte类型最大值:01111111【10000000(2)- 1 】
 * 10、计算机只认识二进制,那么计算机怎么表示现实世界的文字的?
 *      * 八种数字类型数据当中,byte、short、int、long、float、double、boolean这7种数据类型计算机在表示的时候比较容易,因为底层都是数字,十进制的数字和二进制之间“默认”情况下是不存在任何转换关系的。
 *      * 为了让计算机可以表示现实世界当中的文字,我们需要进行人为的干涉,需要人负责提前制定好"文字"和"二进制"之间的对照关系。这种对照关系被称为:字符编码。
 *      * 计算机最初只支持英文,最先出现的字符编码是ASXII码,当编码和节码的时候采用同一套/对照表,不会出现乱码。当时解码和编码的时候采用的不是同一套对照表,会出现乱码问题。
 *      * 随着计算机的发展,后来出现了一种编码方式,是国际化标准组织ISO指定的,这种编码方式支持西欧语言,向上兼容ASCII吗,任然不支持中文。这种编码方是:ISO-8859-1,又被称为latin-1
 *      * 随着计算机得向亚洲发展,计算机开始支持中文,日文,韩文等国家文字,其中支持简体中文的编码方式:GB1212 < GBK < GB18030
 *      * 支持繁体中文:大五码 <big5>
 *      * 后来出现了一种编码方式统一了全球所有的文字,容量较大,这种编码方式叫做:unicode编码,unicode编码方式有多种具体的实现:
 *          - UTF - 8
 *          - UTF - 16
 *          - UTF - 32
 *      * Java语言源代码采用unicode编码方式,所以“标识符”可以用中文。
 *      * 现在是实际开发中,一般使用UTF-8编码方式较多,
 * 11、八种基本数据类型的取值范围:
 *      类型                      取值范围
 *      -----------------------------------
 *      byte                    [-128 ` 127]
 *      short                   [-32768 ` 32767]
 *      int                     [-2147483648 ` 2147483647]
 *      long
 *      float
 *      double
 *      boolean                 [true , false]
 *      char                    [0 ` 65535]
 *      注意:shorthechar所表示的种类总数是一样的,只不过char可以表示更大的正整数,因为char没有负数
 *
 */

/**
 * 对于八种基本数据类型的默认值
 */

public class DataTypeTest01 {
    public static void main(String[] args) {
/**
 * 定义一个char类型的变量,起名c,同时赋值字符'a'
 */
        char c = 'a';
        System.out.println(c);
        /**
         * 一个中文占用2个字节,char类型正好是2个字节
         * 所有Java中的char类型可以存储一个中文字符
         */
        char x = '国';
        System.out.println(x);
        /**
         * "a" 是字符串类型
         * k变量是char类型
         * 类型不兼容,编译错误
         * char k = "a";
         */

    }
}
package com.ly.java.Main03;

/**
 * 关于八种基本数据类型的默认值
 * 数据类型                             默认值
 * ------------------------------------------
 * byte,short,int,long               0
 * float,double                        0.0
 * Boolean                             false
 * char                                \u0000
 */
@SuppressWarnings("all")
public class DataTypeTest02 {
    static int k = 1000;
    /**
     * 变量还是遵守这个语法,必须先声明,再赋值,才能访问。
     * 成员变量没有手动赋值系统会默认赋值【局部变量不会】
     */
    static int f;//成员变量

    public static void main(String[] args) {
        /*
        int i ;//局部变量
        System.out.println(i);
        */
        System.out.println(k);
        System.out.println(f);//0
    }
}
package com.ly.java.Main03;

/**
 * 关于Java语言当中的char类型:转义字符\
 * 转义字符出现在特殊字符之前,后将之变为字面意义上的普通字符
 * \n 换行符
 * \t 制表符
 * \' 普通的单引号
 * \\ 普通的反斜杠
 * \" 普通的双引号
 */
@SuppressWarnings("all")
public class DataTypeTest03 {
    public static void main(String[] args) {
        //普通的n字符
        char c1 = 'n';
        System.out.println(c1);
        /**
         * 属于char,作用为代表一个换行符
         * 反斜杠在Java语言当中具有转义功能。
         */
        char c2 = '\n';
        System.out.println(c2);

        char x = 't';
        System.out.println(x);
        /**
         * 在控制台上输出“反斜杠字符”
         */
        char k = '\'';
        System.out.println(k);
        /**
         * 负负得正
         * 第一个反斜杠具有转移功能,将后面的反斜杠转义为普通的反斜杠字符。
         * 结论:在Java当中两个反斜杠代表一个普通的反斜杠字符
         */
        char s = '\\';
        System.out.println(s);

        /**
         * 在控制台上输出一个普通的单引号字符
         * cahr a = '';//Java中不允许这样编写程序,编译报错
         * char a = ''';
         */
        /**
         * JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式
         * 在命令行输入native2ascii,回车,然后输入文字之后回车就可以得到native2ascii编码
         *
         */
        char z = '中';
        System.out.println(z);
    }
}
package com.ly.java.Main03;

/**
 * 关于Java语言当中的整数型:
 * 数据类型                 占用空间大小             默认值             取值范围
 * ---------------------------------------------------------------------------------
 * byte                        1                      0                【-128 · 127】
 * short                       2                      0                【-32768 · 32767】
 * int                         4                      0                【-2147483648 · 2147483647】
 * long                        8                      0L
 * 1、Java语言当中的”整数型字面值“被默认当作int类型来处理。要让这个”整数型字面值“被当做long类型来处理的话,需要在”整数型字面值“后面添加1/L,建议使用大写的L
 * 2、Java语言当中的整数型字面值有三种表示方式:
 * 第一种方式:十进制【是一种缺省默认的方式】
 * 第二种方式:八进制【在白那些八进制整数型字面值的时候需要以0开始】
 * 第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
 */
@SuppressWarnings("all")
public class DataTypeTest04 {
    public static void main(String[] args) {
        int a = 10; // 十进制
        int b = 010; //八进制
        int c = 0x10;//十六进制
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(a + b + c);//34
        System.out.println("And:" + a+"/t"+ b + c);
        /**
         * 123这个整数型字面值时int类型
         * i变量声明的时候也是int类型
         * int类型的123赋值给int类型的变量i,不存在类型转换
         */
        int i = 123;
        System.out.println(i);
        /**
         * 456整数型字面值被当作int类型,占用4个字节
         * x变量在声明的时候是long类型,占用8个字节
         * int类型的字面值456赋值给long类型的bianlx,存在类型转换
         * int类型是小容量
         * long类型是大容量
         * 小容量可以自动转换成大容量,称为自动类型转换机制。
         */
        long x = 456;
        System.out.println(x);
        /**
         * 2147483647字面值是int类型,占用4个字节
         * y是long类型,占用8个字符,自动类型转换
         */
        long y = 2147483647;
        System.out.println(y);
        /**
         * 在Java语言当中,等号的右边的数字会被默认为int类型范围
         * 2147483648被当作int类型4个字节处理,但是这个字面值超出int类型范围
         * long z = 2147483648;
         * 解决以上问题只需要在数据后添加一个L
         * z是long类型变量,以下程序不存在类型转换
         */
        long z = 2147483648L;
        System.out.println(z);
    }
}
package com.ly.java.Main03;

@SuppressWarnings("all")
/**
 * 关于Java中的整数型
 * byte
 * shor
 * int
 * long
 */
public class DataTypeTest05 {
    public static void main(String[] args) {
        /**
         * 100L是long类型字面值
         * x是long类型变量
         * 不存在类型转换,直接赋值
         */
        long x = 100L;
        /**
         * x变量是long类型,8个字节
         * y变量是int类型,4ge字节
         * 大容量不能直接赋值给小容量
         * int y = x;
         */
        /**
         * 大容量转换还曾小容量,需要强制类型转换
         * 强制类型转换需要加强制类型转换符
         * 加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度。
         * 所以强制类型转换谨慎使用,应为损失精度之后可能损失很严重
         * 强制转换原理:
         *      原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
         *      强制转换之后的数据: 00000000 00000000 00000000 01100100
         *      将左边的二进制砍掉【所有的数据强制转换的时候都是这样完成的】
         */
        int y = (int) x;
        System.out.println(y);
        /**
         * 原始数据:00000000  00000000  00000000  10000000  00000000  00000000  00000000  00000000
         * 强制转换之后的数据:10000000  00000000  00000000  00000000
         * 10000000  00000000  00000000  00000000目前这个数据存储在计算机内部,计算机存储数据都是采用补码的形式存储在计算机当中
         * 所以10000000  00000000  00000000  00000000现在是一个补码形式
         * 将以上的补码转换到原码就是最终的结果
         */
        long k = 2147483648L;
        int e = (int) k;
        System.out.println(e);//损失精度非常严重,结果是负数
        /**
         * byte b = 50;是无法编译成功的;50是int类型的字面值,bshibyte的变量,显然是大容量转换成小容量byte
         * 大容量转换成小容量是需要添加强制类型转换符的,以下程序没有添加强转符号,所以编译报错
         */
        byte b = 50;

        byte c = 127;
        /**
         * byte b = 50;
         * byte c = 127;
         * 编译通过的原因,但是在实际编译的时候,以下代码编译通过了,这说明在Java语言当中,当一个整数型字面值没有超过byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量
         * byte b1 = 128;
         * 编译报错:128这个int类型的字面值已经超出了byte类型的取值范围,不能直接赋值给byte类型的变量
         * 纠正错误,需要使用强制类型转换符
         * 但是一定会损失精度
         *
         */
        byte b1 = (byte) 128;//-128
        /**
         * 当一个证书字面值没有超出byte,short,char的取值范围,这个字面值可以直接赋值给byte,short,char类型的变量。这种机制sun允许了,目的就是为了方便程序员的编程。
         */
    }
}
package com.ly.java.Main03;

/**
 * 关于浮点型数据类型:
 * float单精度【4个字节】
 * double双精度【8个字节,精度较高】
 * <p>
 * double的精度太低【相对来说】,不适合做财务软件。
 * 财务设计到钱的问题,要求精度较高,所以SUN在基础SE类库当中为程序员准备了精确度更高的类型,它是:Java.math.BigDecimal
 * 其实Java程序中SUN提供了一套庞大 的类库,Java程序员是基于这套基础的类库进行开发的。所以要知道Java的Se类库的字节码在哪里,要知道Java的SE类库的源码在哪儿?
 * * SE类库字节码:
 * * SE类库源码
 * 例如:String.Java和String.class
 * 我们的(String[] args) 中的 String 使用的就是String.class字节码文件
 * 注意:double和float在计算机内部二进制存储的时候存储的都是近似值。
 * 在Java语言当中,所有的浮点型字面值【3.0】,默认被当作double类型来处理,想要该字面值当作float类型来处理,需要在字面值后面添加F/f
 */
@SuppressWarnings("all")
public class DataTypeTest06 {
    public static void main(String[] args) {
        /**
         * 3.0是double类型 的字面值
         * d是double类型的变量
         * 不存在类型转换
         */
        double d = 3.0;
        System.out.println(d);
        /**
         * 5.1是doubke类型的字面值
         * f是float类型的变量
         * 大容量转换成小容量需要强制类型转换符,所以以下编译错误。
         * float f = 5.4;
         * 解决方案:
         * 第一种方式:强制类型转换
         * float f = (float)5.4;
         * 第二种方式:没有类型转换
         */
        float f = 5.4f;
    }
}
package com.ly.java.Main03;

/**
 * 关于布尔型数据类型:
 * boolean
 * 在Java数据类型当中boolean类型自由两个值:true,false,没有别的值。
 * 不像C语言当中,0和1可以表示假和真。
 * 在底层存储的时候boolean类型占用1个字节,因为实际存储的时候false底层是0,true底层是1.
 * 布尔类型在实际开发当中非常重要,经常使用在逻辑运算和条件控制语句当中。
 */
@SuppressWarnings("all")
public class DataTypeTest07 {
    public static void main(String[] args) {
        /**
         * boolean flag = 1;
         * 编译错误,不兼容的类型
         * boolean loginSuccess = true;
         */

        boolean loginSuccess = false;
        if (loginSuccess){
            System.out.println(0);
        }else {
            System.out.println(1);
        }
    }
}
package com.ly.java.Main03;

/**
 * 关于基本数据类型之间的互相转换:
 *      1、八种基本数据类型当中除布尔类型之外,剩下的7种类型之间都可可以互相转换
 *      2、小容量向大容量转换,称为自动类型转换,容量从大到小排序:
 *          byte < short < int < long < float < double < char <
 *          注:任何浮点型类型不管占用多少个字节,都比整数型容量大。
 *          char和short可表示的种类数量相同,但是char可以取更大的正整数
 *      3、大容量转换成小容量,必须加强制类型转换符,才能进行强制类型转换,程序才能编译通过,但是有可能还会损失精度
 *      4、当整数字面值没有超出byte,short,char的取值范围,额可以赋值给byte,short,char类型的变量。
 *      5、byte,short,char混合运算的时候,各种先转换成int类型再运算。
 *      6、多种数据类型混合运算,先转换成容量最大的那种类型再做运算。
 *      注意:
 *          byte b = 3;可以编译通过,3没有超出byte的取值范围
 *          int i = 10;
 *          byte b = i / 3;编译报错,编译器只检查语法,不会“运算”i / 3
 *          编译器只检查语法,在实际编译过程中不会运算,不要在编译器参杂运行
 */
@SuppressWarnings("all")
public class DataTypeTest08 {
    public static void main(String[] args) {

    }
}
package com.ly.java.Main03;

/**
 * 关于Java编辑器中运算符之:算术运算符
 * + - * / % -- ++
 * 注意:
 * 一个表达式当中,有多个运算符,运算符有优先级,不确定的加小括号,优先级得到提升。
 * 没必要可以去记运算符的优先级
 */
@SuppressWarnings("all")
public class OperatorTest01 {
    public static void main(String[] args) {
        int i = 10;
        int j = 5;
        System.out.println(i + j);//15
        System.out.println(i / j);//2
        System.out.println(i * j);//50
        System.out.println(i - j);//5
        System.out.println(i % j);//0
        /**
         * 关于Java++运算符
         * ++运算符就是让变量加1,可以出现在变量的前面,++无论出现在变量前还是变量后
         * 只要++运算结束,该变量中的值一定会自加1
         */
        for (int k = 1; k < 10; k++) {
            for (int l = 10; l < 21; l++) {
                System.out.println(l);
            }
            System.out.println(k);
        }
    }
}
package com.ly.java.Main03;

/**
 * 关系运算符:
 * >   >=  <   <=  ==  !=
 * = 是赋值运算符
 * == 是关系运算符
 * 关系运算符的运算结果一定是布尔类型:true/false
 * 变量中保存的值之间的比较
 */
@SuppressWarnings("all")
public class OperatorTest02 {
    public static void main(String[] args) {

        int a = 10;
        int b = 10;

        System.out.println(a > b);
        System.out.println(a >= b);
        System.out.println(a < b);
        System.out.println(a <= b);
        System.out.println(a == b);
        System.out.println(a != b);


    }
}
package com.ly.java.Main03;

/**
 * 逻辑运算符:
 * &    |    !    ^      &&       ||
 * 与   或   非   异或    短路与    短路或
 * 1、逻辑运算符要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型
 * 2、短路与和逻辑与的最终结果是相同的,只不过短路与存在短路现象。
 * 3、短路或和逻辑或的最终结果是相同的,只不过短路或存在短路现象。
 * 4、什么时候发生短路现象?
 * 5、什么时候选择使用逻辑与运算符?什么时候选择使用短路与运算符?
 */
@SuppressWarnings("all")
public class OperatorTest03 {
    public static void main(String[] args) {
        System.out.println(5 > 3 & 5 > 2);
        System.out.println(5 > 3 & 5 > 6);
        System.out.println(5 > 3 | 5 > 6);

        System.out.println(true & true);
        System.out.println(true & false);
        System.out.println(true & true);
        System.out.println(true & false);

        System.out.println(true | false);
        System.out.println(true | false);

        System.out.println(!false);
        System.out.println(!true);

        System.out.println(true ^ false);
        System.out.println(false ^ true);

        /**
         * 逻辑与和短路与
         */
        int x = 10;
        int y = 8;
        System.out.println(x < y & ++x < y);
        System.out.println(x);
        /**
         * 由于&&前面的判定结果已经是false,所以后续都得执行程序就不会再执行了
         * x < y 结果是false,整个表达式结果已经确定是false,所以后面的表达式没有再执行,从某个角度看,短路与更智能。由于后面都得表达式可能不执行
         * 所以执行效率较高,这种方式在实际的开发中使用较多。短路与比逻辑与使用的多。短路与更常用。
         * 在某些特殊的业务逻辑当中,要求两边的算子必须全部执行,此时必须使用逻辑与,不能使用逻辑与,
         * 使用短路与可能导致右边的表达式不执行。
         */
        int x1 = 10;
        int y1 = 8;
        System.out.println(x1);
        System.out.println(x1 < y1 && ++x1 < y1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游荡在雾中的霾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值