向下转型 | 学习笔记

简介: 快速学习向下转型。

开发者学堂课程【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);.

接下来让我们看看这个隐患可能会有什么危害。我们先来编写一个简单的程序

4.png

我们先创建一个 demo ,再将一下代码键入程序之中

5.png1.png

我们可以发现

前提:必须先发生向上转型之后才可以进行向下转型的操作处理。本处使用的是安全的处理操作不安全呢?

范例:不安全的转型

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 等都需要这样的支持处理操作。

所有的开发框架都需要分析原理:类的反射机制一定是头等重要的内容。

相关文章
|
28天前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
41 0
|
4月前
|
安全 Java 编译器
Java | 浅谈多态中的向上转型与向下转型
Java | 浅谈多态中的向上转型与向下转型
98 0
|
5月前
|
编译器
【多态-动态绑定-向上转型-抽象类】
【多态-动态绑定-向上转型-抽象类】
27 0
|
5月前
|
Java 编译器
【类和对象之构造方法】
【类和对象之构造方法】
34 0
|
7月前
|
安全 Java 编译器
C++的向上转型
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: int a = 10.9; printf("%d\n", a); 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: float b = 10; printf("%f\n", b); 输出结果为 10.000000,编译器会自动添
42 0
|
8月前
|
Java
Java面向对象中(super关键字)的详解
Java面向对象中(super关键字)的详解
33 0
|
10月前
|
安全
对象的向上转型/向下转型笔记
对象的向上转型/向下转型笔记
|
11月前
对象向上转型
对象向上转型
46 0
|
Java
Java面向对象基础3——构造方法及this关键字
Java面向对象基础3——构造方法及this关键字
117 0
Java面向对象基础3——构造方法及this关键字
|
存储 设计模式 安全
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)

热门文章

最新文章