关于Java多态下向上转型和向下转型的理解

刚接触Java,关于多态下向上转型和向下转型,以及父类和子类的调用很混乱,看了一天资料,终于搞明白了

  • 关于多态向上转型和向下转型的要点
  • 一、向上转型后子类不能调用自己的私有属性和私有方法,只能调用父类属性和重写父类方法
  • 二、如果向上转型后想要调用子类的私有属性和方法,可以强制向下转型
  •  Animal t1=(Animal)t   
    
  •  新创建了一个Animal类型的对象t1指向强制转换类型后的t			注:**t1和t的地址一样**  
    
  • 三、向下转型是有风险的,必须是继承关系才能转型成功,否则程序运行时就会抛出异常,为了防止这种情况,就要使用instanceof运算符

直接上代码

父类

package com.test.animal;
/*
 * Animal父类
 */
public class Animal {
	String name="动物";
	public Animal(){	
	}
	public void show() {
		System.out.println("我是父类Animal");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void sleep(Animal ani) {					
		System.out.println(ani.getName()+"睡觉");
	}
}

子类
Cat

package com.test.animal;
/*
 * Cat子类
 */
public class Cat extends Animal {
	String name="小猫";

	public Cat() {
		
	}
	public void show() {
		System.out.println("我是子类cat");
	}
	public void show1() {
		System.out.println("我是子类cat的私有方法");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

Dog

package com.test.animal;
/*
 * Dog子类
 */
public class Dog extends Animal {
	String name="小狗";

	public Dog() {

	}
	public void show() {
		System.out.println("我是子类Dog");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

测试类
Test

package com.test.animal;
public class Test {

	public static void main(String[] args) {
		Animal t=new Cat();						
		System.out.println(t.name);     		//调用父类的属性name
		t.show(); 								//调用子类重写的方法
/*
 * 向上转型后可以很方便的调用父类的sleep方法
 * 新加一个动物就可以用t.sleep(new 新动物类名() )来快速调用
 * 比如说以后有个Bird类,就可以直接t.sleep(new Bird())
 * 如果不使用向上转型就要在Bird类中重写一个sleep方法,重新申请对象,重新调用,太麻烦
 */		
		System.out.println(t.getName());		//同调用子类重写方法来获取子类属性
		t.sleep(new Animal());					//直接new匿名对象代入到方法
		t.sleep(new Cat());
		t.sleep(new Dog());
		System.out.println("============================");
//instanceof判断t是否是Animal的子类		
		if(t instanceof Animal) {				//当t属于Animal类下时才能强制转换
			Cat t1=(Cat)t;						//强制向下转换
			System.out.println(t1.name);		//转换后可以直接访问到子类属性
			t1.show1();							//直接访问子类的私有方法
		}
	}
}

运行结果

动物
我是子类cat
小猫
动物睡觉
小猫睡觉
小狗睡觉
===============================
小猫
我是子类cat的私有方法

总结:
向上转型
优点:可以快速的调用和重写父类方法,使代码简洁,大大减少程序员的工作量,这就是面向对象的思想
缺点:比起Cat t=new Cat()不能直接调用子类的私有属性和方法,但这种情况可以用强制向下转型来解决

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值