一、向上转型 (父类引用指向子类对象)
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("如果没有打印我,就说明不具有继承或者实现关系");
}
}
}
如有不正确或者考虑不全的,麻烦告知一下我。顺便帮我解答我的一些疑问,感恩!!!