Java基礎學習


1 Java 對象和類

java因強制要求類名(唯一的public類)和文件名統一,因此在引用其它類時無需顯式聲明。在編譯時,編譯器會根據類名去尋找同名文件。
package 的作用就是 c++ 的 namespace 的作用,防止名字相同的類產生衝突。

2 Java 基本數據類型

Java 的兩大數據類型:
內置數據類型
引用數據類型

內置數據類型
8-64位                           32      64              1         16      
byte  short  int  long  float  double   boolean  char

引用類型
在Java中,引用類型的變量非常類似於C/C++的指針。引用類型指向一個對象,指向對象的變量是引用變量。
對象、數組都是引用數據類型。
所有引用類型的默認值都是null。

自動類型轉換
char c1='a';//定義一個char類型
int i1 = c1;//char自動類型轉換爲int

強制類型轉換
int i1 = 123;
byte b = (byte)i1;//強制類型轉換爲byte
因爲byte類型時8位,最大值爲127,所以當強制轉換爲int類型值128時候就會導致溢出。

3 Java 變量類型
Java語言支持的變量類型有:
類變量:獨立於方法之外的變量,用 static 修飾。
實例變量:獨立於方法之外的變量,不過沒有 static 修飾。
局部變量:類的方法中的變量。
public class Variable{
    static int allClicks=0;    // 類變量
    String str="hello world";  // 實例變量
    public void method(){
        int i =0;  // 局部變量
    }
}

4 Java 修飾符

Java語言提供了很多修飾符,主要分爲以下兩類:
訪問修飾符
非訪問修飾符

Java中,可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Javav支持 4 種不同的訪問權限。
default (即缺省,什麼也不寫): 在同一包內可見,不使用任何修飾符。使用對象:類、接口、變量、方法。
private : 在同一類內可見。使用對象:變量、方法。 注意:不能修飾類(外部類)
public : 對所有類可見。使用對象:類、接口、變量、方法
protected : 對同一包內的類和所有子類可見。使用對象:變量、方法。 注意:不能修飾類(外部類)。

***java中的protected好像和c++、c#中的不一樣。。。

爲了實現一些其他的功能,Java 也提供了許多非訪問修飾符。
static 修飾符,用來修飾類方法和類變量。
final 修飾符,用來修飾類、方法和變量,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量爲常量,是不可修改的。
abstract 修飾符,用來創建抽象類和抽象方法。
synchronized 和 volatile 修飾符,主要用於線程的編程。

static 關鍵字用來聲明獨立於對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝

類中的 final 方法可以被子類繼承,但是不能被子類修改。
聲明 final 方法的主要目的是防止該方法的內容被修改。

***所以說c# sealed(密封類)就是 java final(不可更改)。。。

abstract 修飾符抽象類不能用來實例化對象,聲明抽象類的唯一目的是爲了將來對該類進行擴充。
抽象方法不能被聲明成 final 和 static。

synchronized 關鍵字聲明的方法同一時間只能被一個線程訪問。synchronized 修飾符可以應用於四個訪問修飾符。

序列化的對象包含被 transient 修飾的實例變量時,java 虛擬機(JVM)跳過該特定的變量。

volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內存中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
一個 volatile 對象引用可能是 null。

5 Java 運算符

算術運算符
關係運算符
位運算符
邏輯運算符
賦值運算符
其他運算符

6 Java 循環結構 - for, while 及 do...while

Java5 引入了一種主要用於數組的增強型 for 循環。
for(聲明語句 : 表達式)
{
   //代碼句子
}
聲明語句:聲明新的局部變量,該變量的類型必須和數組元素的類型匹配。其作用域限定在循環語句塊,其值與此時數組元素的值相等。
表達式:表達式是要訪問的數組名,或者是返回值爲數組的方法。

public class Test {
   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};
      for(int x : numbers ){
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names ={"James", "Larry", "Tom", "Lacy"};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}
以上實例編譯運行結果如下:
10,20,30,40,50,
James,Larry,Tom,Lacy,

***和foreach差不多。。。。

break 關鍵字  break 跳出最裏層的循環,並且繼續執行該循環下面的語句。
continue 關鍵字  continue 適用於任何循環控制結構中。作用是讓程序立刻跳轉到下一次循環的迭代。

7 Java 分支結構 - if...else/switch

順序結構只能順序執行,不能進行判斷和選擇,因此需要分支結構。
Java 有兩種分支結構:
if 語句
switch 語句

8 Java Number & Math 類

然而,在實際開發過程中,我們經常會遇到需要使用對象,而不是內置數據類型的情形。爲了解決這個問題,Java 語言爲每一個內置數據類型提供了對應的包裝類。
所有的包裝類(Integer、Long、Byte、Double、Float、Short)都是抽象類 Number 的子類。
這種由編譯器特別支持的包裝稱爲裝箱,所以當內置數據類型被當作對象使用的時候,編譯器會把內置類型裝箱爲包裝類。相似的,編譯器也可以把一個對象拆箱爲內置類型。Number 類屬於 java.lang 包。

***c#中的object類型。。。


拆箱是把“引用”類型轉換成“值”類型;
裝箱是把“值”類型轉換成“引用類型”;
https://zhidao.baidu.com/question/317982664.html  裝箱與拆箱

9 Java Character 類
 
Character ch = new Character('a');

10 Java String 類

注意:String 類是不可改變的,所以你一旦創建了 String 對象,那它的值就無法改變了(詳看筆記部分解析)。

***百度了一下,string和數組、對象都是引用數據類型
***printf是用於格式化輸出的 score[%d]=%d" 這個就是輸出格式 %d 就表示輸出值爲一個整數
***println()在要輸出的內容後自動加了回車換行 ,這個函數可不能用輸出格式的。


我們知道輸出格式化數字可以使用 printf() 和 format() 方法。
String 類使用靜態方法 format() 返回一個String 對象而不是 PrintStream 對象。

11 Java StringBuffer 和 StringBuilder 類

當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。

String 長度大小不可變
StringBuffer 和 StringBuilder 長度可變
StringBuffer 線程安全 StringBuilder 線程不安全
StringBuilder 速度快

12 Java 數組

dataType[] arrayRefVar = new dataType[arraySize];

foreach 循環
public class TestArray {
   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};
      // 打印所有數組元素
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

多維數組的動態初始化(以二維數組爲例)
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");

Arrays 類
java.util.Arrays 類能方便地操作數組,它提供的所有方法都是靜態的。
具有以下功能:
給數組賦值:通過 fill 方法。
對數組排序:通過 sort 方法,按升序。
比較數組:通過 equals 方法比較數組中元素值是否相等。
查找數組元素:通過 binarySearch 方法能對排序好的數組進行二分查找法操作。

13 Java 日期時間

第一個構造函數使用當前日期和時間來初始化對象。
Date( )
第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。
Date(long millisec)

14 正則表達式。。。

匹配問題
正則表達式 就是將一個類型的數據 按照一定方式 寫成正則表達式的形式 這樣可以辨別數據是否符合這一類型的數據 比如我們的身份證號碼 就是有一定的規則的 這樣我們寫一個 正則表達式 和別人輸入的身份證號碼 比對 如果符合這個正則表達式的規則 就是身份證號碼


15 Java 方法

方法的命名規則
1. 必須以字母、'_'或'$'開頭。
2. 可以包括數字,但不能以它開頭。

方法的重載

命令行參數的使用
有時候你希望運行一個程序時候再傳遞給它消息。這要靠傳遞命令行參數給main()函數實現。
命令行參數是在執行程序時候緊跟在程序名字後面的信息。

構造方法

可變參數
JDK 1.5 開始,Java支持傳遞同類型的可變參數給一個方法。
方法的可變參數的聲明如下所示:
typeName... parameterName
在方法聲明中,在指定參數類型後加一個省略號(...) 。
一個方法中只能指定一個可變參數,它必須是方法的最後一個參數。任何普通的參數必須在它之前聲明。

finalize() 方法
***並不是很懂。。。。

Java 允許定義這樣的方法,它在對象被垃圾收集器析構(回收)之前調用,這個方法叫做 finalize( ),它用來清除回收對象。
例如,你可以使用 finalize() 來確保一個對象打開的文件被關閉了。
在 finalize() 方法裏,你必須指定在對象銷燬時候要執行的操作。
finalize() 一般格式是:
protected void finalize()
{
   // 在這裏終結代碼
}
關鍵字 protected 是一個限定符,它確保 finalize() 方法不會被該類以外的代碼調用。
當然,Java 的內存回收可以由 JVM 來自動完成。如果你手動使用,則可以使用上面的方法。

16 Java 流(Stream)、文件(File)和IO

Java 的控制檯輸入由 System.in 完成。
爲了獲得一個綁定到控制檯的字符流,你可以把 System.in 包裝在一個 BufferedReader 對象中來創建一個字符流。
下面是創建 BufferedReader 的基本語法:
BufferedReader br = new BufferedReader(new 
                    InputStreamReader(System.in));
BufferedReader 對象創建後,我們便可以使用 read() 方法從控制檯讀取一個字符,或者用 readLine() 方法讀取一個字符串。

FileInputStream
該流用於從文件讀取數據,它的對象可以用關鍵字 new 來創建。
有多種構造方法可用來創建對象。
可以使用字符串類型的文件名來創建一個輸入流對象來讀取文件:
InputStream f = new FileInputStream("C:/java/hello");

FileOutputStream
該類用來創建一個文件並向文件中寫數據。
如果該流在打開文件進行輸出前,目標文件不存在,那麼該流會創建該文件。
有兩個構造方法可以用來創建 FileOutputStream 對象。
使用字符串類型的文件名來創建一個輸出流對象:
OutputStream f = new FileOutputStream("C:/java/hello")

***C#中是FileStream類

17 Java Scanner 類

java.util.Scanner 是 Java5 的新特徵,我們可以通過 Scanner 類來獲取用戶的輸入。
下面是創建 Scanner 對象的基本語法:
Scanner s = new Scanner(System.in);

接下來我們演示一個最簡單的的數據輸入,並通過 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串,在讀取前我們一般需要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據:

import java.util.Scanner; 
public class ScannerDemo {  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in); 
    // 從鍵盤接收數據  
    //next方式接收字符串
        System.out.println("next方式接收:");
        // 判斷是否還有輸入
        if(scan.hasNext()){   
          String str1 = scan.next();
          System.out.println("輸入的數據爲:"+str1);  
        }  
    }  
}
next() 與 nextLine() 區別
next():
1、一定要讀取到有效字符後纔可以結束輸入。
2、對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。
3、只有輸入有效字符後纔將其後面輸入的空白作爲分隔符或者結束符。

next() 不能得到帶有空格的字符串。
nextLine():
1、以Enter爲結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。
2、可以獲得空白。


18 Java 異常處理

捕獲異常
使用 try 和 catch 關鍵字可以捕獲異常。try/catch 代碼塊放在異常可能發生的地方。
try/catch代碼塊中的代碼稱爲保護代碼,使用 try/catch 的語法如下:
try
{
   // 程序代碼
}catch(ExceptionName e1)
{
   //Catch 塊
}
Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發生一個異常時,try 後面的 catch 塊就會被檢查。
如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是一樣。

throws/throw 關鍵字 
如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。
也可以使用 throw 關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。

finally關鍵字
finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。
無論是否發生異常,finally 代碼塊中的代碼總會被執行。
在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。
finally 代碼塊出現在 catch 代碼塊最後,語法如下:
try{
  // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}finally{
  // 程序代碼
}
發佈了31 篇原創文章 · 獲贊 2 · 訪問量 9213
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章