目錄
- 面向物件編程(OOP:Object-OrientedProgramming)
- 回顧方法的呼叫
- 構造器(必須掌握)
- 面向物件三大特性
- 封裝
- 繼承
- 多型
- 方法重寫:重點
- 多型
- instanceof(型別轉換) 參考型別
- Static關鍵字(總結)
- 抽象類
- 介面
- 內部類(各種套娃,,,)
- 例外機制
- 捕獲和拋出例外
- 例外處理機制
- 自定義例外
面向物件編程(OOP:Object-OrientedProgramming)
個人理解:就是把復雜的問題看作一個整體,即物件;然后再去面向程序,在物件里面去實作方法,陳述句啥的,
面向物件的本質就是:以類的方式組織代碼,以物件的方式組織(封裝)資料,
從代碼運行的角度考慮是先有類后有物件,類是物件的模板,
個人理解:在編程程序中,一定是先創建一個類,然后就可以用類去創建很多個物件!妙啊!!
break和return的區別:break:跳出switch,結束回圈;return結束方法,回傳一個結果,
回顧方法的呼叫
區分:
- 靜態方法的呼叫:有static關鍵字的方法,可以直接用類去點方法名;
- 非靜態方法的呼叫:沒有static關鍵字的方法,需要先將類實體化(比如:Student student = new Student();),然后再去點方法名(比如:student.方法名();)
- 靜態方法可以呼叫靜態方法,非靜態方法不可以呼叫靜態方法
構造器(必須掌握)
Alt + Insert 快捷鍵,生成有參函式無參函式
默認存在一個無參構造方法,生成一個有參構造方法之后,默認存在的無參構造方法就沒了,需要重新手動去生成它,
面向物件三大特性
-
封裝
- 程式設計追求“高內聚,低耦合”;高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合就是僅暴露少量的方法給外部使用,
- 封裝(資料的隱藏):通常應該禁止直接訪問一個物件中資料的實際表示,而應該通過操作介面來訪問,這稱為資訊隱藏!
- 記者這句話就夠了:屬性我私有(private),get/set
-
繼承
-
多型
super和 this:

方法重寫:重點
重寫都是方法的重寫,和屬性無關

因為:定義的是什么類,就呼叫什么類的靜態方法

快捷鍵:Alt + Insert ----->選擇Override Methods...
多型


static final private 這些修飾符修飾的方法沒有多型,因為它們重寫都不能被重寫,更別談多型了啊!!!
個人理解:當父類參考指向子類物件時:
- 當某一個方法,在父類和子類中都存在,如果此時用父類創建的對于像去點這個方法,那么執行的就是子類中的方法;(執行的是子類對父類中的方法重寫之后的同名方法);
- 當子類中有一個獨有的方法,父類中并不存在同名的方法,如果此時用父類創建的對于像去點這個方法,那么就會報錯
instanceof(型別轉換) 參考型別


個人理解:
我們學這里的型別轉換,是為了在父子繼承中,去使用子類中特有的方法,而不是重寫的方法;
(其實就是父類不能直接使用子類中特有的方法,所以強轉一下,把自己偽裝成子類,然后就可以去使用子類中的方法了,哈哈,妙啊!????????????????????????)
借鑒評論大神理解:
低(子類)轉高(父類)時,由于子類已經繼承了父類的所有方法了,所以只需要洗掉子類中自己獨有的一些方法,自然而然就轉換成父類了;
而父類轉換為子類,就需要重新去開辟出屬于子類的空間,則需要強制轉換!妙極啊!????????????????????????
Static關鍵字(總結)
在類中,類( 或者靜態的方法)可以去直接訪問靜態的方法(或靜態變數),但是不能訪問非靜態的方法(或非靜態變數)(類也不能去訪問非靜態的方法(或非靜態變數));
而非靜態的方法卻可以直接訪問靜態方法,這是為什么呢?
因為在類加載的程序中,靜態方法、靜態變數以及常量也被存入了方法區,或者說類加載的同時,靜態方法、靜態變數以及常量是一起被加載的,所以就可以直接呼叫了,像非靜態的方法還沒被加載進記憶體,所以就不能去訪問非靜態的方法,
抽象類

抽象類的所有方法必須要由它的子類去實作,但是假如它的子類也是一個抽象類,那就要由它子類的子類去實作它的方法了,以此類推...
個人理解:就是無限套娃,,,
Java里,extends是單繼承,類沒有多繼承,但是介面有多繼承

介面

介面必須要有實作類

內部類(各種套娃,,,)

例外機制





捕獲和拋出例外
例外處理機制
例外處理的五個關鍵字:
- try
- catch
- finally
- throw
- throws
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//假如要捕獲多個例外,要按照捕獲范圍,從小到大
try {//try監控區域
System.out.println(a/b);//捕獲到一個例外后就直接跳出監控區域,即下面一行代碼不執行了
new Test().a();
}catch (ArithmeticException e){
//捕獲到例外之后,執行下面的代碼
System.out.println("程式出現例外,除法分母不能為零(ArithmeticException)");
}catch (Exception e){
//捕獲到例外之后,執行下面的代碼
System.out.println("Exception");
}catch (Error e){
//捕獲到例外之后,執行下面的代碼
System.out.println("Error");
}catch (Throwable e){
//捕獲到例外之后,執行下面的代碼
System.out.println("Throwable");
}finally {//最后必定執行的陳述句,可以不要finally,try和catch一定要
System.out.println("finally");
}
}
public void a(){b();}
public void b(){a();}
}
idea中捕獲拋出例外的快捷鍵是:Ctrl + Alt + T------------>由于我的筆記本可能鍵位沖突,所以我自己改成了Alt + T;(針對跟我一樣快捷鍵沒反應的情況)



假如在方法中,處理不了某個例外,就可以主動拋出例外,用throw
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
new Test().test(a,b);
//
}
//假設這個方法中,處理不了這個例外
public void test(int a,int b){
if (b==0){
throw new ArithmeticException();//一般在方法中,去主動拋出例外
}
}
}

如果用try catch ,那么程式拋出例外后可以繼續運行,但是如果用throw拋出例外,程式就會停止運行,
自定義例外
public class MyException extends Exception{
private int detail;
public MyException(int a) {
this.detail = a;
}
//toString():例外的列印資訊
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
public class Test {
//可能會存在例外的方法
static void test(int a) throws MyException {//在這里,我選擇了拋出這個例外(throws MyException)
System.out.println("傳遞的引數為:" + a);
if (a > 10) {
throw new MyException(a);//在這里,我選擇了拋出這個例外(throws MyException),拋到更高的地方,讓呼叫這個test方法的人來捕獲這個例外,當然也可以選擇直接在這里try/catch捕獲它
}
System.out.println("OK!");
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println("MyException---->"+e);
}
}
}



轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274670.html
標籤:其他
