Java基础——向上转型和向下转型

对象实例化

了解向上转型和向下转型前,要先明白对象实例化的原理。对象实例化分为声明对象和实例化对象两部分。以Test one=new Test();为例。Test one就是声明对象,他是在内存的栈中开辟一块空间,但空间是空的。new Test就是实例化对象,他是在内存的堆空间里开辟一块空间,假设这块空间地址为0*0001。
visio真好用
这时候我们用赋值符号=,将两者关联起来。Test one =new Test();
在这里插入图片描述
堆空间的内存地址便存放在one空间里了,当我们对对象one进行操作时,其实就是在对堆空间进行修改。

向上转型和向下转型

向上转型又叫隐式转型或者自动转型。这种转型是比较安全的,不会造成信息的丢失。它是将一个子类对象转型为一个父类对象,即父类引用指向子类实例。
创建一个父类Animal,子类Cat,在测试类中实现向上转型,代码如下:

Animal one =new Cat();

向上转型后,对象one就不能调用子类独有的方法了,但是可以调用子类重写父类的方法以及父类派生的方法。

向下转型又叫强制类型转换。一般向下转型通常和运算符instanceof一起出现,下面用重写equals方法为例展示向下转型的用法。

public boolean equals(Object obj){
if (this==obj) return true;
if(!(obj instanceof Cat.class)) return false;
Cat cat=(Cat)obj;
return this.getName().equals(Cat.getName)&&this,getMonth()==cat.getMonth();
}

this为当前对象,obj为传入对象。
if(!(obj instanceof Cat.class))这里判断的是obj的本质是否为Cat类或Cat的子类,但此时,obj已经因为作为参数传入而自动向上转型为Object类。下面再用到obj时,需要的是他为本质类的状态,而java并不支持自动向下转型,因此,就需要强制将obj向下转型为他原本的类,即Cat cat=(Cat)obj;
除了重写equals方法,还可以简化程序。例如下面的程序,

public void feed(Cat cat) {
		cat.eat();
		cat.play();
	}
public void feed(Dog dog) {
		dog.eat();
		dog.sleep();
	}

当不同子类需要作为参数传入同一方法时,可以将传入参数改为其父类,再利用条件判断向下转型的方向。修改后代码如下:

	public void feed(Animal obj) {
		if(obj instanceof Cat) {
			Cat temp=(Cat)obj;
			temp.eat();
			temp.play();
		}else if(obj instanceof Dog) {
			Dog temp=(Dog)obj;
			temp.eat();
			temp.sleep();
		}
	}

注意:当父类和子类有重名的静态方法时,子类里的方法不算重写方法,因为父类的静态方法不能被重写,子类里的静态方法算子类特有的方法,当输出此方法时,输出的是父类里的静态方法。如果要调用子类里的静态方法,需要将对象再向下转型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值