Java基礎(一)

Java基礎(一)

一、注釋

1. 單行注釋

//單行注釋

2. 多行注釋

/*
多行注釋
*/

3. 文檔注釋

/**
*文檔注釋
*/

二、標識符

關鍵字

Java所有的組成部分都需要名字。類名、變數名以及方法名都被稱為標識符。

Java關鍵字

abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements import
instanceof int interface long native
new package private protected public
return strictfp short static super
switch synchronized this throw throws
transient try void volatile while

注意點

  • 所有的標識符都應該以字母(A ~ Z或者a ~ z)、美元符($)、或者下劃線(_)開始

  • 首字元之後可以是字母(A ~ Z或者a ~ z)、美元符($)、下劃線(_)、或數字的任何字元組合

  • 標識符是大小寫敏感

  • 不能使用關鍵字作為變數名或方法名

  • 可以使用中文命名,但不建議,很low

三、數據類型

  • 強類型語言
    • 要求變數的使用要嚴格符合規定,所有變數都必須先定義後才能使用Java是強類型語言
  • 弱類型語言
    • Visual Basic、JavaScript
  • Java的數據類型分為兩大類
    • 基本類型(primitive type)
    • 引用類型(reference type)

基本數據類型

引用數據類型

拓展:什麼是位元組

  • 位(bit):是電腦內部數據儲存的最小單位,11001100是一個八位二進位數。

  • 位元組(byte):是電腦中數據處理的基本單位,習慣上用大寫B來表示

  • 1B(byte,位元組) = 8bit(位)

  • 字元:是指電腦中使用的字母、數字、字和符號

  • 1bit,1位

  • 1Byte,1個位元組,1Byte = 8bit,1B = 8b

  • 1024B = 1KB

  • 1024KB = 1MB

  • 1024MB = 1GB

程式碼:

import java.math.BigDecimal;

public class Demo02 {
    public static void main(String[] args) {
        //八大基本數據類型

        //整數,常用int
        int num1 = 10;      //取值範圍:-2147483648~2147483647
        byte num2 = 20;     //取值範圍:-128~127
        short num3 = 30;    //取值範圍:-32768~32767
        //long類型要在數字後面加L
        long num4 = 30L;    //取值範圍:-9223372036854775808~9223372036854775807

        //小數:浮點數        超過位數容易造成精度丟失
        float num5 = 50.132225f; //float類型要在小數後面加F
        double num6 = 3.1415926535897935;   //精度丟失

        //精度丟失解決方法
        BigDecimal bignum1=new BigDecimal("3.14159265358979323846");
        BigDecimal bignum2=new BigDecimal("2.54517924114656515555");
        System.out.println(bignum1);
        BigDecimal bignum3 = null;
        bignum3 = bignum1.add(bignum2);
        System.out.println(bignum3);


        //字元
        char name = 'A';
        /**
         * 字元串,String不是關鍵字,是類
         * String name = "董曉龍"
         */

        //布爾值(只有兩個值):是,非
        boolean a = true;
        boolean b = false;

        System.out.println("num1="+num1+"\nnum2="+num2+"\nnum3="+num3+"\nnum4="+num4+"\nnum5="+num5
                +"\nnum6="+num6+"\nname="+name+"\na="+a+"\nb="+b);
    }
}

輸出結果:

Demo02

public class Demo03 {
    public static void main(String[] args) {
        int i = 10;     //十進位
        int i2 = 010;   //八進位
        int i3 = 0x10;  //十六進位
        int i4 = 0b10;  //二進位
        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);

        //==============================================================
        //浮點數拓展?   銀行業務 ↓
        //使用BigDecimal數學工具類
        //==============================================================
        //float     能表示的字長有限,離散(不連續的),存在舍入誤差,只能無限接近但不等於
        //double
        //最好避免使用浮點數進行比較
        //最好避免使用浮點數進行比較
        //最好避免使用浮點數進行比較

        System.out.println("==================================");
        float f = 0.1f;
        double d = 1.0 / 10;
        System.out.println(f == d);
        System.out.println(f);
        System.out.println(d);
        System.out.println("==================================");
        float f1 = 23234423685f;
        float f2 = f1 + 1;
        System.out.println(f1 == f2);

        //==================================================================
        //字元拓展
        //==================================================================
        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(萬國碼)中都有相對應的編碼
        //97對應a,65對應A
        char c3 = '\u0061';
        System.out.println(c3);

        /**
         * 轉義字元
         * \t   製表符
         * \n   換行
         */
        System.out.println("hello\twolrd");
        System.out.println("hello\nworld");

        System.out.println("========================================");
        String s1 = new String("hello world");
        String s2 = new String("hello world");
        String s3 = "hello world";
        String s4 = "hello world";
        System.out.println(s1 == s2);   //false
        System.out.println(s3 == s4);   //true
        //後面學習記憶體後解釋原因

        //布爾值擴展
        boolean flag = true;
        if (flag==true){}
        if (flag){}         //flag默認為true
        //Less is more!

    }
}

輸出結果:

image

四、類型轉換

  • 由於Java是強類型語言,所以有些運算需要進行類型轉換
低 -------------------------------------------> 高
byte,short,char -> int -> long -> float -> double
  • 運算中,不同類型的數據先轉換為同一類型,然後再進行運算。

  • 強制類型轉換:

    • 由 高 -----> 低,需要強轉       強制類型轉換格式:(TYPE)varName
      
  • 自動類型轉化:

    • 由 低 -----> 高,自動轉換
      

程式碼:

public class Demo04 {
    public static void main(String[] args) {
        byte b1 = 127;          //低
        int i1 = b1;            //高     byte自動轉換為int
        int i2 = 128;           //高
        byte b2 = (byte) i2;    //低     超過byte範圍(-128~127),記憶體溢出
        System.out.println("i=" + i1 + "\nb=" + b1);
        System.out.println("i2=" + i2 + "\nb2=" + b2);
        /**
         * 由 高 -----> 低,需要強轉       強制類型轉換格式:(TYPE)變數名
         * 由 低 -----> 高,自動轉換
         */
        double d = i2;
        System.out.println("d=" + d);

        /*
        注意點:
        1. 不能對布爾值進行轉換
        2. 不能把對象類型轉換為不相干的類型
        3. 在把高容量轉換到低容量的時要強制轉換
        4. 轉換的時候可能存在記憶體溢出,或者精度問題
         */

        char c = 'a';
        int s = c + 1;
        System.out.println("s=" + s + "\n" + ((int) c) + "\n" + ((char) s));

    }
}

注意:

public class Demo05 {
    public static void main(String[] args) {
        //操作比較大的數時,注意記憶體溢出問題
        //JDK7隻後新特性:一個數字可以加下劃線分割
        int money = 10_0000_0000;
        int years = 20;
        int total = money * years;      //-1474836480   計算時記憶體溢出了
        long total1 = money * years;    //-1474836480   默認先以int型計算再轉換成long型,轉換之前就已經記憶體溢出
        long total2 = money * (long) years; //先轉換再計算
        System.out.println(total2);
    }
}

五、變數

  • 變數:可以變化的量

  • Java是一種強類型語言,每個變數都必須聲明其類型。

  • Java變數是程式中最基本的存儲單元,其要素包括變數名、變數類型和作用域

    • type varName [=value] [{,varName[=value]}];
      //數據類型  變數名 = 值;
      
    • 可以使用逗號隔開來聲明多個同類型變數(不建議使用,容易看上去很混亂)
  • 注意事項:

    • 每個變數都有類型,變數可以是基本類型,也可以是引用類型。
    • 變數名必須是合法的標識符。
    • 變數聲明是一條完整的語句,因此每一個聲明都必須以分號結束
    public class Demo06 {
        public static void main(String[] args) {
    //      int a=1,b=2,c=3;    不建議使用
            int a=1;
            int b=2;
            int c=3;
            String name="曉龍";
            char x='X';
            double pi=3.1415926;
        }
    }
    

1. 變數作用域

  • 類變數
  • 實例變數
  • 局部變數
public class Demo07 {
    //屬性:變數

    //類變數   static
    static double salary = 2500;

    //實例變數:從屬於對象;   若不手動初始化,為默認值。數值類型默認為 0 或 0.0 ,字元串為u0000,輸出依然為0
    //布爾值boolean:默認是false
    //除了基本類型,其餘的默認值都為null
    String name;
    int age;

    //main方法
    public static void main(String[] args) {
        //局部變數      必須聲明和初始化值
        int i = 10;
        System.out.println(i);

        //實例變數
        //變數類型 變數名字 = new 變數類型()
        Demo07 demo07 = new Demo07();
        System.out.println(demo07.age);
        System.out.println(demo07.name);

        //類變數   static
        System.out.println(salary);
    }

    //其他方法
    public void add() {
        /**
         * System.out.println(i);
         * i是局部變數,在add()方法中無法訪問main()方法中的i
         * 局部變數只在聲明它的方法、構造方法或者語句塊中可見
         */
    }
}

2. 常量

  • 常量(Constant):初始化(initialize)後不能再改變值!不會變動的值。
  • 所謂常量可以理解成一種特殊的變數,它的值被設定後,在程式的運行過程中不允許被改變。
final 常量名 = 值;
final double PI = 3.14;
  • 常量名一般使用大寫字元。
public class Demo08 {
    //final,static等修飾符,不存在先後順序
    static final double PI = 3.14;      //常量使用大寫字母和下劃線

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

3. 變數的命名規範

  • 所有變數、方法、類名:見名知意
  • 類成員變數:首字母小寫和駝峰原則(例:monthSalary)
  • 局部變數:首字母小寫和駝峰原則
  • 常量:大寫字母和下劃線(例:MAX_VALUE)
  • 類名:首字母大寫和駝峰原則(例:Man,GoodMan)
  • 方法名:首字母小寫和駝峰原則(例:run(),runRun() )

六、運算符

  • Java語言支援如下運算符:

    • 算數運算符:+ , – , * , / , % , ++ , –(加,減,乘,除,模運算[即取余],自增,自減)
    • 賦值運算符:=
    • 關係運算符:> , < , >= , <= , == , !=instanceof
    • 邏輯運算符:&& , || , !
    • 位運算符:& , | , ^ , ~ , >> , << , >>>
    • 條件運算符: ?:
    • 擴展賦值運算符:+= , -= , *= , /=
  • 優先順序:

    • 優先順序 描述 運算符
      1 括弧 () , []
      2 正負號 + , –
      3 自增、自減、非 ++ , — , !
      4 乘除、取余 * , / , %
      5 加、減 + , –
      6 移位運算 << , >> , >>>
      7 大小關係 > , >= , < , <=
      8 相等關係 == , !=
      9 按位與 &
      10 按位異或 ^
      11 按位或 |
      12 邏輯與 &&
      13 邏輯或 ||
      14 條件運算 ?:
      15 賦值運算 = , += , -= , *= , /= , %=
      16 位賦值運算 &= , |= , ^= , ~= , <<= , >>= , >>>=
package operator;

public class Demo01 {
    public static void main(String[] args) {
        //二元運算符
        int a = 10;
        int b = 20;
        int c = 25;
        int d = 30;
        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(c * b);
        System.out.println((double) b / d);
        System.out.println(c % a);      //取余,模運算
    }
}
package operator;

public class Demo02 {
    public static void main(String[] args) {
        //++ , --   自增,自減   一元運算符
        int a = 3;
        System.out.println("a=" + a);
        int b = a++;    //a++等同於 a先賦值給b,再自增,a=a+1,a=4
        System.out.println("a=" + a);
        int c = ++a;    //++a等同於a先自增,a=a+1,a=5,再賦值給c

        System.out.println("a=" + a + "\nb=" + b + "\nc=" + c);

        //冪運算   2^3
        double pow = Math.pow(2, 3);
        System.out.println(pow);
    }
}
package operator;

public class Demo03 {
    public static void main(String[] args) {
        long a = 123123123123123L;
        int b = 123;
        short c = 10;
        byte d = 8;

        //有long型自動轉換為long型,沒有自動轉換為int型
        System.out.println(a + b + c + d);  //Long
        System.out.println(b + c + d);      //Int
        System.out.println(c + d);          //Int
    }
}
package operator;

public class Demo04 {
    public static void main(String[] args) {
        //關係運算符返回的結果:正確,錯誤(布爾值true,false)
        int a = 10;
        int b = 20;
        System.out.println(a > b);
        System.out.println(a < b);
        System.out.println(a == b);
        System.out.println(a != b);
    }
}
package operator;

public class Demo05 {
    public static void main(String[] args) {
        //與(and)    或(or)   非(取反)
        boolean a = true;
        boolean b = false;

        System.out.println("a && b:" + (a && b));   //邏輯與運算:兩個變數都為真,結果才為true
        System.out.println("a || b:" + (a || b));   //邏輯或運算:兩個變數有一個為真,結果就為true,都為假才為false
        System.out.println("!(a && b):" + !(a && b));   //若為真,則變為假;若為假,則變為真

        //短路運算
        int c = 5;
        boolean d = (c < 4) && (c++ < 4);   //c<4為假,整體就為假,c++沒有進行運算
        System.out.println(d);
        System.out.println(c);
    }
}
package operator;

public class Demo06 {
    public static void main(String[] args) {
        /*
        A = 0011 1100
        B = 0000 1101
        --------------------------------
        A&B = 0000 1100
        A|B = 0011 1101
        A^B = 0011 0001
        ~B = 1111 0010

        2*8 = 16    2*2*2*2
        <<
        >>

        0000 0000       0
        0000 0001       1
        0000 0010       2
        0000 0100       4
        0000 1000       8
        0001 0000       16
         */

        System.out.println(2 << 3);
    }
}
package operator;

public class Demo07 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        a += b;     //a=a+b     30
        a -= b;     //a=a-b     10
        System.out.println(a);
        //字元串連接符 +
        System.out.println("" + a + b);     //字元串在前面,不加括弧,連接符後是String類型,不進行運算
        System.out.println(a + b + "");     //字元串在後面,前面的+會進行運算
    }
}
package operator;

public class Demo08 {
    //三元運算符
    public static void main(String[] args) {
        //x ? y : z
        //如果x==true,結果為 y,否則為z
        int sorce = 80;
        String r = sorce > 60 ? "及格" : "不及格";
        System.out.println(r);
    }
}

七、包機制

  • 為了更好地組織類,Java提供了包機制,用於區別類名的命名空間。

  • 包語句的語法格式:

    • package pkg1[.pkg2[pkg3...]];
      
  • 一般利用公司域名倒置作為包名;

  • 為了能夠使用某一個包的成員,我們需要在Java程式中明確導入該包。使用「import」語句可完成此功能

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

八、JavaDoc

  • javadoc命令是用來生成自己API文檔的

  • 參數資訊

    • @author 作者名
    • @version 版本號
    • @since 指明需要最早使用的jdk版本
    • @param 參數名
    • @return 返回值情況
    • @throws 異常拋出情況
package com.forgetcity.base;

/**
 * @author ForgetCity
 * @version 1.0
 * @since 1.8
 */
public class Doc {
    String name;

    /**
     * @param name
     * @return
     * @throws Exception
     */
    public String test(String name) throws Exception{
        return name;
    }
}

命令行生成Javadoc文檔

cmd生成Javadoc文檔命令:
javadoc -encoding UTF-8 -charset UTF-8 Doc.java -d 輸出路徑

image

image

image

IDEA生成Javadoc文檔

image

Locale輸入zh_CN
Other command line arguments輸入-encoding utf-8 -charset utf-8

image