为什么不能覆盖静态方法?
如果可能,请举例说明.
staticJava中的成员(static字段或static方法)与其各自的类相关联,而不是与此类的对象相关联.以下代码尝试访问null引用上的静态字段.
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然main.getNull()返回null,但它可以工作和显示value = 10.这段代码是如何工作的?
我相信你们都知道我的意思 - 代码如下:
Thread thread = new Thread();
int activeCount = thread.activeCount();
Run Code Online (Sandbox Code Playgroud)
引发编译器警告.为什么不是错误?
编辑:
要明确:问题与Threads无关.我意识到在讨论这个问题时经常给出Thread示例,因为它们可能真的搞砸了它们.但问题确实是这样的使用总是无稽之谈,你不能(胜任地)写出这样的电话并且意味着它.这种类型的方法调用的任何例子都是barmy.这是另一个:
String hello = "hello";
String number123AsString = hello.valueOf(123);
Run Code Online (Sandbox Code Playgroud)
这使得它看起来好像每个String实例都带有"String valueOf(int i)"方法.
我指着一些技巧并遇到了这个.在以下代码中:
public class TestClass1 {
static int a = 10;
public static void main(String ar[]){
TestClass1 t1 = null ;
System.out.println(t1.a); // At this line
}
}
Run Code Online (Sandbox Code Playgroud)
t1对象是null.为什么这段代码不抛NullPointerException?
我知道这不是访问static变量的正确方法,但问题是关于NullPointerException.
任何人都可以解释为什么以下程序的输出被" 调用 "
public class Test4{
public static void method(){
System.out.println("Called");
}
public static void main(String[] args){
Test4 t4 = null;
t4.method();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用类引用调用静态方法,但在这里我使用null引用调用.请澄清我的疑问
以下简单的代码片段工作正常,并使用null对象访问静态字段.
final class TestNull
{
public static int field=100;
public TestNull temp()
{
return(null);
}
}
public class Main
{
public static void main(String[] args)
{
System.out.println(new TestNull().temp().field);
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,System.out.println(new TestNull().temp().field);静态字段字段与NULL对象关联的语句new TestNull().temp()仍然返回正确的值100,而不是在Java中抛出空指针异常!为什么?
我遇到了以下代码:
public class TradingSystem {
private static String category = "electronic trading system";
public static void main(String[] args) {
TradingSystem system = null;
System.out.println(system.category);
}
Run Code Online (Sandbox Code Playgroud)
输出:电子交易系统
我很惊讶没有找到NullPointerException!
Q1.它为什么不抛出NullPointerException?
Q2.或者在编译时,由于类别的声明已经static使它替换系统(即对象引用),TradingSystem并且因此基本上TradingSystem.category被称为?
可能重复:
如何在空引用上调用(静态)方法不会抛出NullPointerException?
Java中空引用的静态字段
我尝试了这个旧视频的代码:
class Impossible {
public static void main(String[] args) {
Thread t = null;
System.out.println(t.currentThread().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
输出: main
嗯,那到底是什么?!有没有java.lang.Thread违反任何NullPointerException规则?
但是我最感兴趣的是:如何使该变量表现为抛出NullPointerException?
我在互联网上找到了这个代码,并希望有人向我解释...
public class Foo {
static int fubar = 42;
public static void main(String[] args) {
System.out.println(((Foo) null).fubar);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码编译并正常工作,输出结果42.
怎么可能fubar从一个null没有抛出变量的情况下访问变量NullPointerException?
在下面的代码中,我们获得i了null引用的值,尽管a NPE不存在.
public class Test {
static int i = 10;
Test getTest() {
return null;
}
public static void main(String args[]) {
Test t = new Test();
System.out.println(t.getTest());
System.out.println(t.getTest().i);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
null
10
Run Code Online (Sandbox Code Playgroud) 我有以下代码.
public static void main(String args[])
{
System s = null;
s.out.println("Hello");
}
Run Code Online (Sandbox Code Playgroud)
虽然s为null,但我不明白为什么输出是Hello.谁能帮我理解这个?
我偶然发现了一些非常奇怪的代码,我很惊讶不会导致错误
public class WeirdCode {
public static int fooField = 42;
public WeirdCode getFoo(){
return null;
}
public static void main(String args[]) {
WeirdCode foo = new WeirdCode();
System.out.println(foo.getFoo().fooField);
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,它打印出42!谁能解释一下?
最近我正在浏览javarevisited页面并找到一段代码,要求读者确定它的输出是什么......
虽然我得到了输出,但我对结果不满意(因为我不知道如何从空引用访问静态成员).背景中发生了什么?
public class StaticDEMO {
private static String GREET = "Hello";
public static void main(String[] args) {
StaticDEMO demo = null;
System.out.println(demo.GREET);
// TODO code application logic here
}
}
Run Code Online (Sandbox Code Playgroud)