-什么是多態(tài)
-1.即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼先朦,讓程序可以選擇多個(gè)運(yùn)行狀態(tài)碘菜,這就是多態(tài)性跨释。
-2.指向子類的父類引用由于向上轉(zhuǎn)型了窗宇,它只能訪問父類中擁有的方法和屬性,而對(duì)于子類中存在而父類中不存在的方法侦另,該引用是不能使用的秩命,盡管是重載該方法。若子類重寫了父類中的某些方法褒傅,在調(diào)用該些方法的時(shí)候弃锐,必定是使用子類中定義的這些方法(動(dòng)態(tài)連接、動(dòng)態(tài)調(diào)用)
-多態(tài)存在的三個(gè)必要條件
一殿托、要有繼承霹菊;
二、要有重寫支竹;
三旋廷、父類引用指向子類對(duì)象。
-經(jīng)典案例
-形狀類(父類)
**
- 父類Shape,抽象類
*/
public abstract class Shape {
//聲明兩個(gè)受保護(hù)類型的屬性x,y
protected double x;
protected double y;
//無參構(gòu)造器
public Shape(){
}
//全參構(gòu)造器礼搁,只做聲明饶碘,具體屬性初始化到子類中
public Shape(double x,double y){
}
//聲明一個(gè)抽象方法,抽象方法不能帶方法體
public abstract double getArea();
}
-三角形類(子類)
/**
- 三角形子類馒吴,繼承Shape扎运,實(shí)現(xiàn)方式同Rectangle
*/
public class Triangle extends Shape{
public Triangle(){
super();
}
public Triangle(double x, double y){
super.x=x;
super.y=y;
}
@Override
public double getArea(){
return this.x*this.y*0.5;
}
}
-矩形類(子類)
/**
-
矩形子類,繼承Shape,java是單一繼承饮戳,只能有一個(gè)父類
*/
public class Rectangle extends Shape {
public Rectangle(){
super();
}
public Rectangle(double x,double y){
//在構(gòu)造方法中給父類屬性x和y初始化豪治,通過super.x和super.y訪問父類屬性
super.x=x;
super.y=y;}
//重寫父類中的抽象方法getArea(),求出具體形狀的面積
@Override
public double getArea(){
//this.x和this.y是訪問當(dāng)前對(duì)象的x和y屬性, 此處用super.xsuper.y
return this.xthis.y;
}
}
-立方體子類
/**
- 立方體子類扯罐,繼承Rectangle類负拟,為最終類,不再被繼承
*/
public class Cube extends Rectangle {
//聲明一個(gè)私有屬性歹河,為立方體的高
private double height;
public Cube(){
}
public Cube(double x,double y,double height){
//調(diào)用父類構(gòu)造方法掩浙,完成對(duì)底面矩形的長琉挖,寬的初始化
super(x,y);
//通過this關(guān)鍵字,完成當(dāng)前立方體對(duì)象的高的初始化
this.height=height;
}
//本類獨(dú)有的成員方法涣脚,求體積
public double getVolum(){
//調(diào)用父類的求面積方法示辈,求出底面矩形面積,使用this.height訪問當(dāng)前立方體的高,最終求出立方體的體積
return super.getArea()*this.height;
}
}
-測試類
/**
- 主程序遣蚀,用來測試各種子類及方法
*/
public class Test {
public static void main(String[] args) {
//通過上轉(zhuǎn)型對(duì)象創(chuàng)建一個(gè)三角形的對(duì)象
Shape shape = new Triangle(4.0,3.0);
System.out.println("三角形面積是:"+shape.getArea());
//t通過上轉(zhuǎn)型對(duì)象創(chuàng)建一個(gè)矩形的對(duì)象
Shape shape1 = new Rectangle(4.0,3.0);
System.out.println("矩形面積是:"+shape1.getArea());
//通過最終類創(chuàng)建一個(gè)立方體對(duì)象
Cube cube = new Cube(4.0,3.0,2.0);
System.out.println("立方體體積是:"+cube.getVolum());
}
}