希望各位新手程序員可以通過我這個博客學會多態。(儘量短一點)
多態體現形式:父類的引用指向自己的子類對象。 (簡單理解:父類的方法被子類同名方法覆蓋)
多態的前提:類之間必須有關係,要麼基礎,要麼實現,存在覆蓋。
多態的好處:提高程序的擴展性。
多態的弊端:只能使用父類中的成員。
打個比方,動物有小豬,小貓,小豬,小貓都是動物。
我們可以:
小貓 xx=new 小貓();
小豬 xx=new 小豬();
和下面的
動物 xx=new 小豬();
動物 xx=new 小貓();
是一個效果。
動物可以作爲小豬,也可以作爲小貓,這就是多態。
氣死我了,上代碼:
package duotai;
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat() {
System.out.print("小貓喫東西");
}
}
class Pig extends Animal{
public void eat() {
System.out.print("小豬喫東西");
}
}
public class duotai {
public static void main(String[] args) {
Cat cat=new Cat();
Pig pig=new Pig();
cat.eat();
pig.eat();
}
}
輸出是:小貓喫東西小豬喫東西
下面寫一個同樣結果的程序:
package duotai;
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat() {
System.out.print("小貓喫東西");
}
}
class Pig extends Animal{
public void eat() {
System.out.print("小豬喫東西");
}
}
public class duotai {
public static void eat(Animal a) {
a.eat();
}
public static void main(String[] args) {
Animal cat=new Cat();
Animal pig=new Pig();//這叫向上轉型,子類向父類轉。
eat(cat);
eat(pig);
}
}
這個輸出是:小貓喫東西小豬喫東西
但是豬喜歡睡覺動物不是都喜歡睡覺,那小豬想表達睡覺怎麼辦?
氣死我了,上代碼。
package duotai;
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat() {
System.out.print("小貓喫東西");
}
}
class Pig extends Animal{
public void eat() {
System.out.print("小豬喫東西");
}
public void sleep()
{
System.out.print("小豬在睡覺");
}
}
public class duotai {
public static void main(String[] args) {
Animal pig=new Pig();
pig.sleep();
}
}
這個代碼會報錯的。因爲Animal建立的Pig對象沒有sleep函數/
氣死我了上解決方法:
package duotai;
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat() {
System.out.print("小貓喫東西");
}
}
class Pig extends Animal{
public void eat() {
System.out.print("小豬喫東西");
}
public void sleep()
{
System.out.print("小豬在睡覺");
}
}
public class duotai {
public static void main(String[] args) {
Animal pig=new Pig();
Pig a=(Pig)pig;//向下轉型
a.sleep();
}
}
這樣就好了。輸出小豬在睡覺。
父類指向子類的時候,父類方法會被字類覆蓋。(這是非靜態方法哦,靜態成員會被重寫在另一個內存裏,我們這樣繼承的話,父類的方法不會被子類重寫)
package duotai;
class dad {
public void a() {
System.out.print("a_dad");
}
public void b() {
System.out.print("b_dad");
}
}
class son extends dad {
public void a() {
System.out.print("a_son");
}
public void b() {
System.out.print("b_son");
}
}
public class duotai {
public static void main(String[] args) {
dad k=new son();
k.a();
k.b();
}
}
輸出爲a_son b_son
看代碼的時候a
那麼在類中存在的變量會不會和上面函數一樣父類的方法被字類覆蓋?
氣死我了上代碼:
package duotai;
class dad {
int num=1;
public void a() {
System.out.print("a_dad");
}
public void b() {
System.out.print("b_dad");
}
}
class son extends dad {
int num=2;
public void a() {
System.out.print("a_son");
}
public void b() {
System.out.print("b_son");
}
}
public class duotai {
public static void main(String[] args) {
dad k=new son();
son m=new son();
System.out.print(k.num);
System.out.print(m.num);
}
}
輸出爲12事實證明父類的變量不會被字類的變量覆蓋
每天一個學廢小技巧:instanceof 確定對象類型
代碼:
package duotai;
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat() {
System.out.print("小貓喫東西");
}
}
class Pig extends Animal{
public void eat() {
System.out.print("小豬喫東西");
}
public void sleep()
{
System.out.print("小豬在睡覺");
}
}
public class duotai {
public static void dd(Animal a) {
if(a instanceof Cat) {
System.out.print("這是貓");
}
if(a instanceof Pig) {
System.out.print("這是豬");
}
}
public static void main(String[] args) {
Animal cat=new Cat();
Animal pig=new Pig();
dd(cat);
dd(pig);
}
}
課後練習:
可以把人分男人和女人,人作爲父類,男人女人繼承人這個父類,具體功能各位可以隨意寫,建議初學者直接輸出(System.out.print())自己用上轉型,下轉型完成一些操作。加油!!!