zoukankan      html  css  js  c++  java
  • 《java入门第一季》之面向对象(多态向下转型)

    上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端。如下:

    /*
    	多态的弊端:
    		不能使用子类的特有功能。
    		
    	我就想使用子类的特有功能?行不行?
    		行。
    		
    	怎么用呢?
    		A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
    		B:把父类的引用强制转换为子类的引用。(向下转型)
    		
    	对象间的转型问题:
    		向上转型:
    			Fu f = new Zi();
    		向下转型:(容易出现问题)
    			Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。类型要匹配
    			
    			不可行案例:Ren r = (cat) Cat();猫转成人显然不可能的。
    */
    class Fu {
    	public void show() {
    		System.out.println("show fu");
    	}
    }
    
    class Zi extends Fu {
    	public void show() {
    		System.out.println("show zi");
    	}
    	
    	public void method() {
    		System.out.println("method zi");
    	}
    
    }
    
    class DuoTaiDemo4 {
    	public static void main(String[] args) {
    		//测试
    		Fu f = new Zi();
    		f.show();
    		//f.method();//找不到符号,父类中没有method()
    		
    		//创建子类对象,可以,但是很多时候不合理。而且,太占内存了
    		//Zi z = new Zi();
    		//z.show();
    		//z.method();
    		
    		Zi z = (Zi)f;//注意格式哦!
    		z.show();
    		z.method();
    	}
    }

    既然向下转型也会出现问题,接下来就演示一个出问题的向下转型问题。(这个问题是因为语法不规范导致的)

    /*
    	ClassCastException:类型转换异常
    	一般在多态的向下转型中容易出现
    */
    class Animal {
    	public void eat(){}
    }
    
    class Dog extends Animal {
    	public void eat() {}
    	
    	public void lookDoor() {
    	
    	}
    }
    
    class Cat extends Animal {
    	public void eat() {
    		
    	}
    	
    	public void playGame() {
    		
    	}
    }
    
    class DuoTaiDemo5 {
    	public static void main(String[] args) {
    		//内存中的是狗
    		Animal a = new Dog();
    		System.out.println(a);
    		Dog d = (Dog)a;//向下转型了
    		System.out.println(d);
    		
    		//内存中是猫
    		//Animal a = new Cat();Animal a记住不可以这样定义。错误: 已在方法 main(String[])中定义了变量 a。个人理解的是发生变量赋值“冲突”
            //(希望看到的读者一起讨论上边报错的具体原因)
    		a = new Cat();//向下转型
    		System.out.println(a);
    		Cat c = (Cat)a;//向下转型
    		System.out.println(c);
    		
    		//内存中是猫
    		//Dog dd = (Dog)a; //ClassCastException,a是猫的内容,没法向下转型到狗去。猫变不成狗
    	}
    }
    
    
    
    

    多态问题的内存图解如下:


  • 相关阅读:
    项目开源-基于ASP.NET Core和EF Core的快速开发框架
    YoyoGo使用指南
    使用SpringSecurity Oauth2.0实现自定义鉴权中心
    Go语言系列之手把手教你撸一个ORM(一)
    记一次容器CPU高占用问题排查
    Spring Boot系列 八、集成Kafka
    Spring Boot系列:七、 实现Mybatis多数据源切换
    SpringBoot系列:六、集成Swagger文档
    MyBatis系列:二、配置文件详解
    MyBatis系列:一、入门
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299857.html
Copyright © 2011-2022 走看看