开发者学堂课程【Java 面试疑难点串讲1:面试技巧及语言基础:向下转型】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/24/detail/526
向下转型
内容介绍
一、转型
一、转型
对于转型首先必须要明确以下的观点:
●向上转型:可以达到参数的统一,而对于向上转型最顶端的就是 Object ,也就是说有了 Object 可以操作所有的对象,当然,这个地方是有一个前提:利用反射机制来进行处理。
●向下转型:需要使用子类特定的操作形式完成,但是从实际的开发来讲,向下转型这一概念并不是我们所推荐使用的,我们推荐使用的只有向上转型。
不推荐使用的原因是因为其存在有安全隐患。
核心本质:需要强制性处理。就有可能造成类型不匹配问题;
假设餐馆里要求宠物不能进入,而小明一定要将小狗带进餐厅。而他强行把狗打扮成人,这就存在一个隐患,狗并不是人。所以按照这样的逻辑。强制这个概念一定不是我们现在的开发之中所提到的过程。
范例:正确的向下转型
package com. yootk . demo;,
public class ClassDemoA {v
public static void main(String[] args) {v
//
第一部分:设置统- -对象。
String str = "Hello" ;
. //
这是一个类对象。
0bjectobj=str;//
向上转型。.
//
第二部分:取出内容。
String temp = (String) obj ; //
向下转型。
System. out . print1n( temp);.
接下来让我们看看这个隐患可能会有什么危害。我们先来编写一个简单的程序
我们先创建一个 demo ,再将一下代码键入程序之中
我们可以发现
前提:必须先发生向上转型之后才可以进行向下转型的操作处理。本处使用的是安全的处理操作不安全呢?
范例:不安全的转型
package com. yootk . demo;
public class ClassDemoA {
public static void main(String[] args) {
//
第一部分:设置统-一对象。
String str = "Hello" ;
//
这是一个类对象。
0bjectobj=str;//
向上转型
//
第二部分:取出内容。
Integer temp = (Integer) obj ;
//
向下转型。
System. out. println(temp);
}
}
Exception in thread "main"
java. lang. ClassCastException: java. lang. String cannot
java. lang . Integer
at com. yootk. demo . ClassDemoA. main
(ClassDemoA. java:9)
这个时候的代码并不会在程序编译的时候出现任何的语法错误,但是程序--旦执行就一定会出现 ClassCatException.
在学习 JSP 的时候有一个最为重要的概念:
MVC设计模式,在这个设计模式之中,有一个实现前提:必须使用 request
属性范围将控制层的数据对象交由显示层完成,那么在request.setAttribute(String name,Object value) ,需要接收的是一个 Object 类型,这就表示所有类的对象都可以通过 request 属性传递,而对于接收到此属性的 JSP 页面呢?
如果要想进行具体的操作,按照正常的思维来讲,必须使用强制性向.下转型。
如果你处理不好,那么就会产生 ClassCastException 异常
而在 JSP 之中为了解决这样的问题,所以引用 JSTL 与 EL 操作以帮助用户回避掉此类问题。
而 EL 和 JTL 的核心本质就在于利用 Object 类型并且基于反射机制实现属性调用.
范例:向上转型的统一性
package com. yootk . demo;
import java. lang. reflect. Method;
class Student {
private String name;.
public Student(String name) {
this. name = name;
} // setter
略.
public String getName() {
Return name;
}
public class ClassDemoB {
public static void main(String[] args) throws Exception {
Object obj = new Student( "MLDN"); //
向上转型
//
此时有了Object, 那么就表示一-切都有了。
Class cls = obj. getClass();
Method met = cls. getMethod( "getName") ;
System. out . println( met. invoke(obj));
}
}
以上的操作在大部分的情况下实际上都需要容器或者是开发者给用户一些好的支持。
例如: JSTI,EL 等都需要这样的支持处理操作。
所有的开发框架都需要分析原理:类的反射机制一定是头等重要的内容。