Java的转型问题


前言

Java的基础知识掌握还不够透彻,导致到后面学习越发吃力 决心返回对一些重要的基础知识重新理解一下。

向上转型

举个例子:有2个类,Father 是父类,Son 类继承自 Father。

当我们可以实例Father和Son实例的时候,通俗易懂的写法:

Father f = new Father();
Son s = new Son();

而当我们这么写的时候就叫向上转型:

Father test = new Son();

这是因为Son继承自Father,因此,它拥有Father的全部功能。Father类型的变量,如果指向Son类型的实例,对它进行操作,是没有问题的!

注意:这时候test指向Son对象,向上转型的时候会遗失除与父类对象共有的其他方法以及字段。

例如如下代码:

public class Fan{
    public static void main(String[] args) {
        Father test = new Son();
        test.eat();
       // test.run();  编译器报错。
    }
}

class Father{
    public void eat(){
        System.out.println("Father eating");
    }
}

class Son extends Father{
    public void run(){
        System.out.println("Running");
    }
    public void eat(){
        System.out.println("Son eating");
    }

}
/*
* 编译结果:
* Son eating
* */

向下转型

与向上转型相反,即是把父类对象转为子类对象。

向下转型测代码:

Father p1 = new Son(); // ok
Father p2 = new Father();
Son s1 = (Son) p1; // ok
Son s2 = (Son) p2; // error

这里因为p1本质是是指向Son实例的,所以p1向下转型可以成功。而p2是指向父类Father,父类无法变成子类,因为子类一般会比父类多方法,而父类无法把多出来的方法变成的方法变出来,所以会失败。

所以综上所述向下转型可能失败,所以instanceof 函数来判断是否是指定的类型

Father p = new Son();
if (p instanceof Son) {
    // 只有判断成功才会向下转型:
    Son s = (Son) p; // 一定会成功
}

向下转型的作用: 向上转型时 b会遗失除与父类对象共有的其他方法;可以用向下转型在重新转回,这个和向上转型的作用要结合理解。

比如上面代码中无法调用子类的run方法这里我们可以这样写:

package com.company;

public class Fan{
    public static void main(String[] args) {
        Father test = new Son();
        test.eat();
        Son t = (Son) test;
        t.run();
    }
}

class Father{
    public void eat(){
        System.out.println("Father eating");
    }
}

class Son extends Father{
    public String str="EASY";
    public void run(){
        System.out.println("Running");
    }
    public void eat(){
        System.out.println( str +" eating");
    }

}
/*
* 编译结果:
* EASY eating
* Running
* */

参考文章

https://www.liaoxuefeng.com/wiki/1252599548343744/1260454548196032

https://www.cnblogs.com/xiaoyezideboke/p/10939219.html


文章作者: EASY
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EASY !
 上一篇
Servlet实战项目开发学习 Servlet实战项目开发学习
前言学习Java也有一段时间了,但是一直都没有进行进行过项目实战。为了巩固基础自已学习写了一个简单的登录后台功能,虽然简单但是麻雀虽小五脏俱全,依旧在写的过程中学习到了非常多的东西。以下代码下载地址:https://github.com/E
2020-10-11 EASY
下一篇 
内网渗透Windows下的信息收集总结 内网渗透Windows下的信息收集总结
前言在渗透测试中信息收集的深度与广度以及对关键信息的提取,直接或间接的决定了渗透测试的质量。这里对内网渗透的一些信息收集方法做一些总结,不定时更新~~ 系统信息收集系统信息关注操作系统,系统版本,系统类型(64位还是32位),查看补丁。 s
2020-09-22 EASY
  目录