解决多态的缺点以及instanceof关键字的用法

解决多态的缺点以及instanceof关键字的用法

多态的缺点

缺点: 通过多态的父类引用无法访问子类所特有的方法

所以为了解决这个问题,在这里要引出另外一个“向下转型(强制转换)“的概念:

向下转型(强制转换)

格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
特点:
父类转为子类,父类引用转为子类对象。理解为强制类型转换
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常

向上转型(自动转换)(作为了解,不是解决多态存在的问题)

格式:<父类型> <引用变量名> = new <子类型>();
特点:
子类转为父类 父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
向下转型(强制转换)

instanceof关键字的用法

一般都是用在面向对象上面,其格式和作用如下:

格式: 左边对象 instanceof 右边类

作用: 判断左边对象是否属于右边类的实例,是返回true,不是返回false

功能其实通俗易懂,但是在这里却要引出instanceof关键字的重要性,每个关键字的出现都是为了解决现有存在的问题的,它能够配合向下转型来弥补多态的缺点

让我们结合代码来进行更深刻的理解。

public class PolymorphismDemo {

public static void main(String[] args) {
	Shap s = new Rectangle(2, 4);
	System.out.println(s.getArea());		
	//判断对象S是不是属于右边的类
	System.out.println(s instanceof Shap);
	System.out.println(s instanceof Rectangle);
	System.out.println(s instanceof Triangle);
	//if语句,逐一判断,逐一强制类型转换,达到可以使用父类没有的子类的方法
	if (s instanceof Rectangle) {
		Rectangle r = (Rectangle) s;
		r.showRectangle();
	} else if (s instanceof Triangle) {
		Triangle t = (Triangle) s;
		t.showTriangle();
	}
}

}

class Shap {
	public double getArea() {
		return 0.0;
	}
}

class Rectangle extends Shap {
	private double width;

	private double length;

	public Rectangle() {}	//无参构造
	//有参构造
    public Rectangle(double width, double length) {	
        super();
        this.width = width;
        this.length = length;
    }

    @Override
    public double getArea() {
        return width * length;
    }

    public void showRectangle() {
        System.out.println("我是矩形");
    }
}

class Triangle extends Shap {

    private double a;
    private double h;

    public Triangle() {}	//无参构造

    public Triangle(double a, double h) {	//有参构造
        super();
        this.a = a;
        this.h = h;
    }

    @Override
    public double getArea() {
        return a * h / 2;
    }

    public void showTriangle() {
        System.out.println("我是三角形");
    }
}
总结

至此,目前我们使用向下转型 + instanceof关键字能够解决多态的缺点,虽然需要对父类的所有子类做逐一判断,可能存在安全隐患或者违反开闭原则,但是如果在代码偏少的情况下是可以尝试这种解决方法的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值