java面向对象--------多态

多态:

不同环境下的多种形态,这句话很抽象,例如:”山上有两个老虎打架”,老虎就是一个类,如果在东北,这里的老虎就是东北虎,如果是在华南,这里老虎就指华南虎。如果老虎是父类,东北虎和华南虎都是老虎的子类,那么从面向对象的角度出发,华南虎的对象也属于老虎,这时即调用老虎打架的方法,那么具体的打架的对象就是华南虎对象。

多态在面向对象程序设计中,就是把子类的对象赋值给父类,用父类的引用调用方法的时候,具体执行方法的是子类的对象。

  1. 多态的优点:

1.多态可以增强程序的可扩展性以及维护性。

2.使得代码更加简洁,结构更加清晰。

  1. 多态的语法:

父类名 父类对象名=new 子类名([参数列表]);

比如现在要计算多个图像的面积,包括圆形,矩形等,但是每一个图形的计算方式有不同,我们可以使用继承来实现。

 1,定义一个Shape类

package com.bxit;

public class Shape {

/**

 * 计算图形的面积的方法

 * @return

 */

public double area(){

System.out.println("父类中的方法");

return 0;

}

}

  2.定义两个图形类Cycle和Square,并继承Shape类,重写Shape类中的area()方法

package com.bxit;

/**

 * 圆形

 * @author QJ

 *

 */

public class Cycle extends Sharp{

private double r;//半径

public static final double PI=3.14;//π

public double getR() {

return r;

}

public void setR(double r) {

this.r = r;

}

public Cycle(double r) {

this.r=r;

}

/**

 * 重写父类中的计算面积的方法

 */

@Override

public double area(){

double area=PI*r*r;

return area;

}

}

package com.bxit;

//长方形

public class Square extends Sharp{

private double chang;

private double kuan;

public double getChang() {

return chang;

}

public void setChang(double chang) {

this.chang = chang;

}

public double getKuan() {

return kuan;

}

public void setKuan(double kuan) {

this.kuan = kuan;

}

public Square(double chang, double kuan) {

super();

this.chang = chang;

this.kuan = kuan;

}

//重写父类中的计算面积的方法

@Override

public double area() {

double area=chang*kuan;

return area;

}

}

3,编写测试类

package com.bxit;

//多态

public class Test {

/**

 * 多态:不同环境下面的多种形态。

 *       将子类的引用(内存地址)赋值给父类对象,

 *       使用父类对象调用方法的时候其实调用的是子类重写后

 *       或者继承过来的父类的方法的方法。

 */

//计算图形的面积

public static void main(String[] args) {

//创建子类的对象并将子类的对象赋值给父类(多态)

Sharp sharp=new Cycle(5);

double area=sharp.area();

System.out.println(area);

Sharp sharp2=new Square(4, 5);

double area1=sharp2.area();

System.out.println(area1);

}

}

注意:上面的例子中,红色字体的部分就是把子类的对象赋值给父类的引用,当调用父类的方法的时候,调用的是具体的子类的方法。各个子类完成的求面积的方法不同,因此需要在子类中对area方法进行重写(Override)

  1. 多态的使用:

一般做法:写一个方法,它只接受父类作为参数,编写的代码只和父类打交道,调用这个方法的时候,实例化不同子类的对象(new一个对象)。   

具体为:

  1. 子类重写父类的方法。
  2. 把父类类型作为参数的类型,该父类以及子类对象作为参数传入。
  3. 运行的时候,根据实际创建爱你的对象类型动态的决定使用那个方法。

在运行时,java虚拟机会根据实际创建的对象类型动态决定使用那个方法,一般将这称之为动态绑定

例如:课件中的小男孩养宠物就是一个很典型的多态使用实例。 

instanceof:

InstanceofJava中的关键字,用来判断一个对象是否是某一个类的对象。

  1. 语法:

对象名 instanceof 类名

判断该对象是否属于某一个类的对象,如果属于则返回true,否则返回false。

在使用Instanceof时,对象的类型必须和Instanceof后面的参数所指定的类在继承上有上下级的关系,结果才会为true.

例如:

     if(sharp2 instanceof Cycle){

System.out.println("是圆形");

}else if(sharp2 instanceof Square){

System.out.println("是长方形");

}else{

System.out.println("未知图形");

}

说明:

子类对象赋值给父类的引用时多态的表现形式,也叫做向上转型。   

相反,将父类的对象赋值给子类的,首先需要强制类型转换,类之间的强制类型转换的方法与前面学习的强制类型转换方法一致,我们将这种强转叫做向下转型。

向下转型的语法:

子类名 子类对象=(子类名)父类的对象;

例如:

       Pet p2=new Cat("小黑");

//向下转型(必须要进行强制类型转换)

/**

 * 向下转换的语法:

 * 子类名 子类对象=(子类名)父类的对象;

 */

Cat cat=(Cat) p2;

cat.pa();

注意:当调用子类中特有的方法(父类中没有的方法),必须要使用子类的对象去调用    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值