首页 > 试题广场 >

有关下述Java代码描述正确的选项是____。

[单选题]
有关下述Java代码描述正确的选项是____。
public class TestClass {
   private static void testMethod(){
        System.out.println("testMethod");
   }
   public static void main(String[] args) {
        ((TestClass)null).testMethod();
   }
}
  • 编译不通过
  • 编译通过,运行异常,报NullPointerException
  • 编译通过,运行异常,报IllegalArgumentException
  • 编译通过,运行异常,报NoSuchMethodException
  • 编译通过,运行异常,报Exception
  • 运行正常,输出testMethod
我来总结下大家的分析。
1)此处是类对方法的调用,不是对象对方法的调用。
2)方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。
null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。
3)非静态的方法用"对象.方法"的方式,必须依赖对象被创建后才能使用,若将testMethod()方法前的static去掉,则会报 空指针异常 。此处也验证了2)的观点
当然,不管是否静态方法,都是已经存在的,只是访问方式不同。
编辑于 2016-04-20 15:17:15 回复(21)
一、null是代表不确定的对象
Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
比如:int a = null;是错误的。Ojbect o = null是正确的。
Java中,变量的适用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。
有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如:
Connection conn = null;
try {
conn = DriverManager.getConnection("url", "user", "password");
} catch (SQLException e) {
e.printStackTrace();
}
String catalog = conn.getCatalog();
如果刚开始的时候不指定conn = null,则最后一句就会报错。
二、null本身不是对象,也不是Objcet的实例
null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
可以做一个简单的例子:
//null是对象吗? 属于Object类型吗?
if (null instanceof java.lang.Object) {
System.out.println("null属于java.lang.Object类型");
} else {
System.out.println("null不属于java.lang.Object类型");
}
结果会输出:null不属于java.lang.Object类型
三、Java默认给变量赋值
在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。
这个具体可以通过调试来看。
四、容器类型与null
List:允许重复元素,可以加入任意多个null。
Set:不允许重复元素,最多可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。
五、null的其他作用
1、判断一个引用类型数据是否null。 用==来判断。
2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。

编辑于 2019-01-15 22:13:24 回复(10)
答案F:运行正常,输出testMethod
结论:虽然我们能用对象来调用静态方法,但是对于java来说,即使我们用对象去调用,java自己也会在将源文件编译成class文件时将其转化为用类名去调用静态方法。由于空指针异常是运行时异常,所以eclipse编译检查也不会报错,而实际运行的是class文件,java已经将class文件里的调用修改为类名去调用了,所以也就不会在运行时出现空指针异常。
解析和验证过程如下图所示:
发表于 2017-10-12 00:58:55 回复(8)
首先,我们要知道,静态的方法也是可以通过对象.来访问的,这一点很奇怪,但是确实是可以。
其次,null可以被强制类型转换成任意类型的对象,于是通过它来执行静态方法,就可以理解了。
发表于 2015-09-06 17:38:30 回复(14)
  1. 方法是static静态方法,直接使用"类.方法"就行了,因为静态方法在对象创建前就存在了,他的使用不依赖对象是否被创建.

  2. 非静态的方法用"对象.方法"的方式,因为他在对象创建前不存在,必须依赖对象的创建后,才能使用

发表于 2015-08-27 12:31:39 回复(6)
testMethod方法用static修饰的,是存在方法区中的,所以可以调用,如果把static去掉,就会报空指针异常
发表于 2015-08-25 09:25:20 回复(10)
事实上t指向一个null,也是可以调用testMethod()方法正常输出
发表于 2016-12-03 18:57:36 回复(2)
(TestClass)null==TestClass
发表于 2015-09-06 22:55:33 回复(2)
静态方法都是通过类来调用的,当我们用类的实例来调用时,最后实际上还是转换成类来调用的,所以这里与null无关
发表于 2015-10-01 13:10:08 回复(1)
平常空指针异常调用我认为是这样的,非静态方法调用时,方法的参数会传入this指针,编译器会这样执行void func(int a)。 此处this为该对象引用,把this.func(a)转为func(this, a),因此在内部调用对象的成员时通过this指针,如果没有初始化时,自然会报异常。 然而,静态方法通过的类名调用,并不会传入this指针,也不会用到this指针,因此不会产生异常。
发表于 2016-10-14 10:21:11 回复(0)
使用static 修饰的方法属于这个类本身,使用static 修饰的方法既可以使用类作为调用者来调用,也可以使用对象作为调用。但值得指出的是,因为使用static 修饰的方法还是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,这是由于底层依然是使用这些实例所属的类作为调用者。再就是null可以被强制类型转换成任意类型的对象。
发表于 2016-01-23 15:53:23 回复(0)
null可以被强转为任意类型
发表于 2015-10-27 21:26:10 回复(0)
null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。
发表于 2019-10-18 09:38:58 回复(0)
null可以被强制类型转换成任意类型的对象,通过这样的方式可以执行对象的静态方法, 但是如果方法不是静态方法的话,由于null对象并没有被实例化(分配空间),因而运行时会报空指针异常
发表于 2019-07-25 23:40:01 回复(0)
1)此处是类对方法的调用,不是对象对方法的调用。 2)方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。 null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。 3)非静态的方法用"对象.方法"的方式,必须依赖对象被创建后才能使用,若将testMethod()方法前的static去掉,则会报 空指针异常 。此处也验证了2)的观点 当然,不管是否静态方法,都是已经存在的,只是访问方式不同。
发表于 2019-01-24 12:47:39 回复(0)
长见识了。。。。。。以为会选A的,太天真了
发表于 2017-10-05 01:51:42 回复(1)
null可以被转换为引用型,不能转换为基本类型。
发表于 2017-08-25 13:05:39 回复(0)

null 既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将 null 转化成任何类型

发表于 2017-05-23 22:42:54 回复(0)
null可以被强制类型转换成任何类型。
静态方法可以直接调用静态方法。
如果testMethod()方法中static去掉,就不能直接调用。
发表于 2016-04-06 16:04:51 回复(0)
testMethod方法用static修饰的,所以可以调用,如果把static去掉,就会报空指针异常。
发表于 2015-10-23 12:43:24 回复(0)