面向对象特性之一 —— 多态性

多态性

多态性是我们java特性中最重要的一点。因为很方便,所以用的比较多。

java中的多态性主要是父类的引用指向子类的对象(或者子类的对象赋给对象的引用)

举个最简单的例子

public class Test{

    public static void main(String[] args) {
        SuperClass s1 = new Subclass();
    }
    
}

class Subclass extends SuperClass{
    
}
class SuperClass{
    
}

这个s1就可以看作SuperClass类型的,但他是SubClass类的实例对象。

我们只能调用父类的方法或属性,不能调用子类特有的方法或属性。但在调用父类的方法或属性的时候,调用的确实我们子类中重写的方法。

原因:我们先定义了SuperClass的类型的变量,所以只能调SuperClass里面的东西,然后给他赋值的时候,是子类中给它赋值的。

这里属性也是同理

但是,如果我们就是想要调用我们子类特有的属性或方法呢?

这个时候我们就需要用到强制类型转换了

多态性中的强制类型转换

我们知道

int number =10;
double d1 = number;

这样的也可算是一种自动类型提升的例子,与我们多态的使用有几分相似

同样的,既然强制类型转换是自动类型提升的逆过程,则我们的多态中的强制类型转换则是

public class Test{

    public static void main(String[] args) {
        SuperClass s1 = new Subclass();

        Subclass s2 = (Subclass) s1;//这里是强制类型转换
        s2.getNumber();//经过上一步,我们这个时候就可以调用我们子类特有的属性或方法了
    }
}

class Subclass extends SuperClass{

    public int getNumber(){
        return number;
    }

}

class SuperClass {

    int number;

    public void setNumber(int number) {
        this.number = number;
    }
}

但是,有的时候强制类型转换是会报错了

比如这个

public class Test1{

    public static void main(String[] args) {
        SuperClass s1 = new Subclass();
        SubClass1 s2 = (SubClass1) s1;//这里是想要将s1转换为SubClass1类型,然后就报错了
    }
}

class Subclass extends SuperClass{

    public int getNumber(){
        return number;
    }

}
class SubClass1 extends SuperClass{

}
class SuperClass {

    int number;

    public void setNumber(int number) {
        this.number = number;
    }
}

因为向下转型和向上转型可以看成逆过程,所以如果我们将s1转换成SubClass1类型的话,我们是不能把这个看作逆过程的,所以转换不了。

所以这个时候我们就需要使用到instanceof关键字

instanceof关键字的使用

instanceof关键字可以用来判断某一个对象a是否为类A的实例,如果是,返回true,如果不是,返回false。

如果类B是类A的父类,a又是A类的实例对象,则我们a instanceof A 为true,且 a instanceof B 也为true

public class Test{

    public static void main(String[] args) {
        SuperClass s1 = new SubClass();
        if(s1 instanceof SuperClass){
            SubClass s2 = (Subclass) s1;

        }
        if (s1 instanceof SubClass1){
            SubClass1 s2 = (SubClass1) s1;
        }
    }
}

class SubClass extends SuperClass{

    public int getNumber(){
        return number;
    }

}
class SubClass1 extends SuperClass{

}
class SuperClass {

    int number;

    public void setNumber(int number) {
        this.number = number;
    }
}

这样操作,我们就可以更进一步的防止报错

SuperClass{

}
class SuperClass {

    int number;

    public void setNumber(int number) {
        this.number = number;
    }
}

这样操作,我们就可以更进一步的防止报错

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值