zoukankan      html  css  js  c++  java
  • 49 向上造型与向下造型

    向上造型(转型)

    定义:超类的引用指向子类对象。

    例如:

    Animal o1 = new Tiger();//Tiger是Animal的派生类(子类)
    

      以上即为向上转型。

    特性:

    • 向上转型后的引用只能使用超类中的方法和属性。
    • 向上转型后的引用不能使用派生类中自有的方法和属性,可以使用重写父类的方法

    向下造型(转型)

    将一个已经向上转型的引用强制向下转型,并用一个新的派生类引用接收。

    注意:

    • 向下转型后的引用既可以使用超类中的也可以使用它自己的类(当前派生类)中的方法和属性。
    • 向下转型后需要使用一个派生类引用来接收。

    以上面的代码为前提,向下转型:

    Tiger o2 = null;//先声明一个需要向下转型为的派生类的引用
    	if(o1 instanceof Tiger) {//判断当前引用是否指向该派生类的对象
    		o2 = (Tiger)o1;//向下转型
    		//o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法
    		}
    

      

    案例完整代码

    Tiger类向上转型Animal,之后再向下转型Tiger.

    package OOday03;
    /**
     * 向上转型
     * @author TEDU
     * Animal a1 = new Tiger();
     * 超类的引用a1指向派生类对象new Tiger() 这个就是向上转型
     * a1只能使用超类中的方法,不能使用Tiger中的方法
     */
    public class UploadDemo {
    	public static void main(String[] args) {
    		//向上造型
    		System.out.println("--------向上造型------------");
    		Animal o1 = new Tiger();
    		System.out.println(o1.str1);//向上造型后的o1只能使用超类中的属性
    		o1.sayHi();//和方法
    		//向下转型
    		System.out.println("--------向下造型-----------------");
    		Tiger o2 = null;
    		if(o1 instanceof Tiger) {
    			o2 = (Tiger)o1;
    			//o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法
    			//转型后就可以使用派生类的方法了
    			System.out.println(o2.str1);//超类中的属性
    			o2.sayHi();//超类中的方法
    			System.out.println(o2.str2);//派生类中的属性
    			o2.sayHello();
    		}
    		
    	}
    }
    class Animal{
    	String str1 = "超类中的属性";
    	public void sayHi() {
    		System.out.println("超类中的方法");
    	}
    }
    
    class Tiger extends Animal{
    	String str2 = "派生类中的属性";
    	public void sayHello() {
    		System.out.println("派生类中的方法");
    	}
    }
    

      

    运行结果:

    --------向上造型------------
    超类中的属性
    超类中的方法
    --------向下造型-----------------
    超类中的属性
    超类中的方法
    派生类中的属性
    派生类中的方法
    

      

  • 相关阅读:
    8.Http的状态码有哪些
    6、<!DOCTYPE>声明是什么意思
    6.px和em的区别
    5、什么叫优雅降级和渐进增强
    3、简述src和href的区别;@import和link的区别
    2、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?
    1、盒模型理解
    requests学习(一)——get请求
    【Flutter】功能型组件之跨组件状态共享
    【Flutter】功能型组件之数据共享
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12022543.html
Copyright © 2011-2022 走看看