java中的向下转型和向上转型

关于转型

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

向上转型

向上转型子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向上转型[ 格式: 父类名 对象名=new 子类名(); ]

class Animal{
	int num=100;
	void say(){
		System.out.println("It's an Animal.");
	}
}

class Dog extends Animal{
	int num=50;
	void say(){
		System.out.println("It's a Dog.");
	}	
	void bark(){
		System.out.println("汪汪汪!");
	}
}

public class example{
	public static void main(String[] args) {
		Animal dog=new Dog();//向上转型	
		System.out.println(dog.num);
		dog.say();
//		dog.bark();
	}
}

100
It's a Dog.

这里我们通过Dog类向上转型Animal类有了dog这个对象,那么dog这个对象能干什么呢?由上述作用我们可以知道:dog这个对象可以访问dog对应类(Animal)里面的变量但不能访问Dog类里面的变量,dog还可以访问Animal子类的Dog类里面的say()方法(重写的父类方法)。固最后的运行结果就是上面那样。

注意
1.若子类没有重写父类方法那么该对象只能访问自己的变量和自己类里的方法。
2.不能通过此对象访问子类新增的方法即子类有但父类里没有的方法,所以在上面的代码中main里面就不能运行dog.bark();这行代码。

向下转型

向下转型父类引用的对象转换为子类类型称为向下转型
向下转型[ 格式: 子类名 对象名=(子类名) 已向上转型的对象名; ]

class Animal{
	int num=100;
	void say(){
		System.out.println("It's an Animal.");
	}
}

class Dog extends Animal{
	int num=50;
	void say(){
		System.out.println("It's a Dog.");
	}	
	void bark(){
		System.out.println("汪汪汪!");
	}
}

public class example{
	public static void main(String[] args) {
		Animal dog=new Dog();//向上转型
		Dog dog2=(Dog) dog;//向下转型
		System.out.println(dog2.num);
		dog2.say();
		dog2.bark();
	}
}

50
It's a Dog.
汪汪汪!

由上述作用应该不难理解运行结果,所以我就解释一下为什么输出是50而不是100,其原因很简单因为子类中变量和父类变量重名,类似于“重写”,子类的变量就把父类相同的变量给覆盖掉了即100被50给覆盖,所以我们访问的num变量值是50而不是100。(所以我们就记住这个道理:子类重写就覆盖,不重写我依然可以访问父类里面的东西,所以访问方法也是这个道理)
注意:向下转型需要建立在向上转型的基础之上,即在进行向下转型的时候必须要有向上转型的步骤否则会报错,错误用法如下:

Animal dog=new Animal();//仅仅创建了一个父类对象,并没有向上转型
Dog dog2=(Dog)dog;//向下转型,运行时编译器会报错

总结:

1、父类引用可以指向子类对象,子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

   如Father father = new Son();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

   其中father前面的(Son)必须添加,进行强制转换。

4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效

5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值