隨堂筆記8
隨堂筆記8
多型
-
多型就是方法重寫,詳見筆記7方法重寫
-
注意點
-
屬性沒有多型
-
父類和子類有聯絡 (型別轉換異常)ClassCastException
-
存在條件:繼承關係,方法需要重寫,父類引用指向子類 #Father f1=new Son();
-
不能重寫的方法
-
static 方法,屬於類,不屬於例項
-
final常量
-
private 私有的
-
-
instanceof和型別轉換
-
instanceof判斷物件和類是否有父子關係
-
物件型別看new關鍵詞後邊的型別(區分與方法的呼叫)
import com.yyl.demo03.Person;
import com.yyl.demo03.Student;
public class Application {
public static void main(String[] args) {
//Object>String
//Object>Person>Student
//Object>Person>Teacher
Person person=new Student();
System.out.println(person instanceof Person);
System.out.println(person instanceof Object);
System.out.println(person instanceof Teacher);
//System.out.println(person instanceof String);編譯報錯
}
}
型別轉換
-
型別可以自動從高轉到低
-
強制轉換
import com.yyl.demo03.Person;
import com.yyl.demo03.Student;
public class Application {
public static void main(String[] args) {
Person student=new Student();
//無法呼叫student.go();能呼叫的方法看最左邊的定義,物件的類看最右邊的定義
Student student1=(Student)student;//強制轉換為student型別
student1.go();
//或者((Student) student).go();
}
} -
子類自動轉化為父類,可能會丟失一些函式
static
-
static修飾符修飾的變數或者函式可以直接類呼叫:類名+函式名(變數名)
-
程式碼塊
-
static最先緩衝,所以內部不能呼叫非static資料
抽象類
-
在一個類之前加abstract關鍵字就變為抽象類
-
在一個函式之前加abstract關鍵字變為抽象方法,抽象方法只有方法名字,沒有方法實現
-
抽象類的子類都必須有重寫該函式的方法
-
java類單繼承,但介面可以多繼承
-
注意
-
抽象類不能例項化,不能new一個物件 ~約束
-
抽象方法只能在抽象類中
-
抽象類中可以有普通方法
-
抽象方法只是一種約束
-
介面
-
關鍵詞:interface #public interface 類名{ }
-
介面中全部為抽象方法
-
介面中的定義都是抽象的public(預設為public abstract,可以省略該部分)
-
實現介面的類關鍵詞implements+介面名多個介面用逗號隔開
-
實現介面的類,就必須重寫介面的方法
-
可以利用介面實現多繼承
-
介面中可以定義常量,int a=99;預設省略public static final
//介面1
public interface UserService {
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}//介面2
public interface TimeService {
void timer();
}//實現類
//類可以實現介面,通過 implements+介面
public class UserServiceImpl implements UserService,TimeService{//完整版
//快捷鍵alt+insert
-
介面小節
-
約束
-
定義一些方法,讓不同的人去實現
-
public abstract
-
public static final(可省略)(只能宣告常量)
-
介面不能被例項化,介面中沒有構造方法
-
implements可以實現多個介面,類中必須實現(重寫)介面中所有方法
-
n種內部類
public class Outer {
private int a=1;
public void out(){
System.out.println("這是外部類方法");
}
public class Inner{
public void in(){
System.out.println("這是內部類方法");
}
public void visit(){//獲得外部類的私有屬性
System.out.println(a);
}
}
}
public class Application {
public static void main(String[] args) {
Outer s1=new Outer();
s1.out();
//通過外部類來例項化內部類
Outer.Inner s2=s1.new Inner();
s2.in();
s2.visit();
}
}
=======================================================================================
匿名類
public class Test {
public static void main(String[] args) {
//沒有名字初始化,不用將例項儲存到變數中
new Apple().eat();
new UserService(){
異常機制
-
異常的種類
-
異常的捕獲
-
要捕獲多個異常要從小到大捕獲
public class demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
try{//try監控區域
System.out.println(a/b);
//new demo01().a();
if(b==0){//主動丟擲異常 throw throws
throw new ArithmeticException();//主動丟擲異常
}
}catch(ArithmeticException e){//catch捕獲異常括號內為捕獲異常的型別,最高階為Throwable
System.out.println("程式出現異常,變數b不能為0");
e.printStackTrace();//列印錯誤棧資訊(和原本錯誤提示相同)
System.exit(0);
}catch(Error e){
System.out.println("Error");
}
catch(Throwable e) {
System.out.println("Throwable");
}finally {//處理善後工作
System.out.println("Final");
}//可以不要finally
}
public void a(){
b();
}
public void b(){
a();
}
} -
一般用在方法內丟擲異常,方法處理不了異常可以進行異常上拋
-
所有異常都需要被捕獲,否則程式停止
public class Test {
public static void main(String[] args) {
//可以讓程式發生不停止,繼續執行
try {
new Test().test(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
//假設方法無法處理這個異常,方法上丟擲異常
public void test(int a,int b) throws ArithmeticException{
if(b==0){//throw
throw new ArithmeticException();
}
}
}
自定義異常
//測試異常
public class Test {
//可能會存在異常的方法
static void test(int a) throws MyException{
System.out.println("傳入的數為"+a);
if(a>10){
throw new MyException(a);//丟擲
}
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {//可以增加一些處理異常的程式碼
System.out.println("My Exception=>"+e);
}
}
}
//自定義異常
//首先繼承異常類
public class MyException extends Exception{
//傳遞數字
private int detail;
public MyException(int detail) {
this.detail = detail;
}
//toString