Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
What is static? CS340100, NTHU Yoshi Static? • 靜態? class Test { static int staticX; int instanceX; public Test(int var1, int var2) { this.staticX = var1; this.instanceX = var2; } } • Instance members belong to the individual objects • Class members belong to the class, shared by all the objects When we creates many objects… • • • • Test obj1 = new Test(1,2); Test obj2 = new Test(3,4); Test obj3 = new Test(5,6); Objects (obj1, obj2, obj3) have their own instanceX – System.out.println(obj1.instanceX); //prints 2 – System.out.println(obj2.instanceX); //prints 4 – System.out.println(obj3.instanceX); //prints 6 Static Variable are Shared • Static variables do not belong to an individual object • In the code above, the value of staticX are modified to 1, 3, 5, sequentially – They were modifying the same one (they?) – Static variables belong to the class – this.staticX = 3 is equivalent to Test.staticX = 3 When will you declare a field as static? • Let’s see an example – You are creating a class for representing the accounts of a bank • Each account has the user name, the saving, and the interest rate – Each user has different name – Each user has different saving – The interest rate are identical, shared by all the accounts Example: Account.java class Account { int money; String name; static double rate = 0.02; //2% public Account(String name, int money) { this.name = name; this.money = money; } } Example2: 數學 class Math { public static final double PI = 3.1415926; } • 我們會使用 Math.PI 來取得這個公定的常數 用在 Method 時呢? • 不需要有instance,即可以使用 • 再看Account的例子 class Account { private int money; private String name; private static double rate = 0.002; //0.2% public Account(String name, int money) { this.name = name; this.money = money; } public static double getRate() { return rate; } } Static method • 不存在任何實體即可使用 – System.out.println( Account.getRate() ); //印出0.002 • 雖然我們也可以產生實體後再以實體的 reference variable來存取 – Account acc1 = new Account(“John”, 1000); – System.out.println( acc1.getRate() ); • 但是這樣的寫法是”不被建議的”,造成誤解, 雖然compile可以過,但Eclipse會警告,要你改 成Account.getRate() So now let’s check Hello World public class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); } } Now you know that why the main method is declared as static? Overriding in Static Method? • No overriding in static method – It is known as hiding – Which is executed is according to the type Discussion • 為什麼我compile常看到compiler說,你不能 在static method存取non-static variables? – Static method本來就存在,實體不存在當然不 能存取 – 即使實體存在,也不知道你想存取”哪一個實體” • 為什麼main要宣告成static? – 一開始總要有個進入點,讓程式開始執行 – 如果不使用static修飾字,則一定要new了之後 產生實體才能使用,那麼就無從開始了 更Advance的問題 • ClassLoader? • 有一個class,名字叫做java.lang.Class (注意 大小寫) – 前者是說”有一個類別” – 後者是說”這個類別名字叫java.lang.Class” • 有一種寫法 – Class klass = Class.forName(“java.lang.String”); – klass.newInstance(); • Why? Memory An instance of class XXX Class XXX { Static fields Static methods } New/instantiate XXX.class An instance of class XXX An instance of class XXX Homework References • http://java.sun.com/j2se/1.4.2/docs/api/java/ lang/Class.html