Java程序結(jié)構(gòu)
- 注釋
//單行注釋 //凡是某一行“//”符號(hào)右邊的文字都是注釋 /*多行注釋*/ //Java是用/**/進(jìn)行多行注釋 /**文件注釋*/ //文件注釋的規(guī)則與多行注釋類似,它的語(yǔ)法是/**…*/。 /**通常在設(shè)計(jì)類或方法時(shí),為了更詳細(xì)地解說(shuō)用途,可以使用文件注釋。編寫(xiě)文件注釋后,可以使用 javadoc.exe工具程序, 將此文件注釋處理成Java API文件,所產(chǎn)生的文件是HTML文件 */ - 面向?qū)ο笤O(shè)計(jì)
Java是純面向?qū)ο蟪绦蛘Z(yǔ)言,所有的Java程序代碼都是在類內(nèi),一個(gè)完整的Java程序至少需要有一個(gè)類
- 類區(qū)塊
類區(qū)塊是用左大括號(hào)“{”和右大括號(hào)“}”括起來(lái),一個(gè)類區(qū)塊內(nèi)可以有其他方法(或稱函數(shù))區(qū)塊
- 公有類
一個(gè)Java程序只能有一個(gè)公有類(public class),同時(shí)這個(gè)類的名稱需與Java程序名稱相同
- main()方法
????每個(gè)獨(dú)立的Java程序必須要有main()方法,這是Java程序執(zhí)行的起點(diǎn)。設(shè)計(jì)main()方法時(shí),必須是public static void類型,參數(shù)則是字符串?dāng)?shù)組“String[ ] args”(void代表方法沒(méi)有返回值)
- IO交互
// 輸入(input) import java.util.Scanner; Scanner 變量名 = new Scanner(System.in); 變量名.next數(shù)據(jù)類型(首字母大寫(xiě)); // 輸出(output) System.out.println("內(nèi)容") // 換行 System.out.print("內(nèi)容") // 不換行 - 命令的結(jié)尾
Java程序內(nèi)每條命令的結(jié)尾是分號(hào)“;”
數(shù)據(jù)類型
- 變量
//數(shù)據(jù)類型 變量1,變量2,變量n int age,count... - 常量
/* 字面常量 數(shù)據(jù)類型 常量=值 */ int salary=3500; /* 具名常量 final 數(shù)據(jù)類型=值 */ final double PI=3.14; - 基本數(shù)據(jù)類型
// 數(shù)值型 // 整數(shù) - byte(1) - short(2) - int(4) - long(8) // 浮點(diǎn)數(shù) - float(4) - double(8) // 字符 - char(2) // 非數(shù)值型 // 布爾 - boolean(1) - 引用數(shù)據(jù)類型
- 類(class)
// 通過(guò)API:Application Programming Interface查看各種類信息 - class 1. Sting類:字符串 - 在java.lang包下,不需要import,不可變類型 - Java程序中雙引號(hào)字符串,都是String類的對(duì)象 - String構(gòu)造方法創(chuàng)建對(duì)象 String 變量 new String(參數(shù)) // 地址不同,每次新建地址 - String賦值創(chuàng)建 String 變量 = “abc” // 內(nèi)容相同則地址相同 - 字符串的比較 ==比較的是地址 // s1==s2 equals(參數(shù))方法比較的是值 // s1.equals(s2) - 字符串的長(zhǎng)度 // 變量.length() - 字符串的索引 // 變量.charAt(元素番號(hào)) 2. String Builder - 內(nèi)容是可變的,不會(huì)產(chǎn)生新的變量 StringBuilder sb = new StringBulider() sb.appen("abc") // 返回的是對(duì)象本身 public String toString() // 把StringBuilder轉(zhuǎn)換成String public StringBuilder(String s) // 構(gòu)造方法實(shí)現(xiàn)String轉(zhuǎn)StringBuilder - reverse方法反轉(zhuǎn) return new StringBuilder(s).reverse().toString() 3. 集合ArrayList<E類型:泛型> - 提供一種存儲(chǔ)空間可變的存儲(chǔ)模型,存儲(chǔ)的數(shù)據(jù)容量可以發(fā)生變化 - ArrayList的構(gòu)造方法 public ArrayList() // 創(chuàng)建一個(gè)空的集合對(duì)象 ArrayList<String> array = new ArrayList<>() public boolean add(E e) // 將制定的元素追加到末尾 array.add("abc") public void add(int index, E e) // 在指定位置插入指定元素 - 其他方法 remove() get() set() size()- 接口(interface)
- interface - 特點(diǎn) - 就是一種公共的規(guī)范標(biāo)準(zhǔn),通用接口 - java的接口更多的體現(xiàn)在對(duì)行為的抽象 - 接口用interface關(guān)鍵字修飾 public interface 接口名(){} - 類實(shí)現(xiàn)接口用implements表示 public class 類名 implements接口名(){} - 接口不能實(shí)例化,可參照多態(tài)方式通過(guò)實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài) // 多態(tài)的形式 - 具體類多態(tài),抽象類多態(tài),接口多態(tài) // 多態(tài)的前提 - 有繼承或?qū)崿F(xiàn)關(guān)系,有方法重寫(xiě),有父(類或接口)引用指向(子或?qū)崿F(xiàn))類對(duì)象 // 接口的實(shí)現(xiàn)類 - 要么重寫(xiě)接口中的所有抽象方法 - 要么是抽象類 // 接口的成員特點(diǎn): - 成員變量: - 只能是常量,默認(rèn)修飾符public static final 變量 - 構(gòu)造方法: - 接口沒(méi)有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒(méi)有具體存在 - 一個(gè)類如果沒(méi)有父類,默認(rèn)繼承自O(shè)bject類 - 成員方法: - 只能是抽象方法,默認(rèn)修飾符public abstract 方法名(){} // 類和接口的關(guān)系: - 類和類的關(guān)系 - 繼承關(guān)系,只能單繼承,但可以多層繼承 - 類和接口的關(guān)系 - 實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口 - 接口和接口的關(guān)系 - 繼承關(guān)系,可以單繼承,也可以多繼承 // 抽象類和接口的區(qū)別: - 成員區(qū)別 - 抽象類 - 常量,變量,有構(gòu)造方法,有抽象方法,也有非抽象方法 - 接口 - 常量,只有抽象方法 - 關(guān)系區(qū)別 - 類與類 - 繼承,單繼承 - 類與接口 - 實(shí)現(xiàn),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn) - 接口與接口 - 繼承,單繼承,多繼承 // 設(shè)計(jì)理念區(qū)別 - 抽象類 - 對(duì)類抽象,包括屬性,行為 - 接口 - 對(duì)行為抽象,主要是行為- 數(shù)組(array[ ])
- array[ ] - 定義數(shù)組 - 動(dòng)態(tài)定義 // 數(shù)據(jù)類型 [ ] 數(shù)組名 = new 數(shù)據(jù)類型(3) int [ ] arr = new int [3] - 靜態(tài)定義 // 數(shù)據(jù)類型 [ ] 數(shù)組名 = {元素1,元素2,n} int [ ] arr = {1,2,3} - 二維數(shù)組 // 數(shù)據(jù)類型 [ ] [ ] 數(shù)組名 - 遍歷數(shù)組 // 遍歷不到通常用-1表示 - for循環(huán)遍歷 for(i=0,i<arr.length,i++) { 輸出arr[i]} - foreach循環(huán) for(int i:arr){ 輸出i } - 常見(jiàn)錯(cuò)誤 - 索引越界 - 超過(guò)length的長(zhǎng)度 - 空指針 - 數(shù)據(jù)為null - 多個(gè)數(shù)組指向相同內(nèi)存地址時(shí),一變?nèi)? - 數(shù)據(jù)類型的轉(zhuǎn)換
自動(dòng)類型轉(zhuǎn)換:
變量1 = 變量2,變量2的范圍小于變量1,可自動(dòng)
變量1 = 變量2,變量2的范圍大于變量1,報(bào)錯(cuò)強(qiáng)制類型轉(zhuǎn)換:
目標(biāo)變量 = (數(shù)據(jù)類型)源變量
運(yùn)算符
- 單元運(yùn)算符
只需要一個(gè)運(yùn)算符就可以運(yùn)算,這類運(yùn)算符稱為單元運(yùn)算符
????自增i++,先運(yùn)算后加
????自增++i,先加后運(yùn)算
????自減i--,先運(yùn)算后減
????自減--I,先減后運(yùn)算 - 二元運(yùn)算符
需要有兩個(gè)運(yùn)算符才可以運(yùn)算的符號(hào)稱為二元運(yùn)算符
賦值運(yùn)算符
變量1 = 變量2 // 變量2賦值給變量1
變量1 == 變量2 // 不是賦值是比較,判斷變量2是否等于變量1算數(shù)運(yùn)算符
加法(+) ????// 復(fù)合運(yùn)算為:+=
減法(-) ????// 復(fù)合運(yùn)算為:-=
乘法(*) ????// 復(fù)合運(yùn)算為:*=
除法(/) ????// 取商,復(fù)合運(yùn)算為:/=
求余(%) ????// 取余,復(fù)合運(yùn)算為:%=比較運(yùn)算符
大于(>)
小于(<)
大于等于(>=)
小于等于(<=)
等于(==)
不等于(!=) ????// !也叫反向運(yùn)算符邏輯運(yùn)算符
或(&) ????//a&b,a和b都false才false,否則true
????????????// &&為短路或,a真則不看b
與(|) ????//a|b,a和b都true才true,否則false
????????????// ||為短路與,b真才真
非(!) ????//!a,結(jié)果和a的結(jié)果正好相反
異或(^) ????//a^b,a和b結(jié)果不同則true,相同為false - 三元運(yùn)算符
需要三個(gè)運(yùn)算符進(jìn)行運(yùn)算,這類運(yùn)算符稱為三元運(yùn)算符
表達(dá)式? X:Y ????//true則返回X,false則返回Y
例如:a>b? a:b
流程控制
- 順序結(jié)構(gòu)
從上到下,從左到右,順序執(zhí)行。比如:賦值語(yǔ)句
- 分支結(jié)構(gòu)
根據(jù)條件表達(dá)式的返回值執(zhí)行不同的分支。比如:if分支,switch分支
// if語(yǔ)句
// 單分支
if(關(guān)系表達(dá)式) {
語(yǔ)句體;
}
// 雙分支
if(關(guān)系表達(dá)式){
真語(yǔ)句體;
} else {
假語(yǔ)句體;
}
// 多分支
if(關(guān)系表達(dá)式){
語(yǔ)句體1;
} else if{
語(yǔ)句體2;
} ...else {
語(yǔ)句體n+1;
}
// switch語(yǔ)句
switch (表達(dá)式){
case 值1:
語(yǔ)句體1;
break;
case 值2:
語(yǔ)句體2;
break;
default:
語(yǔ)句體n+1;
[break;]
}
// case穿透:如果case中沒(méi)有break,會(huì)穿透下一個(gè)case語(yǔ)句
- 循環(huán)結(jié)構(gòu)
// for循環(huán)
for(初始化語(yǔ)句;判斷語(yǔ)句;控制語(yǔ)句){
循環(huán)體語(yǔ)句;
}
for(int i=1;i<=5;i++) {
System.out.println("test1");
}
for(;;){ //死循環(huán)
}
// while循環(huán)
while(條件判斷){
循環(huán)體;
}
int j=1;
while(j<=5) {
System.out.println("test1");
j++;
}
while(true){ //死循環(huán)
}
// do while循環(huán)
do {
循環(huán)體;
} while(條件判斷);
do{ //死循環(huán)
} while(true);
跳轉(zhuǎn)控制語(yǔ)句
- continue
- 跳過(guò)本次循環(huán)
終止循環(huán)語(yǔ)句
- break
- 終止循環(huán)
Random
import java.util.Random;
Random 變量 = new Random();
變量n= 變量.nextInt(10) + 1 // 隨機(jī)生成1-10
方法?函數(shù)
//定義方法
public static void 方法名([形參]) { // 形參:數(shù)據(jù)類型 變量,多個(gè)參數(shù)用,分隔 例如:int a, int b
方法體;
}
- 定義的方法與main方法同級(jí)
- 兩個(gè)明確
- 參數(shù)
- 明確幾個(gè)參數(shù),明確參數(shù)的類型
- 返回值
- 明確返回值類型
### 調(diào)用方法
/*
方法名([實(shí)參]);
- 要在main方法中調(diào)用自定義方法
- 關(guān)鍵字參數(shù)要用:例如a:10,b:20
*/
### 返回值
return 數(shù)據(jù) // 有返回值要定義同類型變量接收
public static 返回類型 方法名(形參) {}
- 方法的返回類型與return的返回類型相同
### 方法重載
- 在同一個(gè)類中方法名要相同,參數(shù)不同
- 參數(shù)個(gè)數(shù)不同
- 參數(shù)類型不同
### 注意事項(xiàng)
- 方法不能嵌套
- return的返回值和方法返回類型要相同
- 方法中的變量不會(huì)修改全局變量的值
- 對(duì)于引用類型的參數(shù),形參的改變影響實(shí)參的值 // 比如:方法的參數(shù)是arr數(shù)組,方法修改arr
文件操作
-
File類
// 構(gòu)造方法
File(String pathname)
File(String 路徑,String 文件)
File(File 目錄,String文件)
// 創(chuàng)建功能
- 創(chuàng)建文件
File f1 =new File(文件路徑)
f1.createNewFile()
- 創(chuàng)建目錄
File f2 =new File(目錄)
f2.mkdir()
- 創(chuàng)建多層目錄
File f3 =new File(多層目錄)
f2.mkdirs()
// 成員方法
public boolean isDirectory() // 判斷是否為目錄
public boolean isFile() // 判斷是否為文件
public boolean isExists() // 判斷是否存在
public String getAbsolutePath() // 返回絕對(duì)路徑
public String getPath() // 返回目錄名
public String getName() // 返回文件或路徑名
public String [ ] list() // 返回目錄和文件名的數(shù)組
public File [ ] listFiles() // 返回目錄和文件名的File對(duì)象數(shù)組
// 刪除功能
public boolean delete() // 刪除抽象路徑名表示的文件或目錄
-
IO流
- 字節(jié)流(binary)
- 抽象基類
FileInputStream // 輸入流的所有類的超類
FileOutputStream // 輸出流的所有類的超類
// 寫(xiě)數(shù)據(jù)
FileOutputStream(String name) // 創(chuàng)建文件輸出流以指定的名稱寫(xiě)入文件
FileOutputStream fso = new FileOutStream(文件名); // 追加寫(xiě):在文件名后加,true
fso.write(內(nèi)容信息);
fso.close();
- 3種方式
void write(int b) // 一次寫(xiě)一個(gè)字節(jié)
void write(byte[ ] b) // 一次寫(xiě)一個(gè)字節(jié)數(shù)組
getBytes() // 返回字符串對(duì)應(yīng)的字節(jié)數(shù)組
void write(byte [ ] b, int off, int len) // 將len字節(jié)從指定的字節(jié)數(shù)組開(kāi)始,從偏移量off開(kāi)始一次寫(xiě)一個(gè)字節(jié)數(shù)組
// 讀數(shù)據(jù)
FileInputStream(String name) // 從指定的名稱讀入文件
FileInputStream fso = new FileInputStream(文件名);
fso.read();
fso.close();
- 3種方式
void read(int b) // 一次讀一個(gè)字節(jié)
void read(byte[ ] b) // 一次讀一個(gè)字節(jié)數(shù)組
void read(byte [ ] b, int off, int len) // 將len字節(jié)從指定的字節(jié)數(shù)組開(kāi)始,從偏移量off開(kāi)始一次寫(xiě)一個(gè)字節(jié)數(shù)組
// 復(fù)制數(shù)據(jù)
FileInputStream f1 =new FileInputStream(文件名);
FileOutputStream f2 =new FileOutputStream(文件名);
byte [ ] bys = new byte[1024];
int len;
while((len=f1.read(bys))!= -1){
f2.write(bys, off=0, len);
}
f1.close();
f2.close();
-
字節(jié)緩沖流
// 字節(jié)緩沖輸入流
BufferInputStream b1 = new BufferInputStream(new FileInputStream(文件名));
// 字節(jié)緩沖輸出流
BufferOutputStream b1 = new BufferOutputStream(new FileOutputStream(文件名));
- 編碼解碼
- String s = "中國(guó)"
- 編碼
- byte[ ] bys = s.getBytes(charsetName:"GBK");
- 解碼
- String ss = new String(bys, charsetName:"GBK")
// 字符流(text)
- 抽象基類
InputStreamReader // 輸入流的所有類的超類
OutputStreamWriter // 輸出流的所有類的超類
// 寫(xiě)數(shù)據(jù)
- OutputStreamWriter(String name)
- 創(chuàng)建文件輸出流以指定的名稱寫(xiě)入文件
- FileOutputStream fso = new FileOutStream(文件名);
- 追加寫(xiě):在文件名后加,true
- fso.write(內(nèi)容信息);
- fso.close();
- 5種方式
- void write(int b)
- 寫(xiě)一個(gè)字符
- void write(char[ ] b)
- 寫(xiě)一個(gè)字符數(shù)組
- void write(char [ ] b, int off, int len)
- 寫(xiě)字符數(shù)組的一部分
- void write(String b)
- 寫(xiě)一個(gè)字符串
- void write(byte [ ] b, int off, int len)
- 寫(xiě)字符串的一部分
- 讀數(shù)據(jù)
- FileInputStream(String name)
- 從指定的名稱讀入文件
- FileInputStream fso = new FileInputStream(文件名);
- fso.read();
- fso.close();
- 3種方式
- void read(int b)
- 一次讀一個(gè)字節(jié)
- void read(byte[ ] b)
- 一次讀一個(gè)字節(jié)數(shù)組
- void read(byte [ ] b, int off, int len)
- 將len字節(jié)從指定的字節(jié)數(shù)組開(kāi)始,從偏移量off開(kāi)始一次寫(xiě)一個(gè)字節(jié)數(shù)組
- 復(fù)制數(shù)據(jù)
- FileInputStream f1 =new FileInputStream(文件名);
- FileOutputStream f2 =new FileOutputStream(文件名);
- byte [ ] bys = new byte[1024];
- int len;
- while((len=f1.read(bys))!= -1){
f2.write(bys, off=0, len);
}
- f1.close();
- f2.close();
異常
體系:Throwable(所有異常的超類)
Error
- 硬件或系統(tǒng)級(jí)別的嚴(yán)重錯(cuò)誤,java無(wú)法捕獲
Exception
- RuntimeException
編譯期是不檢查的,出現(xiàn)問(wèn)題后,在修改代碼
運(yùn)行時(shí)異常
- 非RuntimeException
編譯期就必須處理的,否則程序不能通過(guò)編譯
編譯時(shí)異常
-
try...catch
try {
可能出錯(cuò)的代碼;
catch (異常類名 變量名){ // 變量名:是一個(gè)對(duì)象,可以使用.方法
異常的處理代碼;
}
}
### Throwable成員方法
public String getMessage() // 返回Throwable的詳細(xì)消息字符串
public String toString() // 返回此可拋出的簡(jiǎn)短描述
public void printStackTrace() // 把異常的錯(cuò)誤信息輸出在控制臺(tái)
### throws 異常類名;
- 跟在方法的括號(hào)()后面
- 主動(dòng)拋出異常,誰(shuí)調(diào)用誰(shuí)處理該異常
### 自定義異常
public class 異常類名 extends Exception{
無(wú)參構(gòu)造方法()
帶參構(gòu)造方法()
}
- 調(diào)用自定義異常時(shí),要用throw new 自定義異常("提示信息")拋出異常,調(diào)用方法()后throws 異常
public void checkScore(int score) throws fException{
if (score<0 || score>120){
throw new fException("分?jǐn)?shù)有誤");
} else {
System.out.println("分?jǐn)?shù)正常");
}
}
throw和throws的區(qū)別
- throw
- 用在方法體內(nèi),跟的是異常對(duì)象名
- 表示拋出異常,由方法體內(nèi)的語(yǔ)句處理
- 執(zhí)行throw一定拋出了某種異常
- throws
- 用在方法申明后面,跟的是異常類名
- 表示拋出異常,由方法的調(diào)用者來(lái)處理
- 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生
面向?qū)ο?/h2>
類
- 類的特點(diǎn)
- 類是對(duì)象的數(shù)據(jù)類型
- 具有相同屬性和方法的一組對(duì)象的集合
- 類是對(duì)現(xiàn)實(shí)生活中一類具有共同屬性和行為的事物的抽象
- 類的定義
public class 類名 {
成員變量;
構(gòu)造方法(無(wú)參/有參); // ALT+INSERT快捷鍵用于生產(chǎn)構(gòu)造方法
成員方法;
get();
set();
}
- 成員變量
- 類中方法外的變量
- String brand;
- 成員方法
- 類中的方法,不加static
- public void 方法名() {}
- 方法中定義的變量叫局部變量
- 抽象類abstract
特點(diǎn):
- 一個(gè)沒(méi)有方法體的方法應(yīng)該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類
public abstract class 類名(){
public abstract void 方法名();
}
//抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
//抽象類不能實(shí)例化
- 可以參照多態(tài)通過(guò)子類對(duì)象實(shí)例化,這叫抽象類多態(tài)
//抽象類的子類
- 要么重寫(xiě)抽象類中的所有抽象方法
- 要么是抽象類
//抽象類的成員特點(diǎn):
- 成員變量:
- 可以是變量或常量
- 構(gòu)造方法:
- 有構(gòu)造方法但不能實(shí)例化,用于子類訪問(wèn)父類數(shù)據(jù)的初始化
- 成員方法:
- 可以有抽象方法,限定子類必須完成某些動(dòng)作
- 也可以有非抽象方法,提高代碼復(fù)用性
對(duì)象
- 對(duì)象的特點(diǎn)
屬性
- 每個(gè)對(duì)象的每個(gè)屬性都有特定的值
行為
- 對(duì)象能夠執(zhí)行的操作
- 對(duì)象是能摸得著看得到的真實(shí)存在的實(shí)體
- 創(chuàng)建對(duì)象
類名 對(duì)象名 = new 類名
Phone p = new Phone();
- 使用對(duì)象
使用成員變量
- 對(duì)象名.變量名
- p.brand
使用成員方法
- 對(duì)象名.方法名()
- p.call()
封裝
- private關(guān)鍵字
- 用來(lái)保護(hù)私有變量不被外界隨意修改
- get方法,給外界訪問(wèn)
- set方法,給外界修改
- 比如:private String name;
- this關(guān)鍵字
- 在成員方法用this.變量可以訪問(wèn)成員變量,否則為局部變量(形參)
- 代表所在類的對(duì)象引用
- 構(gòu)造方法
// 用來(lái)創(chuàng)建對(duì)象,完成對(duì)象的初始化
public class Student {
public Student() { // 如果沒(méi)有定義構(gòu)造方法,系統(tǒng)會(huì)生成默認(rèn)的
}
}
繼承
- 繼承的特點(diǎn)
可以使得子類具有父類相同的屬性和方法,還可以在子類中重新定義,追加屬性和方法
public class 子類名 extends 父類名()
父類:基類或超類
子類:派生類
優(yōu)點(diǎn):提供了代碼的復(fù)用性,提供代碼的維護(hù)性
缺點(diǎn):類之間產(chǎn)生了關(guān)系,耦合性增加,子類的獨(dú)立性降低
IS-A:是什么的一種,存在繼承關(guān)系
子類不能同時(shí)繼承多個(gè)類
想要多繼承要依次多層傳遞繼承
- LEGB原則:
- Local:局部作用域
- Enclosing:嵌套作用域
- Global:全局作用域
- Built-in:內(nèi)置作用域
- this關(guān)鍵字:
可以訪問(wèn)本類中的成員變量和方法
- this.成員變量
- this(構(gòu)造方法)
- this.成員方法
- super關(guān)鍵字:
可以訪問(wèn)父類中的成員變量和方法
- super.成員變量
- super(構(gòu)造方法)
- super.成員方法
- 子類中的所有構(gòu)造方法默認(rèn)都會(huì)訪問(wèn)父類的無(wú)參構(gòu)造方法
- 子類初始化之前,先完成父類的初始化
- 子類構(gòu)造方法的第一條語(yǔ)句默認(rèn)都是super()無(wú)參
- 如果父類中沒(méi)有無(wú)參構(gòu)造方法
- 通過(guò)super關(guān)鍵字取顯示的調(diào)用父類的帶參構(gòu)造方法
- 或者在父類中定義一個(gè)無(wú)參的構(gòu)造方法
- 方法重寫(xiě)
子類中出現(xiàn)了和父類中一模一樣的方法申明
@Override
- 可以幫助檢查重寫(xiě)方法的方法申明的正確性
父類的私有方法不能被重寫(xiě)
父類的私有成員子類是不能繼承的
子類方法訪問(wèn)權(quán)限不能低于父類現(xiàn)有權(quán)限
public>默認(rèn)>私有
修飾符
- 包Package
- java中的包可以看做就是文件夾,用于對(duì)類進(jìn)行分類管理
- Package 包名;
- Package com.Animal;
- javac -d . 編譯文件,會(huì)自動(dòng)建包
- javac com.Animal 編譯文件,手動(dòng)建包
- 包里放class文件即編譯文件
- 導(dǎo)包import
- import 包名.文件
- import com.Animal
- 權(quán)限修飾符
private
- 訪問(wèn)權(quán)限在同一個(gè)類中
默認(rèn)
- 比private同一個(gè)包中子類無(wú)關(guān)類
protect
- 比默認(rèn)多了不同包的子類
public
- 不同包的無(wú)關(guān)類,最大權(quán)限
- final修飾符
修飾方法:
- 表明是最終方法,不能被重寫(xiě)
修飾變量:
- 表明是常量,不能修改再次賦值
修飾類:
- 表明該類是最終類,不能被繼承
修飾局部變量:
基本類型變量
- 基本類型的數(shù)據(jù)值不能發(fā)生改變
引用類型變量
- 引用類型的地址值不能發(fā)生改變,但地址里面的內(nèi)容可以發(fā)生改變
- static修飾符
特點(diǎn):
- 被類的所有對(duì)象共享
- 這也是判斷是否使用static關(guān)鍵字的條件
- 也可以通過(guò)類名調(diào)用
- 類.變量
- 靜態(tài)成員方法只能訪問(wèn)靜態(tài)成員
多態(tài)
- 特點(diǎn)
- 同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來(lái)的不同形態(tài)
- 成員變量:
編譯看左邊,執(zhí)行看左邊
- 成員方法:
編譯看左邊,執(zhí)行看右邊
因?yàn)槌蓡T方法有重寫(xiě)
- 優(yōu)點(diǎn):
提高了程序的擴(kuò)展性
定義方法的時(shí)候,父類做參數(shù),但使用子類參與操作
- 缺點(diǎn):
不能使用子類的特有功能
可以使用轉(zhuǎn)型解決此弊端
- 向上轉(zhuǎn)型
從子到父:父類引用指向子類對(duì)象
Animal a = new Cat();
- 向下轉(zhuǎn)型
從父到子:父類引用轉(zhuǎn)為子類對(duì)象
Cat c = (Cat)a;
- 前提
- 有繼承或?qū)崿F(xiàn)關(guān)系
- 有方法重寫(xiě)override
- 有父類引用指向子類對(duì)象
Cat a = new Cat() // 貓是貓
Anaimal a = new Cat() // 貓是動(dòng)物
- 類是對(duì)象的數(shù)據(jù)類型
- 具有相同屬性和方法的一組對(duì)象的集合
- 類是對(duì)現(xiàn)實(shí)生活中一類具有共同屬性和行為的事物的抽象
public class 類名 {
成員變量;
構(gòu)造方法(無(wú)參/有參); // ALT+INSERT快捷鍵用于生產(chǎn)構(gòu)造方法
成員方法;
get();
set();
}
- 類中方法外的變量
- String brand;
- 類中的方法,不加static
- public void 方法名() {}
- 方法中定義的變量叫局部變量
特點(diǎn):
- 一個(gè)沒(méi)有方法體的方法應(yīng)該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類
public abstract class 類名(){
public abstract void 方法名();
}
//抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
//抽象類不能實(shí)例化
- 可以參照多態(tài)通過(guò)子類對(duì)象實(shí)例化,這叫抽象類多態(tài)
//抽象類的子類
- 要么重寫(xiě)抽象類中的所有抽象方法
- 要么是抽象類
//抽象類的成員特點(diǎn):
- 成員變量:
- 可以是變量或常量
- 構(gòu)造方法:
- 有構(gòu)造方法但不能實(shí)例化,用于子類訪問(wèn)父類數(shù)據(jù)的初始化
- 成員方法:
- 可以有抽象方法,限定子類必須完成某些動(dòng)作
- 也可以有非抽象方法,提高代碼復(fù)用性
屬性
- 每個(gè)對(duì)象的每個(gè)屬性都有特定的值
行為
- 對(duì)象能夠執(zhí)行的操作
- 對(duì)象是能摸得著看得到的真實(shí)存在的實(shí)體
類名 對(duì)象名 = new 類名
Phone p = new Phone();
使用成員變量
- 對(duì)象名.變量名
- p.brand
使用成員方法
- 對(duì)象名.方法名()
- p.call()
- 用來(lái)保護(hù)私有變量不被外界隨意修改
- get方法,給外界訪問(wèn)
- set方法,給外界修改
- 比如:private String name;
- 在成員方法用this.變量可以訪問(wèn)成員變量,否則為局部變量(形參)
- 代表所在類的對(duì)象引用
// 用來(lái)創(chuàng)建對(duì)象,完成對(duì)象的初始化
public class Student {
public Student() { // 如果沒(méi)有定義構(gòu)造方法,系統(tǒng)會(huì)生成默認(rèn)的
}
}
可以使得子類具有父類相同的屬性和方法,還可以在子類中重新定義,追加屬性和方法
public class 子類名 extends 父類名()
父類:基類或超類
子類:派生類
優(yōu)點(diǎn):提供了代碼的復(fù)用性,提供代碼的維護(hù)性
缺點(diǎn):類之間產(chǎn)生了關(guān)系,耦合性增加,子類的獨(dú)立性降低
IS-A:是什么的一種,存在繼承關(guān)系
子類不能同時(shí)繼承多個(gè)類
想要多繼承要依次多層傳遞繼承
- Local:局部作用域
- Enclosing:嵌套作用域
- Global:全局作用域
- Built-in:內(nèi)置作用域
可以訪問(wèn)本類中的成員變量和方法
- this.成員變量
- this(構(gòu)造方法)
- this.成員方法
可以訪問(wèn)父類中的成員變量和方法
- super.成員變量
- super(構(gòu)造方法)
- super.成員方法
- 子類初始化之前,先完成父類的初始化
- 子類構(gòu)造方法的第一條語(yǔ)句默認(rèn)都是super()無(wú)參
- 如果父類中沒(méi)有無(wú)參構(gòu)造方法
- 通過(guò)super關(guān)鍵字取顯示的調(diào)用父類的帶參構(gòu)造方法
- 或者在父類中定義一個(gè)無(wú)參的構(gòu)造方法
子類中出現(xiàn)了和父類中一模一樣的方法申明
@Override
- 可以幫助檢查重寫(xiě)方法的方法申明的正確性
父類的私有方法不能被重寫(xiě)
父類的私有成員子類是不能繼承的
子類方法訪問(wèn)權(quán)限不能低于父類現(xiàn)有權(quán)限
public>默認(rèn)>私有
- 包Package
- java中的包可以看做就是文件夾,用于對(duì)類進(jìn)行分類管理
- Package 包名;
- Package com.Animal;
- javac -d . 編譯文件,會(huì)自動(dòng)建包
- javac com.Animal 編譯文件,手動(dòng)建包
- 包里放class文件即編譯文件
- 導(dǎo)包import
- import 包名.文件
- import com.Animal
private
- 訪問(wèn)權(quán)限在同一個(gè)類中
默認(rèn)
- 比private同一個(gè)包中子類無(wú)關(guān)類
protect
- 比默認(rèn)多了不同包的子類
public
- 不同包的無(wú)關(guān)類,最大權(quán)限
修飾方法:
- 表明是最終方法,不能被重寫(xiě)
修飾變量:
- 表明是常量,不能修改再次賦值
修飾類:
- 表明該類是最終類,不能被繼承
修飾局部變量:
基本類型變量
- 基本類型的數(shù)據(jù)值不能發(fā)生改變
引用類型變量
- 引用類型的地址值不能發(fā)生改變,但地址里面的內(nèi)容可以發(fā)生改變
特點(diǎn):
- 被類的所有對(duì)象共享
- 這也是判斷是否使用static關(guān)鍵字的條件
- 也可以通過(guò)類名調(diào)用
- 類.變量
- 靜態(tài)成員方法只能訪問(wèn)靜態(tài)成員
- 同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來(lái)的不同形態(tài)
- 成員變量:
編譯看左邊,執(zhí)行看左邊
- 成員方法:
編譯看左邊,執(zhí)行看右邊
因?yàn)槌蓡T方法有重寫(xiě)
- 優(yōu)點(diǎn):
提高了程序的擴(kuò)展性
定義方法的時(shí)候,父類做參數(shù),但使用子類參與操作
- 缺點(diǎn):
不能使用子類的特有功能
可以使用轉(zhuǎn)型解決此弊端
- 向上轉(zhuǎn)型
從子到父:父類引用指向子類對(duì)象
Animal a = new Cat();
- 向下轉(zhuǎn)型
從父到子:父類引用轉(zhuǎn)為子類對(duì)象
Cat c = (Cat)a;
- 有繼承或?qū)崿F(xiàn)關(guān)系
- 有方法重寫(xiě)override
- 有父類引用指向子類對(duì)象
Cat a = new Cat() // 貓是貓
Anaimal a = new Cat() // 貓是動(dòng)物