JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)

今天很好奇,对null进行强转会不会抛错。做了如下测试得到的结果是,

如果把null强转给对象,是不会抛异常的,本身对象是可以为null的。

但是如果是基本类型,比如 int i = (Integer)obj的强转,其实内部会调用intvalue方法去赋值给基本类型,所以这时候是会报错的。

代码如下

Object obj = null;
Integer s1 = (Integer)obj;

上面能正常执行,即把null赋值给一个对象或者强行类型转换赋值给对象都是没有问题的。如果s1是 int的基本类型呢?
代码如下,编译时不会报错

int s1 = (Integer)obj;
System.out.println(s1);

执行,则报java.lang.NullPointerException错误。
我们反编译后会发现调用了 intValue方法去获取value,所以抛出空指针错误:
Object obj = null;
int s1 = ((Integer)obj).intValue();
System.out.println(s1);
---------------------

public class NULL {

private static final String TAG = "NULL";
private void abc(){
System.out.println("123");
}

public static void main(String[] args) {
((NULL)null).abc();
}
}

以上代码运行时会报错:
Exception in thread "main" java.lang.NullPointerException
at com.test.NULL.main(NULL.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

若将方法abc加上静态修饰符static

public class NULL {
private static final String TAG = "NULL";
private static void abc(){
System.out.println("123");
}

public static void main(String[] args) {
((NULL)null).abc();
}
}

程序正常运行,输出

123
1
null可以被强制类型转换成任意类型的对象,通过这样的方式可以执行对象的静态方法,但如果方法不是静态方法的话,由于null对象并没有被实例化(分配空间),因而运行时会报空指针错误。

原文地址:https://www.cnblogs.com/renyuanwei/p/11767276.html

时间: 2024-10-12 18:29:00

JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)的相关文章

Java中如何使用非强制类型转换把字符串转换成int类型

①强制类型转换代码如下: String string = "123456"; int a,b = 0; @Test public void String2Int1() { //方法1 try { a = Integer.parseInt(string); } catch (Exception e) { e.printStackTrace(); } //方法2 try { b = Integer.valueOf(string).intValue(); } catch (Exception

JAVA中int、String的类型转换

int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i);这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? String -> int s="12345";int i;第一种方法:i=Integer.parseInt(s);第二种方法:i=Integer.valueOf(s).intValue();这两种方法有什么区别

带你玩转JavaScript中的隐式强制类型转换

正题开始前我想先抛出一个问题,==和===有什么区别?可能一般人会想,不就是后者除了比较值相等之外还会比较类型是否相等嘛,有什么好问的,谁不知道?!但是这样说还不够准确,两者的真正区别其实是==在比较的时候允许做强制类型转换,而===不允许.好了终于引出了今天的重点,我们平时肯定遇到过强制类型转换的时候,死活想不通为什么要这样转换(为什么这两个相等)的情况.那么下面我就以==为例,来说明一下其中强制类型转换的规则. 前提知识 JavaScript中的6大类型:undefined.null.boo

C++中static_cast和dynamic_cast强制类型转换

在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast. 一.static_cast关键字(编译时类型检查) 用法:static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性,它主要有如下几种用法: (1)用于基本数据类型之间的转换,如把int转换为char,把int转换成enum,但这种转换的安全性需要开发者自己保证(这可以理解为保证

C#中,三种强制类型转换的对比

在C#中,我们可以看到三种强制类型转换,比如强制转换成有符号32位整型,可以找到下面三种方式: ① (int)()                ②Convert.ToInt32()         ③int.Parse() 三种转变在有些数据时可以通用,但是用法上仍然有很大的区别 (int)表示使用显式强制转换,是一种类型转换.当我们从 int 类型到 long.float.double 或decimal 类型,可以使用隐式转换,但是当我们从 long 类型到 int  类型转换就需要使用显式

Java中的多个&amp;&amp;(与)连用作为判断条件时的执行问题

在Java中,&&只要第一个条件不满足,后面条件就不再判断. 比如以下代码: public class Test { public static void main(String[] args){ int x=0; int y=0; int k=0; for (int z=0;z<5;z++){ if((++x>2)&&(++y>2)&&(k++>2)){ ++x; ++y; k++; } } System.out.println(x

Java中是使用增强for的null问题

在使用List和Map等集合时,我们经常会使用增强for来进行遍历.但是这里面会存在一些问题.比如当你进行数据库查询是,得到的返回结果是List集合时,如果没有查询到符合要求的数据时List集合时null,并不是有对象而size为0的集合,这个时候就要对返回的结果进行空指针判断,不为null的时候才能遍历,否则回报空指针异常. List<String> list = null; for (String str : list) {//会报空指针异常 System.out.println(str)

java中yyyy-MM-dd HH:mm:ss类型转换成long类型

顺便总结一下今天遇到的坑: 1.html中的content是保留字不能用作id名 2.controller与jsp页面传输数据的时候,一定要注意变量以及变量类型的一致性. 3.一定要恶补js和jquery知识,没文化真可怕... 版权声明:本文为博主原创文章,转载请注明本博客地址!look to the master,follow the master,walk with the master,see through the master, become the master.

Java中常见的几种类型转换

1 public class ChangeClass 2 { 3 public static void main(String[] args){ 4 5 //Int型数字转换成字符串 6 int num1=123456; 7 //方法1 8 String str1=num1+""; 9 System.out.println(str1); 10 //方法2 11 String str2=String.valueOf(num1); 12 System.out.println(str2);