求助,关于java:System.out.println();问题 5

在jdk1.7和jdk1.8中在终类System中这样定义out域:,明显,out已被定义为final。以下是本人做的实验:1,:先模仿写两个类:并测试证明mhello=... 在jdk1.7和jdk1.8中在终类System中这样定义out域:

,明显,out已被定义为final。
以下是本人做的实验:
1,:先模仿写两个类:

并测试证明mhello=null初始化时的情况:

如上,抛出了NullPointer异常。意料之中。
修改mhello=new Hello();实例化:

并运行:

成功运行。
然后,将方法fun1改为static,

然后可以了

那么问题来了,System类里面的out = null 怎么会能调用PrintStream类的public方法println();呢?

为何,一个空指针怎么会能调用非静态方法
第2-3图是证明:空指针(引用)不能调用类的非静态方法;
第3-4图是证明:实例化后对象可以调用类的非静态方法;
第5-6:图证明:空指针(引用)能调用类的静态方法;
当证明了这些后。查看jdk1.7和jdk1.8文档,发现System类中的out(引用)err(引用),in(引用)都被初始化为空指针。而PrintStream类中的println()方法为非静态方法!(也就对应我的2-3图的情况!)

上面是System类源代码部分.
于是问题在这里:
既然out是空指针,那么我们在写程序时调用System.out.println();为何还能运行?而没有像我的例子中23图那样抛出空指针异常?
展开
 我来答
vankizou
2015-08-06
知道答主
回答量:10
采纳率:0%
帮助的人:5.9万
展开全部
你是将fun1()方法加了static关键字了吧?然后你给T取了个别名叫t,本质和T.fun1()是一致的。
更多追问追答
追问
因为字数限制原因,请看我的问题补充,多谢!
追答
println方法有很多重载的方法。
当不传值时会调用println()空参数方法,这个方法里面作了换行操作,这个方法它是有打印数据的,只不过这个是一个换行符。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式