多态性
多态性是我们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;
}
}
这样操作,我们就可以更进一步的防止报错