上接:http://blog.csdn.net/larrylgq/article/details/7432832
本文由larrylgq編寫,轉載請註明出處:http://blog.csdn.net/larrylgq/article/details/7563994
作者:呂桂強
現在大多數面向對象的語言都是採用模板的方式實現,以Ruby爲例:
class MyClass
def y_method
@v = 1
end
obj = MyClass.new
obj.class
=>MyClass
實例變量:實例變量存在與對象之中
靜態語言和動態語言不同
在java等靜態語言中對象的實例變量是確定的eg:
/**
* @author 呂桂強
* @email [email protected]
* @version 創建時間:2012-5-14 上午10:42:47
*/
public class MyClass {
public int i;
public static void main(String[] args) {
MyClass obj = new MyClass();
System.out.println(obj.getClass());
Field[] fileds = obj.getClass().getFields();
for (Field f : fileds) {
System.out.println(f);
}
// => class MyClass
// => public int MyClass.i
}
}
即使上面的例子中我們沒有使用到變量i,但是在對象中也存在這個實例變量,且對象obj中實例變量不可隨意增刪
在ruby等動態語言中:eg:
puts obj.instance_variables
=>[]
obj.my_method
puts obj.instance_variables
=>[:@v]
當我們沒有調用my_method方法時obj對象沒有任何實例變量,在運行時調用my_method方法後obj對象多了v這個實例變量
方法:無論是靜態語言還是動態語言,在創建的obj對象中都沒有真正保存該對象可執行的方法,這些方法是保存在MyClass類中,而obj對象中只保存實例變量和到自身類的引用(tips:我們可以把類看成一個特殊的實現Class的對象)
這些方法被成爲“對象的方法”而不是“類的方法”,即我們只能用obj(MyClass的實例)來訪問它們
如果要訪問類的方法,需要特殊處理(eg:java中需要定義static方法)
所有的類都是Class類的一個對象(包括Object),而Class類又繼承自Object優點繞吧呵呵