Re: [問題] static與non static

作者: AmosYang (泛用人型編碼器)   2014-07-05 04:01:44
※ 引述《e002311 (鴻)》之銘言:
: 卻無法過關
資訊不足,何謂「過關」?
: 推 LPH66:static 的只是 out, out 本身參照到了一個物件, println 是 07/04 21:41
: → LPH66:對那個物件作用的 07/04 21:41
: 我看java附的原始碼 System.java
: public final static printStream out = null;
: 看不出這裡有參照到物件阿
你對該單行程式碼的解讀是正確的,但,請繼續往下追, 就能了解來
龍去脈
54 public final class System {
55
56 /* register the natives via the static initializer.
57 *
58 * VM will invoke the initializeSystemClass method to complete
59 * the initialization for this class separated from clinit.
60 * Note that to use properties set by the VM, see the constraints
61 * described in the initializeSystemClass method.
62 */
63 private static native void registerNatives();
64 static {
65 registerNatives();
66 }
1104 private static void initializeSystemClass() {
1105
1106 // VM might invoke JNU_NewStringPlatform() to set those encoding
1107 // sensitive properties (user.home, user.name, boot.class.path, etc.)
1108 // during "props" initialization, in which it may need access, via
1109 // System.getProperty(), to the related system encoding property that
1110 // have been initialized (put into "props") at early stage of the
1111 // initialization. So make sure the "props" is available at the
1112 // very beginning of the initialization and all system properties to
1113 // be put into it directly.
1114 props = new Properties();
1115 initProperties(props); // initialized by the VM
1116
1117 // There are certain system configurations that may be controlled by
1118 // VM options such as the maximum amount of direct memory and
1119 // Integer cache size used to support the object identity semantics
1120 // of autoboxing. Typically, the library will obtain these values
1121 // from the properties set by the VM. If the properties are for
1122 // internal implementation use only, these properties should be
1123 // removed from the system properties.
1124 //
1125 // See java.lang.Integer.IntegerCache and the
1126 // sun.misc.VM.saveAndRemoveProperties method for example.
1127 //
1128 // Save a private copy of the system properties object that
1129 // can only be accessed by the internal implementation. Remove
1130 // certain system properties that are not intended for public access.
1131 sun.misc.VM.saveAndRemoveProperties(props);
1132
1133
1134 lineSeparator = props.getProperty("line.separator");
1135 sun.misc.Version.init();
1136
1137 FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
1138 FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
1139 FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
1140 setIn0(new BufferedInputStream(fdIn));
1141 setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
125 /**
126 * Reassigns the "standard" input stream.
127 *
128 * <p>First, if there is a security manager, its <code>checkPermission</code>
129 * method is called with a <code>RuntimePermission("setIO")</code> permission
130 * to see if it's ok to reassign the "standard" input stream.
131 * <p>
132 *
133 * @param in the new standard input stream.
134 *
135 * @throws SecurityException
136 * if a security manager exists and its
137 * <code>checkPermission</code> method doesn't allow
138 * reassigning of the standard input stream.
139 *
140 * @see SecurityManager#checkPermission
141 * @see java.lang.RuntimePermission
142 *
143 * @since JDK1.1
144 */
145 public static void setIn(InputStream in) {
146 checkIO();
147 setIn0(in);
148 }
252 private static native void setIn0(InputStream in);
↖ MAGIC! XD
: 老師還特地拿這個System.out.println()
: 出來說
: static 呼叫了non-static方法
有至少兩種可能性
1. 你的老師或許不了解 static 的特性
2. 你或許不了解你的老師想表達的意思
* 「從一個 static reference 使用 該 static reference 所指向的 instance
的 non-static member 」
這件事是符合 java lang. spec. 的
* 「在 static context 裡直接使用 non-static member」
有如「除以零」一樣,是無意義的
有興趣可以詳讀關於 static 正式的定義
http://docs.oracle.com/javase/specs/jls/se8/html/index.html
作者: e002311 (鴻)   2014-07-05 15:49:00
感恩
作者: Deltaguita (貝里斯)   2014-07-06 01:23:00
2的機會應該比較大吧! static 算是很基本的觀念...

Links booklink

Contact Us: admin [ a t ] ucptt.com