狂神說 JavaSE入門筆記(二)


4 基礎

4.1 注釋

comments

書寫注釋是非常好的習慣

Java中有三種注釋

  • 單行注釋
  • 多行注釋
  • 文檔注釋
文檔注釋
/**
 * @Author lee
 */

4.2 標識符

  • 類名,變量名,方法名都被稱為標識符
  • 標識符以字母,美元符,下划線開始
  • 不能使用關鍵字作為方法名或者變量名...
  • 大小寫敏感
  • 可以使用中文作為變量名,但不建議

4.3 關鍵字

事先定義的,有特別意義的標識符,有時又叫保留字

String 不是關鍵字,String是一個類

4.4 數據類型

強類型語言

要求變量的使用嚴格符合規范,所有變量先定義再使用

弱類型語言

沒那么嚴格的要求,不必事先聲明,變量的類型也可能會變化

Java數據類型分為兩大類:基本類型和引用類型

基本類型

primitive type

  • 數值類型
    • 整數類型 byte 1,short 2,int 4,long 8 [字節]
    • 浮點類型 float 4,double 8 [字節]
    • 字符類型 char 2 [字節]
  • 布爾類型 boolean 1 [位]

注意事項:

long num = 30L //之后要加L 一般用大寫以免混淆

float n = 50.1F //之后要加F 

拓展

整數拓展

  • 二進制 0b
  • 八進制 0
  • 十進制
  • 十六進制 0x

浮點數拓展

//銀行面試題  業務里的錢怎么表示?
//使用BigDecimal 數學工具類

float f = 0.1F;   //0.1
double d = 0.1;   //0.1

System.out.println(f==d); //false
System.out.println(f);    //0.1
System.out.println(f);    //0.1

float f1 = 2323232323232323F;
float f2 = f1 + 1;
System.out.println(f==d); //true
  • 浮點數是有限的,離散的,存在舍入誤差,是一個約數
  • 最好完全避免使用浮點數

字符拓展

  • 字符本質是數字,可以轉為數字
  • 編碼 Unicode
  • 轉義字符

類拓展 (此時,類還沒有講)

//類
String sa = new String("hello world");
String sb = new String("hello world");

String sc = "hello world";
String sd = "hello world";

System.out.println(sa == sb); //false
System.out.println(sc == sd); //true

引用類型

reference type

  • 接口
  • 數組

4.5 類型轉換

強制轉換:高到低

自動轉換:低到高

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

低---------------------------------------------------------------->高

注意點:

  • 不能對boolean值進行轉換
  • 不能進行不相關類型的轉換
  • 高轉低使用強制轉換
  • 可能存在溢出或精度問題

JDK7 新特性 數字之間可以使用下划線分割

int money = 10_0000_0000;
System.out.println(money);//1000000000

4.6 變量常量

變量

Variable

  • 類型:必須聲明類型
  • 變量名:必須是合法的標識符
  • 作用域:變量的有效范圍

變量可以分為三類:

  • 類變量:獨立於方法之外的變量,用 static 修飾。
  • 實例變量:獨立於方法之外的變量,不過沒有 static 修飾。從屬於對象,如果不初始化就是類型的默認值。
  • 局部變量:類的方法中的變量。
public class Variable{
    static int allClicks=0;    // 類變量
 
    String str="hello world";  // 實例變量
 
    public void method(){
 
        int i =0;  // 局部變量
 
    }
}

常量

Constant

  • 初始化(initialize)之后不能再改變其值

  • 其變量名一般用大寫

  • 使用final關鍵字來定義

  • final是一個修飾符,修飾符不存在先后順序

命名規范

  • 變量,方法,類名:見名知意
  • 常量:大寫字母和下划線
  • 類名:首字母大寫和駝峰原則
  • 類成員變量:首字母小寫和駝峰原則
  • 局部變量:首字母小寫和駝峰原則
  • 方法名:首字母小寫和駝峰原則

4.7 運算符

  • 算術運算符:+,-,*,/,%,++,--
  • 關系運算符:>,<,>=,<=,==,!=
  • 位運算符: &,|,^,~,<<,>>,>>>
  • 邏輯運算符: &&,||,!
  • 賦值運算符: = ,*= ......
  • 其他運算符: ?:,instanceof

運算符優先級

4.8 包機制

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

包語句的語法格式:

package pkg1[. pkg2[. pkge ...]];

一般用公司的域名倒置作為包名

使用import導入包

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

4.9 JavaDoc

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

參數信息

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

命令行生成

javadoc -encoding UTF-8 -charset UTF-8 DocTest.java

IDEA生成

Tools: Generate JavaDoc

Output directory: select folder

Local: zh_CN

Other command line arguments: -encoding utf-8 -charset utf-8

5 流程控制

5.1 用戶交互

Java為我們提供了用於程序和用戶交互的一個工具類,我們可以獲取用戶輸入。java.util.Scanner是Java5的新特性,我們可以使用Scanner來獲取用戶的輸入。

基本語法

Scanner scanner = new Scanner(System.in);

我們可以通過Scanner類的next()與nextLine()方法來獲取輸入的字符串。

一般來說,我們需要在使用前通過hasNext()和hasNextLine()來判斷是否還有輸入的數據。

//凡是屬於IO流的類,如果使用完不關閉會一直占用資源
scanner.close();

next()方法

  1. 一定要讀取到有效字符后才會結束輸入
  2. 對於有效字符之前的空白,next方法會自動將其去掉
  3. 對於有效字符之后的空白,next方法將其視為分隔符或結束符
  4. 所以next方法無法得到含空格的字符串

nextLine()方法

  1. 以Enter作為結束符,返回的是按下Enter之前的字符串
  2. 可以獲得含空格的字符串

Scanner進階

Scanner scanner = new Scanner(System.in);
//Scanner還有許多方法用來接受各種類型的數據
scanner.nextInt();
scanner.nextFloat();

5.2 順序結構

基本結構,沒有特殊聲明就順序一條一條執行

5.3 選擇結構

if

單選擇 if

雙選擇 if else

多選擇

嵌套

switch

多選擇

switch case 語句判斷一個變量與一系列值中的某一個是否相等,每個值稱為一個分支。

其中的變量類型可以是

  • byte,short,int,char
  • 從Java SE7 開始支持String
  • case標簽必須為字符串常量或字面量
int i = 10;
switch(i){
	case 1:
	//語句
	break;
	
	case 2:
	//語句
	break;
	
	default: 
	//語句
}

break

跳出

continue

跳過本次

goto

goto雖然是Java的保留字,但是沒有在正式語言中得到應用

Java沒有goto

帶標簽的break和continue

標簽:標識符后面跟一冒號 如:lable:

break,continue通常只中斷當前循環,隨標簽一起使用會中斷到標簽處

對於Java來說唯一用到標簽的地方是在循環語句之前。在循環語句之前設置標簽的唯一理由是:我們希望在其中嵌套另一個循環。

int count = 0;

//輸出101 到 150 之間的所有素數
outer: for (int i =101;i<150;i++){
	for (int j=2;j<i/2;j++){
		if(i%j==0)
			continue outer;
	}
System.out.println(i + " ");
}

5.4 循環結構

while

while(i<100){
	System.out.println(i++);
}

do...while

do{
	System.out.println(i++);
}while(i<100)

相比於while循環,即使條件不滿足也會執行一次,即do...while保證代碼至少也會執行一次

for

for(int i=0;i<100;i++){
	System.out.println(i);
}

for更適合循環次數在執行前就已經知道的情況,如果不知道可以使用while或者do...while

增強for

主要用於遍歷數組和集合對象

for(int number:numbers){
    System.out.println(number);
}

5.5 練習

打印九九乘法表

for (int i = 1;i <=9;i++){
	for(int j = 1;j<=i;j++){
		System.out.print(i+ "*"+j+"="+i*j+"\t");
	}
	System.out.println();
}

打印三角形

public class Triangle {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            for (int j = 5;j>=i;j--){
                System.out.print(" ");
            }
            for (int j = 1;j<=i;j++){
                System.out.print("*");
            }
            for (int j = 1;j<i;j++){
                System.out.print("*");
            }

            System.out.println();
        }
    }
}

6 方法

6.1 什么是方法

Java方法是語句的集合,放在一起完成一個功能

解決一個問題的步驟的有序組合

方法設計原則

一個方法只完成一個功能 方法的原子性

6.2 方法的定義及調用

方法的定義

方法包含一個方法頭和一個方法體

  • 修飾符:修飾符,這是可選的,告訴編譯器如何調用該方法。定義了該方法的訪問類型。
  • 返回值類型 :方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字void
  • 方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
  • 參數類型:參數像是一個占位符。當方法被調用時,傳遞值給參數。這個值被稱為實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法可以不包含任何參數。
  • 方法體:方法體包含具體的語句,定義該方法的功能。

修飾符 返回值類型 方法名(參數類型 參數名){

​ ...

​ 方法體

​ ...

​ return 返回值;

}

方法的調用

調用方法:對象名.方法(實參列表)

Java支持兩種調用方法

  • 當方法有返回值時,方法調用通常被當作一個值

    int larger = max(30,40);
    
  • 當方法返回值為void時,方法調用是一條語句

    System.out.println("Hello world!");
    
值傳遞

值傳遞(pass by value)是指在調用方法時將實際參數復制一份傳給方法,這樣在方法中對參數進行修改將不會影響到參數

Java是值傳遞

引用傳遞

引用傳遞(pass by reference)是指在調用方法時將實際參數的地址直接傳給方法,這樣在方法中對參數進行修改將會影響到參數

區別

根本區別:是否創建副本(copy)

值傳遞和引用傳遞的區別並不是傳遞的內容。而是實參到底有沒有被復制一份給形參。在判斷實參內容有沒有受影響的時候,要看傳的的是什么,如果你傳遞的是個地址,那么就看這個地址的變化會不會有影響,而不是看地址指向的對象的變化。就像鑰匙和房子的關系。

你有一把鑰匙,當你的朋友想要去你家的時候,如果你直接把你的鑰匙給他了,這就是引用傳遞。這種情況下,如果他對這把鑰匙做了什么事情,比如他在鑰匙上刻下了自己名字,那么這把鑰匙還給你的時候,你自己的鑰匙上也會多出他刻的名字。
你有一把鑰匙,當你的朋友想要去你家的時候,你復刻了一把新鑰匙給他,自己的還在自己手里,這就是值傳遞。這種情況下,他對這把鑰匙做什么都不會影響你手里的這把鑰匙。

但是不管上面的情況,如果你的朋友拿着你給他的鑰匙進你家,把電視砸了,這就產生影響了。但鑰匙還是鑰匙,判斷值傳遞還是引用傳遞時,你看的是鑰匙,而不是房子里的其他東西。

注意:

關於Java值傳遞,引用傳遞的相關知識在面試中也經常會被問到,注意理解。

6.3 方法重載

什么是重載

在一個類中,方法名相同,但是參數不同

重載規則

  • 方法名必須相同
  • 參數列表必須不同
    • 參數個數不同
    • 參數類型不同
    • 參數排列順序不同
  • 方法返回類型可以相同也可以不同
  • 僅僅返回值類型不同不能成為方法的重載

6.4 命令行傳參

運行程序前再傳參數給它,傳遞命令行參數給main()函數實現

public class CommandLine {
   public static void main(String args[]){ 
      for(int i=0; i<args.length; i++){
         System.out.println("args[" + i + "]: " + args[i]);
      }
   }
}

運行這個程序,結果如下所示:

$ javac CommandLine.java 
$ java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

6.5 可變參數

JDK 1.5 開始,Java支持傳遞同類型的可變參數給一個方法。

方法的可變參數的聲明如下所示:

typeName... parameterName

一個方法中只能指定一個可變參數,它必須是方法的最后一個參數。

public class VarargsDemo {
    public static void main(String args[]) {
        // 調用可變參數的方法
        printMax(34, 3, 3, 2, 56.5);
        printMax(new double[]{1, 2, 3});
    }
 
    public static void printMax( double... numbers) { // 可變參數
        if (numbers.length == 0) {
            System.out.println("No argument passed");
            return;
        }
 
        double result = numbers[0];
 
        for (int i = 1; i <  numbers.length; i++){
            if (numbers[i] >  result) {
                result = numbers[i];
            }
        }
        System.out.println("The max value is " + result);
    }
}

6.6 遞歸

什么是遞歸

方法自己調用自己

遞歸可以用來將一些復雜大規模問題轉換成一些小規模類似問題

遞歸可以寫成循環

遞歸結構

  • 遞歸頭:什么時候不調用自身,即規模小到可以直接解決。沒有的話會死循環。
  • 遞歸體:什么時候調用自身。

能不用遞歸就不用遞歸,棧的空間使用完就會出錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM