System.in.read();

来源:百度知道 编辑:UC知道 时间:2024/06/26 05:10:35
System.in.read()中in是一个字段即静态常量(JAVA帮助文档中:public static final InputStream in),那么
问题一:in可以使用InputStream中的所有方法么?如果可以就是说静态常量可以引用该类的所有方法。但是我调试的时候静态常量只能引用该类的静态方法。
例如:class A{
public static void test(){
System.out.println("HA HA");
}
}
class B{
public static A printTest;
}

class Run
{

public static void main(String[] args)
{

B.printTest.test();
}
}

把class A中test方法的static去掉或者改为别的就会出错。

问题二:在InputStream中read()方法在JAVA帮助文档中是这样的:abstract int read() 抽象方法不是没有方法体么?那么是如何执行输入功能的?

诚心希望达人能解答我的疑惑。

楼主听我来为你分析一下:
in在System类中的声明方式为“public static final InputStream in”,也就是说in是一个static的field,即in属于System这个类,而不属于某个System类的对象,实际是因为System是用final修饰的,所以你也不可能用new关键字来创建出一个System类的对象。所以,要访问in这个InputStream类型的对象,你只能用System.in这样的方式,而且用System.in这样的方式访问到的就是一个普通的InputStream类型的对象,你可以调用InputStream类里的所有实例方法(没有static修饰的方法),也可以调用InputStream类里的所有类方法(但是用对象来调用类方法是不建议这样子操作的)。你举的例子中main方法中的"B.printTest.test();"一句我们来分析一下,因为B类中的A类型对象printTest用static修饰了,所以访问它(printTest)的时候要用"B.printTest"这样的方式,而这样的方式得到的就是一个普通的A类型的对象,所以它可以访问A类中的所有实例方法和静态方法,当你写的A类中的test方法前面有static修饰时,表示test是一个静态方法,所以要访问这个test方法最好是通过A.test()这样的方式,但是java语言并不强制要求这一点,也就是说你也可以通过任何A类的对象来访问test方法,比如你现在代码中写的"B.printTest.test()"就是这样,因为刚才说了"B.printTest"就是一个A类的对象。所以,你这样写是可以执行的,但是不好。如果你把test方法前的static去掉,那就符合我们说的“实例方法要通过类的具体的一个对象来访问”这一个原则了,所以把test方法前面的static去掉是可以的。这样子我们编译的过程没有错,但是执行的时候就会出错,为什么呢?因为你目前在B类中声明printTest时候没有为它实例化,换句话说这个时候printTest是null,所以当然会出错了,你只要把它实例化一下就可以了,如下:

==============================