接口定義
關於Java的接口定義方式,以下三種情況下可以采用接口定義方式:
1. 接口中聲明的變量全部為final 和static類型的,並且這個接口的作用在於定義一些值不能改變的變量。
舉個例子:
public interface ObjectConstants{
public static final String SPACE = new String(" ");
public static final char FORMFEED = '\f';
}
2. 接口中只定義可供實現的抽象方法
EventListener.Java
public interface EventListener {
public void handleEvent(Event evt);
}
Runnable.Java
package Java.lang;
public interface Runnable {
public abstract void run();
}
3. 還有一種方式是上述兩種方式的組合,如非必要一般會將這樣一個接口定義拆分成兩個接口定義
抽象類的定義
1. 如果一個類包含一個接口但是不完全實現接口定義的方法,那麼該類必須定義成abstract型
例如InputStream.Java類的定義方式:
package Java.io;
public abstract class InputStream implements Closeable {
// SKIP_BUFFER_SIZE is used to determine the size of skipBuffer
private static final int SKIP_BUFFER_SIZE = 2048;
// skipBuffer is initialized in skip(long), if needed.
private static byte[] skipBuffer;
public abstract int read() throws IOException;
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
public int read(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 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
if (b != null) {
b[off + i] = (byte)c;
}
}
} catch (IOException ee) {
}
return i;
}
public long skip(long n) throws IOException {
long remaining = n;
int nr;
if (skipBuffer == null)
skipBuffer = new byte[SKIP_BUFFER_SIZE];
byte[] localSkipBuffer = skipBuffer;
if (n <= 0) {
return 0;
}
while (remaining > 0) {
nr = read(localSkipBuffer, 0,
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;
}
public int available() throws IOException {
return 0;
}
public void close() throws IOException {}
public synchronized void mark(int readlimit) {}
public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
}
public boolean markSupported() {
return false;
}
}
2. 抽象類的方法體中只定義抽象的方法,例如AbstractMethodError.Java
package Java.lang;
public class AbstractMethodError extends IncompatibleClassChangeError {
public AbstractMethodError() {
super();}
public AbstractMethodError(String s) {
super(s); }
}