Java基础----向上转型和向下转型及instanceof关键字

一、向上转型 (父类引用指向子类对象

package cn.zj.cq;

public class Demo03Animal {
	public void run() {
		System.out.println("我动物跑的飞快");
	}
}

package cn.zj.cq;

public class Demo03Dog extends Demo03Animal{
@Override
public void run() {  //子类重写了父类run方法,会覆盖父类中的run方法
	// TODO Auto-generated method stub
	System.out.println("狗子也能跑");
}
public void eat() {
	System.out.println("我还敢吃屎");
}
}

package cn.zj.cq;
//
public class Demo03Main {
	public static void dorun(Demo03Animal A) {
		A.run();
	}
	public static void main(String[] args) {
		Demo03Animal ad = new Demo03Dog(); //这里就是向上转型,父类引用指向子类对象
		ad.run(); //这里调用的是子类的方法,输出狗子也能跑
		//ad.eat();//java向上转型不能调用子类独有的方法:1.ad是animal的引用,他不知道自己存在eat方法;2。如果能调用的话,所有动物都能吃屎?
		Demo03Animal an = new Demo03Animal();
		Demo03Dog dg = new Demo03Dog();
		dorun(an); //这里的an就是new Demo03Dog;传入后相当于(new Demo03Dog).run方法,(匿名对象??)输出:我动物跑的飞快
		dorun(ad);//大致意思同上,输出:狗子也能跑
		dorun(dg);//大致意思同上,输出:狗子也能跑
	}
}

二、向下转型

package cn.zj.cq;

public class Demo04People {
		public void jump() {
			System.out.println("我是人我能跳高");
		}
}

package cn.zj.cq;

public class Demo04Man extends Demo04People{
@Override
public void jump() {
	// TODO Auto-generated method stub
	System.out.println("我不仅能跳高,我还能站着嘘嘘");
}
public void think() {
	System.out.println("下半身思考");
}
}


package cn.zj.cq;

public class Demo04Main {
public static void main(String[] args) {
	Demo04People dp = new Demo04Man();//这是向上转型
	Demo04Man dmA = (Demo04Man) dp;//这是向下转型
	dmA.jump();//输出:我不仅能跳高,我还能站着嘘嘘
	dmA.think();//输出:下半身思考
	Demo04People dd = new Demo04People();
	/*
	 * Demo04Man dmB = (Demo04Man) dd; //这里编译不报错,运行肯定是要报错的,下面的也就不成立了
	 * dmB.jump();
	 * dmB.think();
	 */
}
}

总结:向上转型---->父类引用执行子类对象;

1.Animal aa = new Dog();  这是向上转型:父类(Animal)的引用(aa) 指向子类的对象(new Dog());

Dog dd = (Dog) aa;这是向下转型:aa还是指向Dog对象;

所以说要先有向上转型,然后才有向下转型;

2.Animal aa = new Animal(); 父类(Animal)的引用(aa) 指向父类的对象(new Animal());

Dog dd = (Dog) aa;这里我们按照前面的来思考:aa是指向父类对象(new Animal),但是这里用Dog来接收。

三、转型时遇到方法重写和相同的属性时

package cn.zj.cq;

public class Demo04People {
		public String name = "父类";
		public void jump() {
			System.out.println("我是人我能跳高");
		}
}

package cn.zj.cq;

public class Demo04Man extends Demo04People{
	public String name = "子类";
@Override
public void jump() {
	// TODO Auto-generated method stub
	System.out.println("我不仅能跳高,我还能站着嘘嘘");
}
public void think() {
	System.out.println("下半身思考");
}
}


package cn.zj.cq;

public class Demo04Main {
public static void main(String[] args) {
	Demo04Man dm = new Demo04Man();
	Demo04People dp = dm ;//这是向上转型
	System.out.println(dp.name);//输出:父类  ???为什么呢。(看=左边是谁)看这个----》https://blog.csdn.net/weixin_42456439/article/details/106180713
//总的来说,属性是根据创建对象的所有者是谁,就是=号左边那个
	dp.jump();//输出:我不仅能跳高,我还能站着嘘嘘
	//dp.eat();这里会报错,向上转型不能调用子类独有的方法:不是所有动物都吃屎。这里需要向下转型
	Demo04Man dmA = (Demo04Man) dp;//这是向下转型
	System.out.println(dmA.name);//输出子类
	dmA.jump();//输出:我不仅能跳高,我还能站着嘘嘘
	dmA.think();//输出:下半身思考
	Demo04People dd = new Demo04People();
	/*
	 * Demo04Man dmB = (Demo04Man) dd; //这里编译不报错,运行肯定是要报错的,下面的也就不成立了,这里就知道instanceof关键字的重要性了
	 * dmB.jump();
	 * dmB.think();
	 */
}
}

参考博文:https://www.cnblogs.com/xiaoyezideboke/p/10939219.html

四、instanceof关键字:判断是否有继承或者实现关系。疑问:对自己的对象使用这个为什么为真?求解答

使用上面的向下转型的代码:

package cn.zj.cq;

public class Demo04People {
		public String name = "父类";
		public void jump() {
			System.out.println("我是人我能跳高");
		}
}


package cn.zj.cq;

public class Demo04Man extends Demo04People{
	public String name = "子类";
@Override
public void jump() {
	// TODO Auto-generated method stub
	System.out.println("我不仅能跳高,我还能站着嘘嘘");
}
public void think() {
	System.out.println("下半身思考");
}
}

package cn.zj.cq;

public class Demo04Main {
public static void main(String[] args) {
	Demo04People dp = new Demo04Man();//这是向上转型
	if(dp instanceof Demo04Man) {//检查是否具有继承关系或者是否有实现关系
		System.out.println("有继承关系");//输出:有继承关系
	}
	if(dp instanceof Demo04People) {
		System.out.println("这是什么关系,知道的回复我一下,谢谢"); //输出:这是什么关系,知道的回复我一下,谢谢
	}
	Demo04Man dmA = (Demo04Man) dp;//这是向下转型
	dmA.jump();//输出:我不仅能跳高,我还能站着嘘嘘
	dmA.think();//输出:下半身思考
	Demo04People dd = new Demo04People();
		if(dd instanceof Demo04Man) {
	  Demo04Man dmB = (Demo04Man) dd; //这里编译不报错,运行肯定是要报错的,我们就用instanceof关键来判断一下
	  //if(aa instanceof Demo04Man)
	  dmB.jump(); 
	  dmB.think();
	 System.out.println("如果没有打印我,就说明不具有继承或者实现关系");
}
}
}


如有不正确或者考虑不全的,麻烦告知一下我。顺便帮我解答我的一些疑问,感恩!!!

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值