03Java 基础:基础语法

Java 基础:基础语法

1、注释、标识符、关键字

注释

平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了。

注释并不会被执行,是给我们写代码的人看的

书写注释是一个非常好的习惯

Java中的注释有三种:

  • 单行注释

  • 多行注释

  • 文档注释

image-20220609171226691

image-20220609173347103

标识符

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

标识符注意点

  • 所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
  • 首字符之后可以是字母(A-Z或者a-z), 美元符($)、下划线(_)或数字的任何字符组合不能使用关键字作为变量名或方法名。
  • 标识符是大小写敏感的
  • 合法标识符举例: age、$salary_value、_1_value
  • 非法标识符举例:123abc、-salary、#abc

可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音,很Low

关键字

image-20220609174000807

2、数据类型

强类型语言

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

弱类型语言

Java的数据类型分为两大类

  • 基本类型(primitive type)
  • 引用类型(reference type)

image-20220609180026125

image-20220609175458184

image-20220609175346888

数据类型

public class DataClass {
    public static void main(String[] args) {

        /* 1、整数类型 */

        // byte 1 字节 8 位
        // short 2 字节 16 位
        // int 4 字节 32 位
        // long 8字节 64 位

        byte num1 = 127;
        short num2 = 32767;
        int num3 = 2147483647;
        long num4 = 9223372036854775807L;       // long 为了区别于其他的数据类型,需要在末尾天加“身份证”L,一般用的少的
        System.out.println(num1);
        System.out.println(num2);           // 最为常用的整数类型
        System.out.println(num3);
        System.out.println(num4);

        /* 2、浮点数类型 */
        // float 4 字节 32 位
        // double 8 字节 64 位
        float num5 = 10.0F;         // float 同样的为了区别于其他数据类型,需要在末尾填加“身份证”F,一般用的少的
        double num6 = 3.1415926;
        System.out.println(num5);
        System.out.println(num6);

        /* 3、字符型 */
        // char 2 字节 16 位
        char char1 = '中';
        System.out.println(char1);

        /* 4、布尔型 */
        //  boolean flag = false;
        boolean flag = true;
        System.out.println(flag);


    }
}

数据类型拓展

public class DataClassExpand {
    public static void main(String[] args) {

        // 整数型拓展:进制    (0b)二进制     (0)八进制     十进制     (0x)十六进制
        int num1 = 0b10;
        int num2 = 010;
        int num3 = 10;
        int num4 = 0x10;
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(num4);
        System.out.println("===============================================");

        // 浮点数拓展:银行业务怎么表示? 钱,
        // BigDecimal
        // float and boolean 是不精确的,是个大概值,  有限   离散     四舍五入     大约      接近但不等于
        // 最好完全不使用浮点数型进行浮点比较
        // 最好完全不使用浮点数型进行浮点比较
        // 最好完全不使用浮点数型进行浮点比较

        /* 实例1: 浮点数 与 运算得到的浮点数 大小不等 (约进位数不相同)*/
        float num5 = 10.1F;
        float num6 = 10.10000001F;           // 准确表示只有前8位
        double num7 = 1.00_0000_0000_0001 / 10;     // 准确表示只有在只有前17位
        double num8 = 10.0 / 100;
        System.out.println(num5 == num6); //true
        System.out.println(num7 == num8); //false

        /* 实例2: 浮点数值溢出,运算不精确 */
        float num9 = 12345678.0F;       //float的运算精确只有8位
        float num10 = num9 + 0.1F;
        System.out.println(num9 == num10);    //true
        System.out.println("===============================================");


        // 字符拓展:字符转换, unicode码(2字节), ASCLL码, 转义字符
        char char1 = 'a';
        char char2 = '中';
        System.out.println(char1);
        System.out.println((int) char1);     //强转类型
        System.out.println(char2);
        System.out.println((int) char2);

        // 所有的文字本质上还是数字
        // 编码Unicode 2字节 16位  0 - 65536  (A->65,a->97)
        // U0000  ~ UFFFF
        // a 的unicode码表示:97 转(十六进制) \u0061
        char char3 = '\u0061';
        System.out.println(char3);

        // 制表符 \t
        // 换行符 \n
        // 回车   \r
        String str1 = "hello world!";
        String str2 = "hello\tworld!";
        String str3 = "hello\nworld!";
        String str4 = "hello\rworld!";
        System.out.println(str1);   // hello world!
        System.out.println(str2);   // hello	world!
        System.out.println(str3);
        System.out.println(str4);   // world!
        System.out.println("===============================================");

        String str5 = "Hello World!";
        String str6 = "Hello World!";
        String object_s1 = new String("Hello World!");
        String object_s2 = new String("Hello World!");

        System.out.println(str5 == str6); // true
        System.out.println(object_s1 == object_s2); //false,相同参数的类实例,不相等
        // 对象,从内存分析

        // 布尔值拓展:
        boolean flag = true;
        if(flag==true){};	//新手
        if(flag){};	//老手
        // Less is More!

    }
}

整数拓展:进制

  • 二进制:0b10
  • 八进制:010
  • 十六进制:0x10

什么是字节

  • 位: 是计算机内部数据储存的最小单位,11001100是一个八位二进制数。

  • 字节: 是计算机中数据处理的基本单位,习惯上用大写B来表示,

  • 字符: 是指计算机中使用的字母、数字、字和符号

1bit 表示 1位,
1B (byte,字节) = 8bit(位)
1Byte 表示一个字节 1B = 8b。

1024B=1KB
1024KB=1M
1024M=1G.

思考: 电脑的32位和64位的区别是什么呢 ?(寻址能力)

3、类型转换

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

image-20220609213600573

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

  • 强制类型转换
  • 自动类型转换
public class TypeConversion {
    public static void main(String[] args) {
        /* 类型转换
          低   - - - - - - - - - - - - - - - - - - ->   高
          byte,short,char -> int -> long -> float -> double    # 浮点最高
            - 强转类型:将容量高的转换为容量低的 (byte) short;       高 ---> 低
            - 自动转换:将小容量的转换为大容量的                     低 ---> 高
        */

        int num1 = 128;
        byte num2 = (byte) num1;    // 内存溢出,重新从最小的算
        System.out.println(num1);
        System.out.println(num2);

        double num3 = 1.000_0000_0000_0000_2;       // 准确识别17位
        double num5 = 1.000_0000_1;      //准确位数 8位
        float num4 = (float) num3;
        float num6 = (float) num5;
        System.out.println(num4);
        System.out.println(num6);
        System.out.println(num4 == num6); //true

        /*
        注意点:
            1、不能对布尔值进行转换
            2、不能将对象类型转换为不相干的类型
            3、将高容量类型转换为低容量类型时,是强制转换,
            4、可能会初选内存溢出,或者是精度问题!
        */

        /* 实例1: 高容量装换为低容量 (内存溢出,精度问题)*/
        System.out.println((int) 3.14F);
        System.out.println((int) -45.723);       //只取整数,小数溢出

        /* 实例2:: char 强转 int */
        char char1 = 'a';
        int int1 = char1 + 1;
        System.out.println((int) char1 + 1);
        System.out.println((char) int1);

        /* 操作较大的数时,注意,溢出问题!!! */
        int a = 10_0000_0000;
        int b = 20;
        long c = a*b;   //这里的原因是,它本身先运行后,才将结果赋值给c,所以c是获取溢出后的值
        System.out.println(a*b);    // -1474836480,内存溢出
        System.out.println(c);      // -1474836480,内存溢出


        //解决方式:在运算之前,将数据的其中一个值进行扩容。 后面的就通过自动转换变成精确值
        System.out.println((long)a*b);

        //标识long 与 float时,最好使用大写 L 和 F
    }
}

4、变量、常量

1变量

  • 变量是什么:就是可以变化的量!
  • Java是一种强类型语言,每个变量都必须声明其类型。
  • Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
// 数据类型  变量名=值;      可以使用逗号隔开来声明多个同类型变量。
type varName [=value] [{,varName[=value]}];

注意事项:

  • 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
  • 变量名必须是合法的标识符。
  • 变量声明是一条完整的语句,因此每一个声明都必须以分号结束

image-20220609223714319

public class Variable {
    // 这里可以声明 类变量(static)与 实例变量(原有类实例化)
    static final int GLOBAL_VAL = 200;      // 类常量,常量全大写 + _
    static int classVal = 100;      		// 类变量,使用驼峰原则
    String str1 = "Hello World!";   		// 实例变量: 实例这个词,就是说它本身就是一个 类的实例化对象, 从属于对象,于对象属性
    String name = "Redskaber";
    String test;        // null,除去普通的数据类型,其余的默认为null
    int int1;           // 0    int
    float float1;       // 0.0  浮点数

    public static void main(String[] args) {
        // 这里的范围即是局部变量的范围
        // public中的变量,只能在本{}内使用

        final int TEST_VAL = 20;    //局部常量
        int a = 10;     // 局部变量

        System.out.println(TEST_VAL);
        System.out.println(a);
        System.out.println(GLOBAL_VAL);
        System.out.println(classVal);
        
        // 类内部的public中想获取到类中的实例变量,首先new一个声明类,将会得到一个 类名数据类型 的对象 object
        Variable variable = new Variable();

        System.out.println(variable);   		// 对象
        System.out.println(variable.str1);	 	// 对象中的属性str1的属性值
        System.out.println(variable.name); 	  	// 对象中的属性str1的属性值

        //如果类变量没有声明对应的值,则会获取默认值
        System.out.println(variable.test);
        System.out.println(variable.int1);  	//这里前缀没有声明 static,所以只能通过 类.类变量 来获取
        System.out.println(variable.float1);  	//这里前缀没有声明 static,所以只能通过 类.类变量 来获取

        //可用通过:类.类方法 实现调用
        variable.add();

    }

    public void add(){
        // public内部没有定义的将会报错
        // System.out.println(a);
        System.out.println(GLOBAL_VAL);
    }
}

2常量

常量(Constant): 初始化(initialize)后不能再改变值! 不会变动的值。
所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。

final 常量名=值;
final double PI=3.14;

常量名一般使用大写字符。

变量命名规范

  • 所有变量、方法、类名:见名知意
  • 类成员变量: 首字母小写和驼峰原则:monthSalary
  • 局部变量: 首字母小写和驼峰原则
  • 常量: 大写字母和下划线: MAX_VALUE
  • 类名: 首字母大写和驼峰原则: Man, GoodMan
  • 方法名: 首字母小写和驼峰原则: run(), runRun()

5、运算符

Java语言支持如下运算符:

  • 算术运算符: + - * l % ++ --
  • 赋值运算符: =
  • 关系运算符: > < >= <= == != instanceof
  • 逻辑运算符: && || !
  • 位运算符: & | ^ ~ >> << >>>(了解!!! )
  • 条件运算符: ? :
  • 扩展赋值运算符: += -= *= /=

算术,关系运算符

package operator;

public class Operator {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        Operator operator = new Operator();     //new一个Operator类
        operator.arithmeticOperations(a, b);   //调用类方法
        operator.addConversion();              //调用类方法
        operator.relationOperations();         //调用类方法

    }

    public void arithmeticOperations(int a, int b) {
        // 算术运算符: + - * /
        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / (double) b);    // / 取模运算, int/int ==> int   int/(double)int ==>double
    }
    public void addConversion(){
        long a = 233434343434L;
        int b = 1234567890;
        short c = 34;
        byte d = 12;
        float e = 1.23F;
        double ee = 1.23;
        System.out.println(a+b+c+d); // long
        System.out.println(b+c+d);  // int
        System.out.println(c+d);    // int

        System.out.println(e-ee);    // double   1.9073_4863_4588_857E-8
        System.out.println(e/ee);    // double   1.0000_0001_5506_8995      17位

        System.out.println(b+a+e+ee);   // double
        System.out.println(b+a+e);   // float
        System.out.println(b+b);   // int溢出

        /* 如果运算中没有int类型,则不管结果大小,其结果类型都是int,
           如果运算中有int类型,并且运算结果是在int范围内,则还是可以精确的使用int类型,
           如果运算中有int类型,但是运算结果超出int范围,则会出现内存溢出现象。溢出的部分重新从最小的开始计算。
           如果运算中有大于int类型的,那么运算的结果就是容量最高类型。(byte,short,char->int->long->float->double)
        */
    }
    public void relationOperations(){
        //关系运算符
        int a = 10;
        int b = 20;
        int c = 11;

        System.out.println(a>b);
        System.out.println(a==b);
        System.out.println(a<b);
        System.out.println(a!=b);
        System.out.println(c%a);    // 取余运算 11%10 ~ 1

    }
}
  • 如果运算中没有int类型,则不管结果大小,其结果类型都是int,

  • 如果运算中有int类型,并且运算结果是在int范围内,则还是可以精确的使用int类型,

  • 如果运算中有int类型,但是运算结果超出int范围,则会出现内存溢出现象。溢出的部分重新从最小的开始计算。

  • 如果运算中有大于int类型的,那么运算的结果就是容量最高类型。(byte,short,char->int->long->float->double)

自增减运算

package operator;

public class SelfIncreasingAndDecreasing {
    public static void main(String[] args) {
        // 自增(a++,++a)自减(a--,--a)
        int a = 10;
        int c = a++;    // int c = a; a += 1;
        int d = ++a;    // a +=1 ; int c = a;

        System.out.println(a);
        System.out.println(c);
        System.out.println(d);
        
        // 算术运算Math,幂运算
        double num1 = Math.pow(2,3);
        System.out.println(num1);
    }
}

逻辑运算符

package operator;

public class Logic {
    public static void main(String[] args) {
        // 与(and) 或(or) 非(取反)
        // 逻辑运算: 与(A&&B) 或(A||B) 非,取反(!(A&&B))

        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)); // 非运算,真假相反

        // 短路运算:当前面部分的条件可以得出结果为真时,后序的运算将不会再执行,直接得出结果。
        /* 实例1、 A&&B */
        int num1 = 10;
        boolean boo1= (num1>12)&&(num1++<11);   // num>12 -yes-> pass
        System.out.println("(num1>num2)&&(num1+num2>num2):"+ boo1); //false
        System.out.println(num1);  // 10

        /* 实例2、A||B */
        boolean boo2 = (num1>9)||(num1--<9);  //num1>9 -yes-> pass
        System.out.println("(num1>9)||(num1--<9):"+boo2);  //true
        System.out.println(num1);  // 10

    }
}

位运算符

package operator;

public class Bit {
    public static void main(String[] args) {
        // 位运算:&   |    ^    ~     >>     <<     >>>(了解!!! )
        // & | 与逻辑运算类似(将0是作为false,1是作为true)
        // so
        //      A&B : AB全1为1
        //      A|B : AB全0为0
        //      A^B : AB相同为0,不同为1
        //      ~B :  0为1,1为0
        /*
            A   0011 1100
            B   0000 1101
            -------------
            A&B 0000 1100   (一假为假)
            A|B 0011 1101   (一真为真)
            A^B 0011 0001   (同为0)
            ~B  1111 0010   (取反值)

        与面试相关的位运算题:
            - 2*8怎么运算最快?

            2*8=16  2*2*2*2              (左移)<<    >>(右移)
        */
        

        /*
        位运算的效率是极极高的!!(底层,与底层的二进制打交道的)
        << *2
        >> /2
        左移增大了,反之右移减小
        0000 0000   0
        0000 0001   1
        0000 0010   2
        0000 0100   4
        0000 1000   8
        0001 0000   16
        */  // 当1左移一位时,数值增大一倍
        System.out.println(2<<3);

条件运算符:三元运算符 ?:

package operator;

public class Ternary {
    public static void main(String[] args) {
        // 三元运算:参数= 条件 ? 结果1:结果2;
        // a = z ? x:y;         <==> a = x if z else y
        // 如果 z 为true,则x,否则y
        int source = 60;
        String grade = source >= 60 ? "合格" : "不合格";
        System.out.println(grade);
    }
}

赋值运算符拓展:+ String () 优先级

package operator;

public class Ternary {
    public static void main(String[] args) {
        Ternary ternary = new Ternary();
        ternary.SelfAutoExpend();
    }

    public void SelfAutoExpend() {
        // 自增型拓展
        int a = 10;
        int b = 20;
        a += 10;    // a = a+10;
        b -= 10;    // b = b-10;
        System.out.println(a);
        System.out.println(b);

        /* 字符串拓展 字符串连接符 “+” */
        /* 实例1、 String + int类型 --> (String)int类型 ---> +  =String */
        System.out.println("" + a + b);
        System.out.println(a + b + "");
        
        // 为避免出现类型不同的相互运算导致错误,这里严肃的提出了优先运算符 "()"
        System.out.println("" + (a + b));   		// 字符串与数值+,默认强转字符串类型
        System.out.println(getType((a + b)));       // 数值的运算的结果还是数值类型,class java.lang.Integer

    }

    private static String getType(Object a) {
        return a.getClass().toString();
    }
}

6、包机制、JavaDoc

包机制

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

包语句的语法格式为:

package pkg1[. pkg2[. pkg3...]];

一般利用公司域名倒置作为包名; www.baidu.com ==> com.baidu.www

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

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

创建多级目录(包)

  • 汉化后的

    • 点击左侧菜单栏的齿轮图标

    • 取消掉树外观下压缩空的中间软件包

  • 原版的

    • 点击左侧菜单栏的齿轮图标
    • Tree Appearance
      • 取消掉 Compact Middle Pakages

image-20220612222514645

包的导入

image-20220612223557859

JavaDoc

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

参数信息

  • @author 作者名
  • @version 版本号
  • @since 指明需要最早使用的jdk版本
  • @param 参数名
  • @return 返回值情况
  • throws 异常抛出情况

javadoc 生成文档

编码兼容:-encoding utf-8 -charset utf-8

# javadoc 参数 doc.java
$javadoc -encoding utf-8 -charset utf-8 javadoc.java
posted @ 2022-06-12 23:20  Redskaber  阅读(36)  评论(0)    收藏  举报