zoukankan      html  css  js  c++  java
  • 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对象并没有被实例化(分配空间),因而运行时会报空指针错误。

  • 相关阅读:
    微软软件下载
    FTP主动连接与被动连接
    Linux下grep显示前后几行信息
    cacti 安装过程中“ERROR: 您的MySQL TimeZone 数据库未被填充. 请在继续之前填入此数据库.”
    Cacti安装详细步骤
    Linux 踢掉其他终端用户
    迁移设备存储报的错误及解决方式
    sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)
    Nginx日志按日期切割详解(按天切割)
    git pull冲突:commit your changes or stash them before you can merge.
  • 原文地址:https://www.cnblogs.com/renyuanwei/p/11767276.html
Copyright © 2011-2022 走看看