class JavaObject {public static void main(String [] args) {Father a = new Son(); //父類引用指向子類對象System.out.println(a.num);//成員變量-編譯看父類,運行也看父類。Father f = new Son();f.print(); //成員方法非靜態運行看子類f.method(); //靜態和類相似,相當于是Father.methond()。}
}
class Father {int num = 10;public void print () {System.out.println("父級");}public static void method() {System.out.println("father static method");}
}
class Son extends Father {int num = 20;public void print () {System.out.println("子級");}public static void method() {System.out.println("son static method");}
}
2.李明和老李的故事-多態向上向下轉型
A:案例分析-通過該案例幫助理解多態的現象
B:詳細講解多態中向上轉型和向下轉型
class JavaObject {public static void main(String [] args) {Boy b = new Man(); //父類引用指向子類對象,人類 System.out.println(b.name); //父類引用指向子類對象就是向上轉型b.eat();Man m = (Man)b; //向下轉型m.work(); //多肽的弊端,不能直接使用子類的//基本數據類型自動類型提升和強制類型轉換int i = 10;byte c = 20;//i = c; //自動類型提升c = (byte)i; //強制類型轉換}
}class Boy {String name = "liming";public void eat() {System.out.println("吃一小碗飯");}
}
class Man extends Boy {String name = "laoli";public void eat () {System.out.println("吃一大碗飯");}public void work() {System.out.println("工作");}
}
3.多態的好處和弊端
A:多態的好處
a:提高了代碼的維護性(繼承保證)
b:提高了代碼的擴展性(由多態保證)
B:案例演示
多態的好處
可以當作形式參數,可以接收任意子類對象
C:多態的弊端
不能使用子類的特有屬性和行為。
D:案例演示 method(Animal a) method(Cat c)
class JavaObject {public static void main(String [] args) {//Cat c1 = new Cat(); //父類引用指向子類對象,人類//c1.Cat();method(new Cat());method(new Dog());//Animal a = new Cat();開發很少用父類引用指向子類對象,直接創建子類對象使用其特有屬性和行為。}/*public static void method(Cat c) { //主類加靜態c.eat();}public static void method(Dog d) { d.eat();}*/public static void method(Animal a) {//當作參數的時候用多態最好,因為擴展性強//Cat c = (Cat)a;強轉會出現類型轉換異常,ClassCastException//關鍵字 instanseof 判斷前邊的引用是否是后邊的數據類型if (a instanceof Cat) {Cat c = (Cat)a;//向下轉型,轉向子類c.eat();c.catchMouse();} else if (a instanceof Dog) {Dog d = (Dog)a;d.eat();d.lookHome();} else {a.eat();}}
}
class Animal {public void eat() {System.out.println("動物吃飯");}
}
class Cat extends Animal {public void eat () {System.out.println("貓吃魚");}public void catchMouse() {System.out.println("抓老鼠");}
}
class Dog extends Animal {public void eat () {System.out.println("狗吃肉");}public void lookHome() {System.out.println("看家");}
}
4.多態中的題目分析題
A:看下面程序是否有問題,如果沒有,說出結果
class Fu {public void show() {System.out.println("fu show");}
}class Zi extends Fu {public void show() {System.out.println("zi show");}public void method() {System.out.println("zi method");}
}class Test1Demo {public static void main(String[] args) {Fu f = new Zi();f.method();f.show();}
}
B:看下面程序是否有問題,如果沒有,說出結果
class A {public void show() {show2();}public void show2() {System.out.println("我");}
}
class B extends A {public void show2() {System.out.println("愛");}
}
class C extends B {public void show() {super.show();}public void show2() {System.out.println("你");}
}
public class Test2DuoTai {public static void main(String[] args) {A a = new B();a.show();B b = new C();b.show();}
}
5.抽象類的概述及其特點
A:抽象類概述
抽象就是看不懂的
B:抽象類特點
a:抽象類和抽象方法必須用abstract關鍵字修飾
abstract class 類名 {}
public abstract void eat();
b:抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者是接口
c:抽象類不能實例化那么,抽象類如何實例化呢?
按照多態的方式,由具體的子類實例化。其實這也是多態的一種,抽象類多態。
d:抽象類的子類
要么是抽象類
要么重寫抽象類中的所有抽象方法
C:案例演示
抽象類特點
abstract class JavaObject { //抽象類public static void main(String [] args) {//Animal a = new Animal();//Animal a = new Cat();//a.eat();}
}
abstract class Animal {public abstract void eat();
}
abstract class Cat extends Animal {/*public void eat() {System.out.println("貓吃魚");}*/
}