现在的位置: 首页 > 综合 > 正文

java System类

2014年02月15日 ⁄ 综合 ⁄ 共 2398字 ⁄ 字号 评论关闭

public final class System{...}

问题:

1、native是怎么用的?

比如在java的System类中,有这样一个函数:

private static native void registerNatives();

现在知道,native方法是在我的java程序外面用其它语言(比如C、C++、汇编等实现的!应该自己试试看!)

2、static块是怎么回事?

比如在java的System类中有这样一个块:

static {

    registerNatives();

}

3、至于迷惑很久的System.in是什么?

解答:

在java的System中,in成员是这样定义的:

public final static InputStream in = null;

那么,InputStream是怎么回事?

在java中,InputStream是如下这样定义的:
public abstract class InputStream implement Closeable{...}

在implements Closeable中,仅仅只有一个close方法,并且也是其它接口的!

 数据成员有:

private static final int MAX_SKIP_BUFFER_SIZE = 2048;

成员方法有:

public abstract int read();

public int read(byt b[]) throws IOException{ return read(b, 0, b.length()); }

public int read(byte b[], int off, int len) throws IOException {...}

public long skip (long n) throws IOException {
long remaining = n;
if (n< 0) return 0;
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
byte[] skipBuffer = new byte[size];
while (remaining > 0) {
nr = read(skipBuffer, 0, (int)Math.min(sie, remaining));
if (nr < 0) break;
remaining -= nr;
}
return n - remianing;
}

这个skip方法是干嘛的?

public int available() throws IOException { return 0; }

这个available方法是干嘛的?

public void close() throws IOException{}

public synchronized void mark(int readlimit);

public sychronized void reset() throws IOException() { throws new IOException("mark/reset not supported");}

上面的mark和reset方法是干嘛的?关键字synchronized是怎么用的?

public boolean markSupported() { return false; }

这个方法markSupported是干嘛的?

到此为止,InputStream有一点熟悉了,先继续看!~

4、System.out是怎么回事?

解答:

在java的System类中,out成员的定义如下:

public final static PrintStream out = null;

那么,PrintStream是怎么回事?

在java中,PrintStream如下定义:

public class PrintStream extends FileterOutputStream

implements Appendable, Closeable{}

 

public class FilterOutputStream extends OutputStream{}

 

public class OutputStream implements Closeable, Flushable{}

 

关于OutputStream的实现如下:

public abstract class OutputStream implements Closeable, Flushable {

    public abstract void write(int b) throws IOException;

    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }

    public void write(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if ((off < 0) || (off > b.length) || (len < 0) ||
                   ((off + len) > b.length) || ((off + len) < 0)) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }
        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }

    public void flush() throws IOException {
    }

     public void close() throws IOException {
    }

}

在void write(byte b[], int off, int len)方法中,有这样一条语句:

write(b[off+i]);

这条语句不就是调用方法write(int b)吗?但是这个方法显然是abstract的啊,怎么可以调用呢?

难道说:

在一个类中,某个方法可以调用该类的另一个abstract方法,以实现某种功能?不可能啊,abstract方法连方法体都没有!?

上面的InputStream有同样的疑问!

 

今天就到这里吧~!

抱歉!评论已关闭.