我們知道Java的三大特性:封裝、繼承、多型。前兩個之前在Java入門(六)已經講到,現在來講多型這個特性。
多態顧名思義即為多種形態的意思
Java中多態的意思:
傳送訊息給某個對象,讓這個物件自行決定採用哪種行為回應這個訊息
子類別物件的引用賦值給父類別引用變數來實作動態的方法呼叫
Java中形成多態的前提:
繼承
#父類別方法的重寫
向上轉型
例如我們,是人,也是學生,也是年輕人,我可以用人的身分去做事情,也可以用學生的身分去買學生票,也可以用年輕人的身分做公益,這樣我們可以透過不同的形態去做不同的事情。這樣是不是比較懂一點?
注意:
多態前提條件:必須有子父類別關係。
在使用多態後的父類別引用變數呼叫方法時,會呼叫子類別重寫後的方法。
多態的定義與使用格式:
父類別類型變數名稱=new 子類別類型();
多型態中成員的特性:
多態成員變數:編譯運行看左邊
多型成員方法:編譯看左邊,運行看右邊
##。態本身就是向上轉型過的過程
使用格式:父類別類型變數名稱=new 子類別類型();
適用場景:當不需要面對子類別類型時,透過提高擴展性,或使用父類別的功能就能完成對應的操作。
向下轉型:一個已經向轉型的子類別物件可以使用強制型別轉換的格式,將父類別參考型別轉為子類別引用各型別
#使用格式:子類別類型變數名稱=(子類別類型) 父類別類型的變數;
適用場景:當要使用子類別特有功能時。
程式碼解釋:
public class Person { //人类,作为父类使用 public void speak(){ System.out.println("我们都是一个人"); } } public class Student extends Person{ //继承父类,相当于我们是学生,有人的方法 @Override public void speak(){ System.out.println("我是人类中的学生"); } } public class Child extends Person{ //继承父类,相当于我们是孩子,有孩子的行为 @Override public void speak(){ System.out.println("我是人类中的孩子"); } } //测试类 public class TestMain { public static void main(String[] args) { //父类类型 变量名=new 子类类型(); Person p = new Student(); //子类对象的引用赋值给父类 p.speak(); //多态 相当于这里使用的是Student的方法。输出我是人类中的学生 //我作为人,我用学生的身份,说出:我是人类中的学生 Person p = new Child(); p.speak(); //输出:我是人类中的孩子 //我作为人,用孩子的身份,说出我是人类中的孩子 } } //这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
介紹完多態,講講多態有什麼用呢?為什麼多態可以作為Java的三大特性。肯定是有原因的:
提高程式碼的可重用性
降低模組之間的耦合度
#這裡要跟大家介紹一下什麼是多態機制? Java語言是如何實現多型的? (可能有點難以理解,本人對於該內容也沒用理解充分,但這也是面試會考的題)
對於多態的理解,也可以參考一段程式碼:
class People{ //父类 public void eat(){ System.out.println("我们会吃饭"); } } class Student extends People{ //继承父类 @Override public void eat(){ System.out.println("我会吃肉"); } public void study(){ System.out.println("我们要好好学习"); } } class Teacher extends People{ //继承父类 @Override public void eat(){ System.out.println("老师会吃蔬菜"); } public void teach(){ System.out.println("老师要认真上课"); } } //测试类: public class TestMain { public static void main(String[] args) { People p=new Stu(); //子类对象的引用赋值给父类 p.eat(); //输出: 我会吃肉 } }
抽象類別:
什麼是抽象類別?
普通類別是一個完善的功能類,可以直接產生實例化對象,並且在普通類別中可以包含有建構方法、普通方法、static方法、常數和變數等內容。而抽象類別是指在普通類別的結構裡面增加抽象方法的組成部分。
抽象方法:
在所有的普通方法上面都會有一個“{}”,這個表示方法體,有方法體的方法一定可以被物件直接使用。而抽象方法,是指沒有方法體的方法,同時抽象方法也必須使用關鍵字abstract做修飾。也就是說,抽象類別裡面的抽象方法,可以不寫,在被繼承後,再重寫。
抽象類別宣告關鍵字:abstracat
定義一個抽象類別:
public abstract class studnet{//定义一个抽象类 public void study(){ //普通方法 System.out.println("我会学习"); } public abstract void eat(); //抽象方法,没有方法体,有abstract关键字做修饰 } //注意: 有抽象方法,这个类必须是抽象的!!!###範例解釋:######形狀類別Shape需要提供用於計算面積和週長的方法,但是形狀本身沒有被確定,那麼計算週長和麵積的方法就無法確定,此時我們就需要使用抽象類別和抽象方法。 ###
由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。
//定义一个shape类,但是没有具体的形状,所以我们定义成抽象类 public abstract class Shape { private int a; public abstract void area(){} //求面积的方法 public abstract void perimeter(); //求周长的方法 public Shape() { //无参构造 } public Shape(int a) { this.a = a; } }
//计算圆形面积的子类 public abstract class shape { //有抽象方法的类,则一定是抽象类,需要关键字abstract修饰 private int a; public abstract void area(); //求面积的方法,没有方法体的方法,需要关键字abstract修饰 public abstract void perimeter(); //求周长的方法 } //创建计算圆面积和周长的子类,并继承抽象类shape,并重写shape内的方法 public class Circle extends shape{ public static double pi = 3.14; private double r; //半径 @Override public void area() { System.out.println("圆的面积:"+Circle.pi*this.r*this.r); } @Override public void perimeter() { System.out.println("圆的周长为:"+2*Circle.pi*this.r); } public Circle() { } public Circle(double r) { // this.r = r; } } //测试类: public class TestMain { public static void main(String[] args) { Circle c = new Circle(5); //传入半径为:5 c.area(); c.perimeter(); } }
//输出结果: 圆的面积:78.5
// 圆的周长为:31.400000000000002
抽象方法和抽象类的注意事项:
抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。
抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。
以上是Java多型與抽象類別的使用與原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!