求助,关于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图那样抛出空指针异常? 展开
,明显,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图那样抛出空指针异常? 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询