System.in返回的是InputStream指向命令行输入的字节流,它的read方法以字节流的方式来读取命令行的输入的数据。
也就是说,输入的字符,以字节流的方式从命令行传递给变量a,因此此时a是一个整数(字节流以整数的方式来表示)。
实际上这个整数是ascii码中对应十进制数(具体可查看ascii码对照表)。
比如输入a,因为a在ascii码中对应的十进制数是97,所以输出的就是97
楼主听我来为你分析一下:
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,所以当然会出错了,你只要把它实例化一下就可以了,如下:
================================
class
A
{
public
void
test()
{
System.out.println("HA
HA");
}
}
class
B
{
public
static
A
printTest
=
new
A();
}
class
Run
{
public
static
void
main(String[]
args)
{
B.printTest.test();
}
}
================================
第二个问题:
InputStream类中的read方法是abstract的,但是我们通过System.in得到的不是一个直接的InputStream对象,InputStream类本身为abstract的,你也不可能创建出这个类的一个对象来,实际上,我们通过System.in得到的是某一个InputStream的子类的对象,这就是java中多态的概念,即父类的变量可以引用子类的对象。查看一下java的源文件就可以知道这个in是通过native
code得到的,所以你不用过分关心它到底是什么类型的,只要知道它就是一个InputStream类的子类的对象,我们可以通过它使用所有InputStream类的方法就可以了。
输出来的是ASC||码.
理论上说不应该阿!
因为输入的System.in.read()属于标准输入,是一个没有被加工包装的InputStream的面向字节的
而标准输出System.out.print()已经被包装成了printStream对象,适应国际化的面向字符的需求。