首页 > 试题广场 >

阅读如下代码。请问,对语句行 test.hello(). 描

[单选题]

阅读如下代码。 请问,对语句行 test.hello(). 描述正确的有()

package NowCoder;
class Test {
	public static void hello() {
	    System.out.println("hello");
	}
}
public class MyApplication {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test test=null;
		test.hello();
	}
}

  • 能编译通过,并正确运行
  • 因为使用了未初始化的变量,所以不能编译通过
  • 以错误的方式访问了静态方法
  • 能编译通过,但因变量为null,不能正常运行
推荐
答案是A吧
这题我认为答案错了
因为Test类的hello方法是静态的,所以是属于类的,当实例化该类的时候,静态会被优先加载而且只加载一次,所以不受实例化new Test();影响,只要是使用到了Test类,都会加载静态hello方法!
另外,在其他类的静态方法中也是可以调用公开的静态方法,此题hello方法是使用public修饰的所以在MyApplication中调用hello也是可以的。
总结:即使Test test=null;这里也会加载静态方法,所以test数据中包含Test类的初始化数据。(静态的,构造的,成员属性)
        因此test.hello是会调用到hello方法的。
附上运行图:
编辑于 2017-03-19 11:40:05 回复(27)
静态方法的使用不依靠对象,只看类型,在编译时就确定了
发表于 2018-09-02 08:59:42 回复(34)
看下class反编译后结果就都清楚了。
源码:


class反编译后

编辑于 2018-07-25 19:37:47 回复(10)
很简单,静态方法属于静态绑定,编译器根据引用类型所属的静态类型为它绑定其对应的方法。此语句会翻译成invokestatic,该指令的调用中不会涉及this,所以不会依赖对象! 还有引用类型=null,其实就是指该引用在堆中没有对应的对象,但是编译的时候还是能根据声明找到其所属的静态类型。
发表于 2017-07-13 18:20:41 回复(3)

A

类方法不依附与对象。所以可以正常运行

发表于 2017-04-03 16:28:27 回复(3)
这道题考察的时static关键字修饰方法的用法
被static修饰的方法叫做静态方法  如题中hello就是一个静态方法
静态方法的访问有两种:
1.直接使用“类名.”调用   Test.hello(); (一般都用第一种方法,让人一下就明白这是静态方法)
2.new 一个对象 ,“引用.” 的方式调用  
使用这种方法,其实底层会转化为 "类名."调用的方式
本题中就用了第二种方法,虽然Test test = null
但是test.hello();------>Test.hello();
所以正常编译运行
编辑于 2020-11-10 20:19:27 回复(8)

可能有同学已经发现了,不过这题真的让我又学到了一点。以前认为,类的静态属性/方法只能通过【类名.方法名】/【类名.属性名】来访问,只能说我先入为主了。。我们类的静态成员不依赖实例对象,静态成员在类编译的时候就已经被创建好了,经测试后发现,无论是是使用类名,还是使用我们定义的类变量都是可以访问的,哪怕它已经被实例化

class Test {
  public static int x = 5;
  public static void sayHello()
  {
    System.out.println("hello Word");
  }
}
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test test=new Test();
        test.sayHello();
        Test.sayHello();
        System.out.println(test.x);
        System.out.println(Test.x);
    }
}

编辑于 2018-04-06 22:33:29 回复(3)
A就相当于Test.hello()
值得一说的是有些人以为是空指针,这里你们所说的空指针必须是去引用堆对象才会有空指针
而这个hello是static类型的,人家static的方法本身就没有指针,所以当然不会有空指针
发表于 2017-04-14 08:32:58 回复(0)
静态方法不依赖与对象生存,所以对象为null时仍然是可以调用的。
发表于 2021-12-20 20:57:40 回复(0)
从代码规范来说,c也对吧。纠结很久,然后选了c
发表于 2018-04-24 07:11:06 回复(2)
主要是没看到hello那个方法是static修饰的
发表于 2017-10-17 12:54:30 回复(0)
一个class里面有两个public类,是不能编译通过的,所以我觉得这一题应该没有正确答案;
如果不考虑双public的情况,应该是选A才对。
发表于 2017-01-20 21:42:11 回复(6)
D
发表于 2016-12-14 18:06:52 回复(0)
静态方法不依附于对象,直接调用静态方法
发表于 2019-05-21 15:13:59 回复(0)
null可以转型为任何对象,因而可以正常调用静态方法
发表于 2018-09-27 09:08:37 回复(0)
答案:A
警告:
//Test test=null;
//test.hello();
//改为: Test .hello(); 

发表于 2018-03-22 15:38:18 回复(2)
要理解这个题。最好办法就是反编译class文件。 很清楚现实直接使用Test调用类方法
发表于 2017-09-01 20:05:17 回复(0)
虽然test对象是null,但是这里调用类方法,实际上在用Test.hello,即使test为null也无关,因为不会去找到这个test判断它的值再去调用类方法
发表于 2017-03-30 23:42:44 回复(0)
有毒吧明明之前有题是可以的
发表于 2017-01-04 17:16:10 回复(0)

首先static静态方法或者说类方法不依赖于对象,因此哪怕没有创造出对象代码依旧可以进行。
在定义类时,只是通知编译器需要准备多大的内存空间,并没有为它分配内存空间。只有用类创建了对象(new)后,才会真正占用内存空间。
类在声明时会被加载,static语句/成员变量/构造函数也会因此声明执行。
发表于 2018-03-12 13:35:40 回复(0)

hello()方法是属于Test类的静态方法,在Test类实例化的时候,不关乎有没有实例化对象,都可以对Test类的静态方法进行调用

发表于 2018-02-27 15:44:04 回复(0)