Java基礎
?java ['d?ɑv?]
基礎
資料型別
型別自動提升與強制轉型
在運算程序中,如果參與運算的兩個數型別不一致,那么計算結果為較大型別的整型,例如,short和int計算,結果總是int,原因是short首先自動被轉型為int
小的總是被轉成大的, 大的放進小的里面就會溢位
數值型字面值
-
默認情況下,整形字面值是一個十進制整數
-
二進制整數字面值,在數字前使用
0b或者0B, 如0B1111(15) -
八進制整數字面值,在數字前使用
0, 如07777(4095) -
十六進制整數字面值,在數字前使用
0x或者0X, 如0XFFFF(65535)補碼運算中經常用到&0xff
- 0xFF的二進制表示就是:1111 1111
- 計算機存盤資料機制:
- 正數存盤的二進制原碼,
- 負數存盤的是二進制的補碼,
- 補碼是負數的絕對值反碼加1,
String 型別
- String 型別不是基本型別,而是參考型別
String物件簡單方法
-
獲取字串長度
string.
length() -
從字串中獲取字符
s.
charAt(index) -
從控制臺讀取字串
- next()方法
Scanner input = new Scanner(System.in); String s = input.nextLine();-
以空白字符為結束標志,如
、\t、\f、\r、\n -
nextLine()方法
Scanner input = new Scanner(System.in); String s = input.nextLine();- 以回車鍵為結束標志
-
字串比較
-
運算子
==只能檢測string1 和string2是否指向同一個物件,而無法判斷兩個字串變數內容是否相同 -
equals方法
string1.equals(string2) -
compareTo方法
s1.compareTo(s2)- 按字典順序(Unicode碼順序)比較
- 相等回傳 0
- s1小于s2, 回傳值小于0
- s1大于s2, 回傳值大于0
- 另外,使用>、<等比較運算子比較,會發生語法錯誤
-
-
字串和數字間的轉換
int intValue = https://www.cnblogs.com/tow1/p/Integer.parseInt(intString); double doubleValue = Double.parseDouble(doubleString);- 如果不是數字型字串,轉換將導致運行時錯誤
- 數字轉換為字串,只需要簡單實用字串的連接運算子
- String s = number + " ";
I/O
輸入
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 創建Scanner物件
System.out.print("Input your name: "); // 列印提示
String name = scanner.nextLine(); // 讀取一行輸入并獲取字串
System.out.print("Input your age: "); // 列印提示
int age = scanner.nextInt(); // 讀取一行輸入并獲取整數
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化輸出
}
}
輸出
-
輸出快捷鍵
sysoAlt + / -
格式化控制臺輸出
System.out.printf- %4.2f
-
%
域寬度.精度轉換碼- %表示占位符
- 默認情況右對齊,在%后面添加一個負號,變為左對齊
- 不要比較浮點值是否相等來進行回圈控制,因為浮點值都是近似值,將導致不精確回圈次數和不準確結果
方法
方法的定義由方法名稱、引數、回傳值型別以及方法體組成
語法
方法頭
修飾符回傳值型別方法名(引數串列){? // 方法體
? }
- 定義在方法頭中的變數稱為形式引數(formal parameter) ,簡稱 形參(parameter [p?'r?m?t?r])
- 呼叫方法時,給引數傳一個值,這個值稱為實際引數(actual parameter) 或實參
- 引數串列 (parameter list) 指明方法中引數的型別、順序和個數,
- 方法名 和 引數串列 一起構成 方法簽名 (method signature)
- 方法頭中需要對每一個引數進行單獨的資料型別宣告
使用
方法能夠帶來代碼的共享和重用, 類中通過使用
類名.方法名來呼叫方法
- 每呼叫一個方法,系統會創建一個活動記錄(/活動框架),用于保存方法中引數和變數,
- 活動記錄置于一個記憶體區域,稱為呼叫堆疊(call stack), 也稱為 執行堆疊、運行時堆疊、機器堆疊,常簡稱為 “堆疊”,
- 方法運行結束,相應活動記錄就被釋放,
- 當呼叫帶引數的方法時,實參的值傳遞給形參,這個程序稱為按值傳遞 (pass-by-value)
- 如swap(n1, n2), swap(num1, num2)交換方法中
- n1和n2有自己獨立于num1和num2的存盤空間
- n1和n2的改變不會影響num1和num2的內容
多載方法
多載方法(overload):使用同樣的名字,不同的引數串列來定義不同的方法
- java編譯器根據方法簽名(方法名 和 引數串列)決定使用哪個方法
- 多載方法使得程式更加清楚,執行同樣功能但具有不同引數型別的方法應該使用同樣的名字
- 被多載的方法必須具有不同的引數串列
- 不能基于不同修飾符或回傳型別來多載方法
變數作用域
- 在方法中定義的變數稱為區域變數
- 引數實際上就是一個區域變數,一個方法的引數作用域涵蓋整個方法,
- 在for回圈頭中初始操作部分宣告的變數,其作用域是整個for回圈,
- 可以在一個方法中的不同塊里宣告同名區域變數
- 不能在嵌套塊中或同一塊中宣告同一個區域變數
- C中可以內層把外層的屏蔽掉
陣列
定義
int[ ] arr;
int arr[];//不推薦
初始化
不允許在前面的括號寫元素個數
-
靜態初始化
- 簡寫方式,不指定個數,用{ }中的資料直接對陣列賦值
int[ ] arr = new int[ ] {1, 2, 3};- 指定初始化的陣列個數,在后面給陣列逐個賦值
int[ ] arr = new int[3]; arr[0] = 1; -
動態初始化
二位動態陣列初始化,行號必須寫,列號可以省略
int[ ][ ] arr = new int [3][ ]; arr[0] = new int [3]; //0行有三列int [ ][ ] arr = new int[3][2]; arr [0][0] = 3; -
陣列型別傳值,引數是陣列的參考,傳遞的是陣列的參考,即傳遞共享資訊 (pass-by-sharing)
-
陣列存盤在堆中,傳遞時,盡管是兩個獨立變數,但指向同一個陣列
亂數
random方法
- 生成大于等于0.0且小于1.0的double型隨機整數(包含0,不包含1)
- 0.0 ≦Math.random() < 1.0
- 回傳0~9之間的一個隨機整數
- (int) (Math.random() * 1.0)
- 回傳50~99之間的一個隨機整數
- 50 +(int) (Math.random() *50)
- 回傳a~a+b之間的一個隨機整數,不包括a+b
- a + Math.random() * b
面向物件
面向物件程式設計的三大支柱是封裝、繼承和多型
- 類 為 物件 定義屬性和行為
- 物件狀態 (屬性) 由資料域與當前值表示,
- 物件行為(動作)由方法定義,
- 創建物件的程序稱為實體化(instantion)
- java類使用變數定義資料域,使用方法定義動作,
- 類中提供一種稱為構造方法(constructor) 的特殊型別方法,呼叫它可以創建新的物件,
- 包含main方法稱為主類,沒有main方法的類無法運行,
- 可以把兩個類放在同一個檔案中,但檔案中只能有一個類是公共(public)類,并且,公共類必須與檔案同名,
構造方法
使用new運算子呼叫構造方法創建物件
構造方法
- 必須與所在類名字相同
- 沒有回傳值型別,甚至連void也沒有
- 在創建一個物件時由new運算子呼叫,作用是初始化物件
- 通常,類會提供一個沒有引數的構造方法(稱為無參構造方法)
- 在一個類中用戶沒有定義構造方法時,類中會隱式定義一個方法體為空的無參構造方法,稱為默認構造方法,當且僅當類中沒有明確定義任何構造方法時自動提供,
通過參考變數訪問物件
- 物件的資料和方法可以運用點運算子
.通過物件的參考變數進行訪問, - 參考是物件的存盤地址
向方法傳遞物件引數
- 將物件的參考傳遞給方法
- 執行程式中的方法 呼叫堆疊
- 物件存在堆中
靜態變數和靜態方法
靜態變數(static variable),也稱為類變數
宣告一個靜態變數或定義一個靜態方法,就要在這個變數或方法的宣告中加上修飾符
static
- 靜態變數被類中所有物件共享
- 靜態方法不能訪問類中的實體成員
- 靜態變數將變數值存盤在一個公共的記憶體地址中
- 而實體方法和實體變數都從屬于實體,只有在實體創建之后才能使用,通過參考變數來訪問
- 靜態方法和靜態資料可以通過參考變數或它們的類名來呼叫
- 靜態變數和靜態方法可以在不創建物件的情況下訪問
- 使用
類名.方法名(引數)的方式呼叫靜態方法 - 使用
類名.靜態變數的方式訪問靜態變數 - 實體 可以呼叫 或 訪問 實體和靜態
- 但靜態只能 呼叫訪問 靜態
- 不依賴于某個具體實體的方法應該宣告為靜態方法
- getArea方法依賴于某個具體圓,它是一個實體方法
- Math類中沒有一個方法是依賴于特定實體,如random、pow、sin,都是靜態方法
- main方法也是靜態的,可以從類中直接呼叫
可見性修飾符
可見性修飾符 指明 類中的資料域和方法 是否能在該類之外被訪問
該類之內對資料域和方法 的訪問是沒有限制的
-
沒有使用可見性修飾符,默認類、方法和資料域是可以被同一個包中任何一個類訪問的,
-
private限定方法和資料域 只能在 它自己類中被訪問, -
修飾符private只能應用在
類的成員上 -
修飾符public可以應用在
類或類的成員上 -
在區域變數(方法或函式里的變數) 使用修飾符 public 或 private都會導致編譯錯誤
-
大多數情況下,構造方法都是公共的
-
使用private修飾符將資料域宣告為私有的稱為資料域封裝 (data field encapsulation)
為了更新 被封裝的資料域 提供設定方法來給資料域設定新值
-
獲取方法稱為訪問器(accessor ['?kses?r] 注意重音在前)
public returnType getPropertyName( ) public boolean isPropertyName( ) -
設定方法稱為修改器(mutator mutate美 ['mju.te?t]轉變)
public void setPropertyName(dataType propertyValue )
-
-
final
- 用
final修飾的方法不能被Override - 用
final修飾的類不能被繼承 - 用
final修飾的欄位在初始化后不能被修改 - 對
final欄位重新賦值會報錯 - 可以在構造方法中初始化final欄位
- 用
this參考
關鍵字
this參考物件自身, 也可以在構造方法內部呼叫同一個類的其他構造方法
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius; //this關鍵字用于參考正在被構建的物件的資料域radius
}
public Circle() {
this(1.0) ; // this關鍵字用于呼叫另外一個構造方法
}
}
- java中要求,在構造方法中陳述句 this(arg-list) 應在任何其他可執行陳述句之前出現
- 一個類有多個構造方法時, 最好盡可能使用 this(引數串列) 來實作
類的關系
類之間的關系通常有 關聯、聚合、組合以及繼承,
{ 關聯 [ 聚集(組合)] }
關聯 : 二元關系, 兩個類之間
聚集 : 兩個物件之間歸屬關系,和組合相似.
繼承和多型
繼承
-
父類 (parent class): 超類(superclass) ,基類(base class)
-
子類(subclass) : 繼承類(extended class) , 派生類(derived class)
-
子類從父類中繼承可訪問的資料域和方法, 還可以添加新的資料域和方法
-
父類: 通用的類
-
子類:更特定的類
-
語法
public class Circle extends GeometricObject -
在java中, 不允許多重繼承
-
一個Java類只可能直接繼承自一個父類, 這種限制稱為 單一繼承 (single inheritance)
super關鍵字
關鍵字super代指父類, 可以用于呼叫父類中普通方法和構造方法
- 呼叫父類構造方法語法
super( ) 或 super(arguments) ;
-
要呼叫父類的構造方法必須使用關鍵字super, 在子類中呼叫父類構造方法名字會引發語法錯誤
-
子類呼叫父類構造方法的陳述句必須是它構造方法的第一條陳述句
public Circle (double radius, String color, boolean filled) { super(color, filled); this.radius = radius; } -
構造方法鏈
當構造一個子類的物件時,子類的構造方法會在完成自己任務之前,首先呼叫它的父類的構造方法.
父類有參和無參的構造方法,子類會呼叫無參的構造方法
-
呼叫父類普通方法
super. 方法名(引數);
方法重寫
重寫方法,需要在子類中使用父類一樣的簽名來對方法進行定義
-
重寫方法必須與被重寫方法具有一樣的
簽名(方法名 和 引數串列),以及一樣或者兼容的回傳型別 -
僅當實體方法可訪問時,才能被重寫
-
私有方法所處類本身以外是不能被訪問的,不能被重寫
- 父類中私有方法在子類中被定義, 兩者完全沒有關系
-
靜態方法可以被繼承,但不能被重寫
- 父類中的靜態方法在子類中被重新定義,則父類中定義的靜態方法被隱藏
- 可以使用"
父類名.靜態方法名" 呼叫隱藏的靜態方法
方法重寫與多載
多載: 使用同樣的名字但不同的簽名(方法名 和 引數串列)來定義多個方法
- (涵蓋多種資料型別的同種方法)
重寫: 在子類中提供對一個方法的新的實作
- (把老的方法實作新的功能 )
- 方法重寫??發生在具有繼承關系的不同類中
- 方法多載??可以發生在同一個類中, 也可以發生在具有繼承關系的不同類中
- 方法重寫??具有同樣的簽名(方法名 和 引數串列)
- 方法多載??具有同樣的名字但不同的引數串列
重寫標注@Override, 有標注, 沒重寫, 將報錯
多型
多型是指,針對某個型別的方法呼叫,其真正執行的方法取決于運行時期實際型別的方法
多型(polymorphism): 使用父類物件的地方都可以使用子類的物件
polymer['pɑl?m?r] 聚合
- 父型別可以參考子型別
- 宣告型別決定編譯時匹配哪個方法
動態系結
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248390.html
標籤:Java
上一篇:Oh My God!e.printStackTrace() 導致系統卡崩
下一篇:常見的WEB攻擊
