黑马程序员技术交流社区

标题: 关于System.out.println()的问题 [打印本页]

作者: 杨建峰    时间: 2012-10-4 21:28
标题: 关于System.out.println()的问题
在学习过程中碰到点问题,望高手们帮忙解答下,问题如下:

System.out.println()语句是用来打印字符到控制台的,

在这个语句中,System是类,out 是类成员,并且还是
PrintStream 的一个实例变量, 而 println() 是 PrintStream
的成员方法,

我的问题是,以我的理解,面向对象中,方法调用要么
类静态成员直接调用,要么,实例化后调用,而实例化
要用到NEW关键字,而我在System 类里面只看到,out
是声明了,但没有NEW,但是系统还是可以用这个方法,
我不知道原因在哪里。


作者: 胡斌    时间: 2012-10-4 21:55
public class lok{
    public static void main(String[] args) {
        A a=new A();
    }
}
class A{
       
        A()
        {
                B b=new B();
                b.print();
        }
        void show()
        {
                System.out.println("这是外部类...........");
        }
        class B{
                public void print()
                {
                        System.out.println("内部类B..........");
                        A.this.show();//A代表A类,this代表当前对象,show为A类方法,调用外部类。希望这个程序对你有用!
                }
        }
}

作者: yangfengxiao    时间: 2012-10-4 22:08
out是System类的静态字段,返回值类型是PrintStream类,而PrintStream类中有一个的方法是Println(),你可以认真学下JavaAPI
作者: 黄小贝    时间: 2012-10-4 22:11
本帖最后由 黄小贝 于 2012-10-4 22:31 编辑

我也没有找到什么好的资料~

System.out.println 的out部分是一个静态的对象,那后面的println也好理解~

public final static PrintStream out = nullPrintStream();

现在的问题就是System 不是一个static 类,却可以不需要new 直接可以用,而且构造器是私有的





我发现我二了~~ 非static类不需要new可以直接得到static属性~

作者: 翁鹏    时间: 2012-10-4 22:18
本帖最后由 翁鹏 于 2012-10-4 22:28 编辑

System类并不是面向对象的,它里面只有静态字段和静态方法,而且不能够被实例化,因为它的无参数构造函数被声明为private,里面都是静态的东西,实例化也没意义。out静态字段是PrintStream的一个引用。  你说的 public final static PrintStream out = null; 而没有 new PrintString();  可以是System类中的本地方法在作怪, 可能要经过JVM初始化为有意义的值。
这个方面超过了我的能力范围啊。
作者: 佘天宇    时间: 2012-10-4 22:32
System类是不能被实例化的,没有提供构造函数。out对应的是打印流对象PrintStream,这打印流当中提供了很多的Print()方法,以重载的形式存在。


作者: 夏天    时间: 2012-10-4 22:40
目测2楼正解。
作者: Whereismymind    时间: 2018-3-13 14:02
楼主这么多年了还在这论坛么,这个问题有答案了么,我也跟你有一样的疑问,发现楼上的都没有理解楼主的问题,楼主应该是问System类里的静态变量OUT未初始化,public final static PrintStream out = null;即out并未指向一个printStream类的实例,却可以通过System.out.println()直接调用println()方法。网上找了一些答案,都是通过例子来说明的,类B是静态类A里的一个静态变量,所以可以通过A.B来调用B里面的方法,但是这些例子里面,A里面的成员变量B都有初始化一个对象,public final static B b=new B();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2