注释

  • Java中注释有三种:单行注释、多行注释、文档注释
public class HelloWorld {
    public static void main(String[] args) {
        // 单行注释
    		System.out.println("Hello,World!"); // 输出一个HelloWorld
      
        /*
         * 多行注释,
         * 可以注释一段文字
         */
      
        /* 文档注释:JavaDoc  /**回车
         * 用法:
         * 1.用在类的外面,用于对类解释说明
         * 2.写在方法上面,对方法解释说明
				 * 3.解释说明成员变量
         */
        /**
         * @Description HelloWorld
         * @Author BruisesL
         */
    }
}

标识符

Java所有的组成部分都需要名字。类名、变量名、以及方法名都被称为标识符。

  • 所有的标识符都应该以 字母(A-Z 或者 a-z)、美元符($)、下划线(_) 开始

  • 首字符之后可以是 字母(A-Z 或者 a-z)、美元符($)、下划线(_) 或数字的任何字符 组合

  • 不能使用关键字作为变量名或方法名

  • 标识符是大小写敏感的

  • 类名命名必须大驼峰。大驼峰:首字母大写,后面每个单词首字母大写。 例如:UserManagement

  • 方法名、变量名小驼峰。小驼峰:首字母小写,后面每个单词首字母大写

    例如:userName

  • 合法标识符举例:age、 $salary、_value、__1_value

  • 非法标识符举例:123abc、-salary、 #abc

  • 关键字

Java关键字

分隔符

  1. 分号( ; ):语句的分割,表示一句话结束,好比使用的句号。

  2. 花括号( {} ):表示一个代码块,是一个整体,花括号要成对使用。

  3. 方括号( [] ):定义数组和访问数组元素时使用。

  4. 圆括号( () ):使用很广泛,具体用到细讲。

  5. 圆点( . ):类和对象访问它的成员时使用,从属关系。

  6. 空格 [ ]:把一整条语句分割成几段,空格的次数不限制,一般单词之间一个空格即可。

什么是字节

  • 位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数
  • 字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示
  • 1B(byte) = 8bit
  • 字符:是指计算机中使用的字母、数字、字和符号

数据类型

Java是强类型语言,要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用

Java的数据类型分为两大类:

  • 基本类型(primitive type)

    • 数值类型
      • 整数类型

        • byte占1个字节范围:-128到127
        • short占2个字节范围:-32768到32767
        • int占4个字节范围:-2147483648到2147483647
        • long占8个字节范围:-9223372036854775808到9223372036854775807
      • 浮点类型

        • float占4个字节

          tips:float是离散的,具有舍入误差,接近但不等于

        • double占8个字节

        tips:

        1. double 和 float 的区别是double精度高,有效数字16位,float精度7位(可提供7位或8位有效数字,构成包括符号位、指数位和尾数位)。但double消耗内存是float的两倍,double的运算速度比float慢得多,能用单精度时不要用双精度。

        2. 浮点的误差来自十进制小数跟二进制小数之间的转换。如果这个转换对你具体的应用来说不是必须的,那么你就完全可以用浮点。

      • 字符类型char占2个字节,数据需使用单引号。

      • boolean类型:占1位,其值只有true和false两个

    1public class Demo01 {
        public static void main(String[] args) {
            // 八大基本数据类型
    
            // 整数
            int num1 = 10; // 最常用
            byte num2 = 20;
            short num3 = 30;
            long num4 = 30L; // long类型要在数字后加L
    
            //小数,浮点数
            float num5 = 40.1F; // float类型要在数字后加F或f
            double num6 = 3.1415926;
    
            // 字符
            char name = 'A';
            // 字符串,String不是关键字,是类
            String namea = "BruisesL";
    
            // 布尔值:是非
            boolean flag = true;
            // boolean flag = false;
        }
    }
    

    拓展

    public class Demo02 {
        public static void main(String[] args) {
            //整数拓展 进制问题:二进制0b 十进制 八进制0 十六进制0x
            int i1 = 10;
            int i2 = 010;//八进制的10
            int i3 = 0x1F;//十六进制的1F
    
            System.out.println(i1);
            System.out.println(i2);
            System.out.println(i3);
            System.out.println("======================================");
    
            //======================================//
            //浮点数拓展 银行业务中钱怎么表示
            //使用 BigDecimal  数学工具类
            float f = 0.1f;
            double d = 1.0/10;
    
            System.out.println(f==d);//false
            System.out.println(f);
            System.out.println(d);
            //结论:最好完全使用浮点数进行比较,即 float和float比较 double和double比较
            System.out.println("======================================");
    
            float f1 = 113213112112f;
            float f2 = f1+1;
            System.out.println(f1);
            System.out.println(f2);
            System.out.println(f1==f2);//true 是因为超过精度导致f1和f2相等
            System.out.println("======================================");
    
            double d1 = .0;
            for (int i = 1; i <= 11; i++) {
                d1 += .1;
            }
    
            double d2 = .1 * 11;
    
            System.out.println(d1);//由于二进制与十进制转化的时候存不下丢了值导致结果不是1.1
            System.out.println(d2);
            System.out.println(d1 == d2);
            System.out.println("======================================");
    
            //======================================//
            //字符串拓展
            char c1 = 'a';
            char c2 = '赜';
    
            System.out.println(c1);
            System.out.println((int)c1);//强制转换
            System.out.println(c2);
            System.out.println((int)c2);//强制转换
            //所有的字符本质还是数字
            //编码 unicode 占2字节 0 - 65536 每个字符都有对应的数字
            char c3 = '\u0061';//还可以直接用转义字符杠u+Unicode编码来表示一个字符
            System.out.println(c3);
            System.out.println("======================================");
    
            //======================================//
            //转义字符
            //例如:\t 制表符 \n 换行
            System.out.println("Hello\tWorld");
            System.out.println("Hello\nWorld");
            System.out.println("======================================");
    
            //======================================//
            //布尔值扩展
            boolean flag = true;
            if (flag==true){}
            if (flag){}
            //两句意思一样,代码要精简
        }
    }
    
  • 引用类型(reference type)

    • 类 class
    • 接口 interface
    • 数组 数据类型 []
    • 枚举 enum
  • 转义符

    • \r 表示回车符

    • \n 表示换行符

    • \t 表示 Table 键制表符

    • \b 表示退格键,相当于 Back Space 键 表示单引号

    注意:因为系统差异性,在不同的系统中 ,有时候 \r 起作用,有时候 \n 起作用。所以,一般建议:\r\n 连用,这样可以在任意系统中都可以换行。

变量、常量

  • 变量:Java变量是程序中最基本的存储单元,其要素包括变量名变量类型作用域

    type varName [=value] [{,varName[=value]}];
    //数据类型 变量名 = 值;可以使用 , 隔开来声明多个同类型变量,不过不建议一行定义多个变量。
    
    例:
    int num1 = 1 , num2 = 2;
    

tips:

  1. 每个变量都有类型,类型可以是基本类型,也可以是引用类型,例如String。

  2. 变量名必须是合法的标识符。

  3. 变量声明是一条完整的语句,因此每一个声明都必须以分号结束。

  • 变量作用域:类变量、实例变量、局部变量

    • 成员变量:成员变量分为类变量和实例变量,均存储在堆内存中。
    • 类变量:声明的位置在类里面、方法的外面,用static修饰,也叫静态变量,生命周期跟随类。
    • 实例变量:声明的位置在类里面、方法的外面,与类变量的区别是不用static修饰。
    • 局部变量:声明的位置在类里面、方法()或{}内,存储在栈内存中。

    tips:类变量和实例变量在加载类的时候会默认初始化,所以可以不赋值直接输出,输出值即为变量类型的默认值;而局部变量则不会被程序初始化,需要人工进行初始化,否则输出会报错;命名相同的变量不可存储在统一内存区域中。

    public class Demo04 {
        //属性:变量
    
        //类变量  static
        static double salary = 2500;
    
        //实例变量:从属于对象,如果不进行初始化,则为默认值,布尔值默认是false
        int age;
        String name;
        //main方法
        public static void main(String[] args) {
            //局部变量:必须声明和和初始化值
            //int i;
            //System.out.println(i);会报错,因为没有初始化i的值
            int i = 10;
            System.out.println(i);
    
            //变量类型  变量名字  = new Demo04();
            Demo04 demo04 = new Demo04();
            System.out.println(demo04.age);
            System.out.println(demo04.name);//除了基本类型,其他类型的初始值都是null
    
            double salary = 1; // 局部变量
            System.out.println(salary); // 输出时,优先找相同内存区域的变量,若找到,则直接输出,找不到时会换内存区域查找
            /*
             * 输出结果为
             * 10   
    				 * 0       age的值,因为没有赋值,int默认值为0
    				 * null    name的值,因为没有赋值,String默认值为null
    				 * 1.0
             */
        }
    }
    
  • 常量:初始化后不能再改变值。

    1. 所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。

    2. 常量名一般用大写字符。

    final 常量名 = ;
    final double PI = 3.14;
    
    public class Demo05 {
        //修饰符不区分前后,变量类型前的都是修饰符,下列语句等同 final static double PI = 3.14;
        static final double PI = 3.14;
    
        public static void main(String[] args) {
    
            System.out.println(PI);
        }
    }
    
  • 命名规范

    1. 类成员变量:首字母小写和驼峰原则:monthSalary除了第一个单词以外,后面的单词首字母大写lastName
    2. 局部变量:首字母小写和驼峰原则
    3. 常量:大写字母和下划线MAX_VALUE
    4. 类名:首字母大写和驼峰原则:Man, GoodMan
    5. 方法名:首字母小写和驼峰原则run(), runRun()

类型转换

  • 由于Java是强类型语言,所以要进行有些运算时,需要用到类型转换。

  • 运算中,不同类型的数据先转化为同一类型,然后进行运算。

    字节从低到高排列

    byte, short, char –> int –> long –> float –> double

    由高到低转换:强制转换,格式为 (类型)变量名

    由低到高转换:自动转换

    tips:

    1. 不能对布尔值进行转换

    2. 不能把对象类型转换为不相干的类型

    3. 在把高容量转换到低容量的时候,强制转换

    4. 转换的时候可能存在内存溢出,或者精度问题

    5. 当表达式中所有的变量类型小于int的时候,运算后的结果都会自动提升为int类型。当表达式中有变量类型大于int的时候,运算后的结果以表达式中精度最高的为主。

    public class Demo03 {
        public static void main(String[] args) {
            int i = 128;
            byte b = (byte)i;//强制转换格式 (类型)变量名  由高到低转换
            double d = i;//自动转换 由低到高
    
            System.out.println(i);
            System.out.println(b);//byte的范围是-128到127,所以128对于byte会内存溢出,输出的值会变
            System.out.println(d);
            System.out.println("==============================");
    
            //精度问题
            System.out.println((int)23.7);//23
            System.out.println((int)-45.89f);//-45
            System.out.println("==============================");
    
            char c = 'a';
            int i1 = c+1;
    
            System.out.println(c);
            System.out.println(i1);
            System.out.println((char)i1);
            System.out.println("==============================");
    
            //操作比较大的数的时候,注意溢出问题
            int money = 1_000_000_000;//数字之间可以用下划线分割
            int years = 20;
            int total1 = money*years;//-1474836480 计算时内存溢出了
            long total2 = money*years;//先进行int类型的计算,再将结果转换成long类型,所以也会溢出
            long total3 = ((long)money)*years;
    
            System.out.println(money);
            System.out.println(total1);
            System.out.println(total2);
            System.out.println(total3);
        }
    }
    

运算符

  • Java语言支持如下运算符

    算术运算符:+ , - , * , / , % (取余,模运算) , ++ , –

    赋值运算符:=

    关系运算符:> , < , >= , <= , == , != , instanceof

    逻辑运算符:&&(与) , ||(或) , !(非)

    位运算符:& , | , ^ , ~ , » , « , »>

    扩展赋值运算符:+= , -= , *= , /=

    条件运算符:? :

public class Demo01 {
    public static void main(String[] args) {
        //二元运算符
        //CTRL+D 复制当前行到下一行
        int a = 10;
        int b = 20;
        int c = 25;
        int d = 25;

        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println(a/b);
        System.out.println(a/(double)b);
        System.out.println("==================================");

        long q = 1234567890L;
        int w = 123;
        short e = 10;
        byte r = 8;

        System.out.println(q+w+e+r);//long
        System.out.println(w+e+r);//int
        System.out.println(e+r);//int
        //long以下运算结果都为int,long以上都为最高的那个类型
    }
}
public class Demo02 {
    public static void main(String[] args) {
        //关系运算符  返回的结果为 true/false
        int x = 10;
        int y = 20;

        System.out.println(x > y);//false
        System.out.println(x < y);//true
        System.out.println(x == y);//false
        System.out.println(x != y);//true
      	
      	// 若 == 两边是引用类型,那么比较的是他们内存地址是否相等
    }
}
public class Demo03 {
    public static void main(String[] args) {
        //++ -- 自增 自减(一元运算符)

        int a = 1;

        int b = a++;
        //a++  a = a + 1  先赋值,再运算a = a + 1
        System.out.println(a);

        int c = ++a;
        //++a  a = a + 1 运算完a = a + 1后再赋值
				
      	int i1 = 10;
        int i2 = 10;
      	System.out.println(i1++); // i++放在输出语句里面,执行流程:1、先取出i的值10 2、执行输出语句,输出10、执行自增1,i变为11
      	System.out.println(++i2); // 执行流程:1、先先取出i的值10 2、执行自增1,i变为11,执行输出语句,输出11
      	
        byte x = 128;
      	x++; // ++隐含强制转换,相当于 x = (byte)(x + 1),所以输出结果为-128溢出了
      	
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("=====================");

        //幂运算 2^3  2*2*2 = 8 很多运算,会使用一些工具运算
        double pow = Math.pow(2,3);
        System.out.println(pow);
    }
}
public class Demo04 {
    public static void main(String[] args) {
        //逻辑运算符:与(and) 或(or) 非(取反)
        boolean a = true;
        boolean b = false;

        System.out.println("a && b:"+(a && b));
        System.out.println("a || b:"+(a || b));
        System.out.println("! (a && b):"+(! (a && b)));

        //短路运算
        int c = 5;
        boolean d = (c < 4) && (c++ <= 10);
        System.out.println(d);
        System.out.println(c);//说明没执行c++,在判断了c<4为false后就终止了运算
    }
}
public class Demo05 {
    public static void main(String[] args) {
        /*
        位运算:二进制编码,对每一位进行运算
        & 与 都为1时为1,其余为0,有0则为0
        | 或 都为0时为0,其余为1,有1则为1
        ^ 异或 相同则为0,相反则为1
        ~ 取反

        例:
        A = 0011 1100
        B = 0000 1101

        A&B = 0000 1100
        A|B = 0011 1101
        A^B = 0011 0001
        ~B = 1111 0010
        ---------------------
        << 左移,<< 运算结果为*2
        >> 右移,>> 运算结果为/2
        均是值二进制值左移或右移

        例:如何最快计算2*8
        直接处理二进制数最快,2<<3
        0000 0000     0
        0000 0001     1
        0000 0010     2
        0000 0011     3
        0000 0100     4
        0000 1000     8
        0001 0000     16
         */
        System.out.println(2<<3);//2*2^3
        System.out.println(3<<1);//3*2^1
    }
}
public class Demo06 {
    public static void main(String[] args) {
        //扩展赋值运算符 +=,-=,*=,/=
        int a = 10;
        int b = 20;

        a+=b;//a = a + b
        System.out.println(a);
        a-=b;//a = a - b
        System.out.println(a);

      	// 赋值运算符有隐含的强制转换
      	byte c = 127;
      	c += 1; //等同于 c = (byte)(c + 1);
        System.out.println(c); // c = -128 数据溢出,未报错。

        //字符串连接符 +
        System.out.println(a+b);
        System.out.println(""+a+b);//1020 +左右出现String类型时,自动将后续运算判断成字符串连接符
        System.out.println(a+b+"");//30 从左至右运算
        System.out.println(a+b+""+a+b);//301020 从左至右运算,在判断+右侧有字符串时,会将后续的+判断为字符串连接符
    }
}
public class Demo07 {
    public static void main(String[] args) {
        // 三元运算符 ? :
        // x ? y : z  条件 ? 真 : 假
        // 如果x == true,则结果为y,否则为z
        int score = 80;
        boolean y = score < 60 ? false : true;
        String type = score < 60 ? "不及格" : "及格";
        System.out.println(y);
        System.out.println(type);
    }
}
  • 运算符优先级

    所有的数学运算都认为是从左向右运算的,Java语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。

    乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。

    Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。在同一个表达式中运算符优先级高的先执行。

    运算符的优先级

    使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。例如下面的表达式:

    (x-y)*z/5

    在这个表达式中先进行括号内的减法运算,再将结果与 z 相乘,最后将积除以 5 得出结果。整个表达式的顺序按照从左向右执行,比较容易理解。

    再来看一个复杂的表达式,如下所示。

    --y || ++x && ++z;

    这个表达式中包含了算术运算符和逻辑运算符。根据表 1 中列出的优先级,可以确定它的执行顺序如下:

    1. 先计算 y 的自减运算符,即 –y。
    2. 再计算 x 的自增运算符,即 ++x。
    3. 接着计算 z 的自增运算符,即 ++z。
    4. 由于逻辑与比逻辑或的优先级高,这里将 ② 和 ③ 的结果进行逻辑与运算,即 ++x && ++z。
    5. 最后将 ④ 的结果与 ① 进行逻辑或运算,即 –y||++x&&++z。

    如果没有上述对该表达式执行顺序的说明,第一眼看到它时将很难识别优先级。对于这类问题,可以通过添加小括号使表达的顺序更加清晰,而不用去查优先级表。如下所示为改进后的表达式。

    (--y)||((++x)&&(++z));

    例:

    int a = 5;

    int b = 4;

    int c = a++- –b*++a/b– »2%a–;

    问 c 的值是多少?

    tips

    1. 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
    2. 不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序。

包机制

  • 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。

  • 包语句的语法格式为:

    package pkg[. pkg2[. pkg3...]];
    
  • 一般利用公司域名倒置作为包名。 com.baidu.www

  • 为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用“import”语句可完成此功能

    import package1[.package2...].(classname|*);
    

JavaDoc

  • JavaDoc命令是用来生成自己API文档的

  • 参数信息

    • @author 作者名

    • @version 版本号

    • @since 指明需要最早使用的JDK版本

    • @param 参数名

    • return 返回值的情况

    • throws 异常抛出情况

  • 通过控制台生成java文件的文档(Idea可以直接生成)

    javadoc -encoding UTF-8 -charset UTF-8 Doc.java
    #Doc.java是java文件名