对象转型
1、一个基类的引用类型变量可以“指向”其子类的对象。
2、一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
3、可以使用 引用变量 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
4、子类的对象可以当做基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
举例:
1、向上转型
定义Animal动物类
public abstract class Animal//定义一个抽象的动物父类
{
public abstract void Play();//抽象方法没有方法体
}
定义Dog狗类
public class Dog extends Animal
{
public void Play()//重写父类的Play方法
{
System.out.println("狗在玩耍。。。。。");
}
public void eat()//子类还有自己特有的eat方法
{
System.out.println("狗在吃屎。。。。。");
}
}
定义Test测试类
public class Test
{
public static void main(String[] args){
Animal animal=new Dog();//向上转型,父类引用指向子类对象
animal.Play();//正常编译
//animal.eat();//编译不通过,父类的引用无法调用子类特有的方法
}
}
小结
1、将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换。
2、父类引用变量调用的是子类覆盖或继承父类的方法,不是父类的方法。
3、父类引用变量无法调用子类特有的方法。
2、向下转型
定义Animal动物类
public abstract class Animal//定义一个抽象的动物父类
{
public abstract void Play();//抽象方法没有方法体
}
定义Dog狗类
public class Dog extends Animal
{
public void Play()//重写父类的Play方法
{
System.out.println("狗在玩耍。。。。。");
}
public void eat()//子类还有自己特有的eat方法
{
System.out.println("狗正吃屎。。。。。");
}
}
定义Cat猫类
public abstract class Cat extends Animal//继承自Animal类,没重写父类方法,还是抽象类
{
}
定义Test测试类
public class Test
{
Animal animal=new Dog();
Dog dog=(Dog)animal;//向下转型,强制转换为狗对象
//Cat cat=(Cat)animal;//运行出错
}
小结
1、转型时转的类型必须是父类对象所指的真实子类对象,不是任意的强制类型转换。
总结
对象转型可以使父类对象的引用可以指向子类对象,给程序带来了比较好的可扩展性:我们可以在一个方法的参数里面定义父类的引用,然后实际当中传的时候传的是子类的对象,然后我们再在方法里面判断这个传过来的子类对象到底属于哪个子类,然后再去执行这个子类里面的方法或者调用这个子类里面的成员变量,因此程序的可扩展性比单独定义好多个方法要好一些。不过这个可扩展性还没有达到最好,使用多态就可以让程序的扩展性达到极致。(马士兵老师)
作者:胖羊的希望
来源:优快云
原文:https://blog.youkuaiyun.com/qq_29720657/article/details/78499562
版权声明:本文为博主原创文章,转载请附上博文链接!