//預設值的設定标準:一定是絕大多數的對象,都具有的屬性值,才能設定為預設值
public String color = "黃色"; //顔色
public double age = 4 ; //年齡
public String name = "大黃"; //名字
構造函數的參數,如何确定?
建立對象,需要的必要屬性值,通過構造函數的參數傳入
局部變量: 1. 通過參數傳入
2. 在方法内定義
局部變量的作用域: 定義該變量所在的{ }
局部變量的生命期:
基本類型,超出局部變量定義的{},就會被辨別為無效,然後等待GC來回收。
引用類型,超出局部變量定義的{},會引用計數-1,如果引用計數為0,就會被GC下次掃描時回收;
成員變量: 定義在方法外面的變量
成員變量的作用域是所在class内的所有方法
生命期:成員變量的生命期與它所在的對象的生命期一緻
成員變量所在的對象,又可能是某個class中的局部變量或成員變量;
全局變量 ??
C語言中的全局變量
由于全局變量的作用域太大,數值一旦被修改,很難查找在哪裡發生的變化------不推薦使用
Static變量:
1. 這塊變量我們稱為:類變量, 它是所有對象共享的記憶體;
2. static變量,不需要類的執行個體,就可以通過類的名字直接調用
3. 作用域:類似于全局變量
4. 生命期:static變量在第一次調用這個變量的時候,配置設定記憶體
一旦配置設定了記憶體後,這塊記憶體可以重新指派,但是這塊記憶體一直不會被GC回收,直到程式結束!-----用于單例的設計
關注變量的兩個重要特征:
1. 作用域
2. 生命期
this --- 對象自身
Dog dog = new Dog("旺财");
程式的運作順序:
1. 系統給屬性賦預設值
2. 使用者在成員變量級,直接賦預設值
public String color = "黃色";
3. 在構造函數中對成員變量進行初始化
static關鍵字:
1. static 變量
2. static 方法
3. 常量
4. static代碼塊
5. 單例-----------設計模式中的一種
常量:永遠不會改變
編譯期常量---------------------------在程式編譯的時候,所有調用常量的位置,都被常量代表的值所替換
最大的好處是節省記憶體
程式運作期常量:一次指派之後,永遠不能改變
常量的命名一定要大寫 ,如名字較長,用下劃線進行間隔 SEX_MALE
Sex.FEMALE = "xxxxx"; //這個語句錯誤,因為常量的值不允許被改變
final關鍵字:
public class Dbinfo {
public final String dbdriver;
final String url;
final String user;
final String password;
public Dbinfo(){
//讀取配置檔案
dbdriver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@USER-20160720AO:1521:orcl";
user = "aa";
password = "aa";
}
}
注意:public final String dbdriver = "oracle.jdbc.driver.OracleDriver";
這裡沒有寫static關鍵字,它的反編譯結果也是常量
這是海子的部落格對static的描述,寫的非常的好:http://www.cnblogs.com/dolphin0520/p/3799052.html
作業:
1. 使用面向對象的思想開發程式有什麼好處?
1、 易維護
采用面向對象思想設計的結構,可讀性高,由于繼承的存在,即使改變需求,那麼維護也隻是在局部子產品,是以維護起來是非常友善和較低成本的。
2、 品質高
在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求并具有較高的品質。
3、 效率高
在軟體開發時,根據設計的需要對現實世界的事物進行抽象,産生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟體開發的效率和品質。
4、 易擴充
由于繼承、封裝、多态的特性,自然設計出高内聚、低耦合的系統結構,使得系統更靈活、更容易擴充,而且成本較低。
5、 減少了代碼備援,代碼複用性強
2. 如何從現實世界抽象出類?
1. 從語言描述中,提取名詞性的概念 (需求分析: 抽取概念模型)
2. 把名詞抽象成相應的class,或class的屬性
3. 提取動詞 -------------------- 把這些動詞,抽象成對象的行為
3. 方法重載的文法是什麼?
方法具有相同的名稱,不同的參數清單(無論是數量不同或類型不同)便産生了重載。
4. 如何實作封裝?
将變量私有化,使用get與set去擷取和改變。并在set與get中設定條件。
5. 構造方法的文法要求是什麼?
沒有傳回值,方法名同類名。
6. 構造函數的作用是什麼?什麼時候需要構造函數?為什麼?
構造函數的作用是對對象已經對象成員變量的初始化。
如果沒有給成員變量初始化,系統會配置設定預設值給這些成員變量; 如引用類型的成員變量的預設值就是null。
//成員變量初始化,使用者給class的屬性設定了預設值
//預設值的設定标準:一定是絕大多數的對象,都具有的屬性值,才能設定為預設值
7. 在變量中java與C的差別
局部變量: 1. 通過參數傳入
2. 在方法内定義
局部變量的作用域: 定義該變量所在的{ }
局部變量的生命期:
基本類型,超出局部變量定義的{},就會被辨別為無效,然後等待GC來回收。
引用類型,超出局部變量定義的{},會引用計數-1,如果引用計數為0,就會被GC下次掃描時回收;
C語言中無對象,隻有基本資料類型與結構體。而java中無指針變量。并且java中無全局變量。
成員變量: 定義在方法外面的變量
成員變量的作用域是所在class内的所有方法
生命期:成員變量的生命期與它所在的對象的生命期一緻
成員變量所在的對象,又可能是某個class中的局部變量或成員變量;
8. 如下代碼段,PAI,PAI2,PAI3在使用上有啥差別?
public final double PAI2 = 3.1415926; 這種方法定義的PAI2是常量嗎?
如果PAI2是常量,那麼PAI的定義中的static關鍵字有啥作用?是否是多餘的?
public class Test {
public static final double PAI = 3.1415926; //編譯期常量
public final double PAI2 = 3.1415926; //編譯期常量 ,如果不指派,就是運作期常量
public static double PAI3 = 3.1415926;
public Test(){
}
}
9. 如下代碼段,PAI、PAI2、PAI3的指派方法是否存在問題?
在構造函數中給static變量指派的含義是什麼?
在構造函數中給final變量指派的含義是什麼?
public class Test {
public static final double PAI;//靜态常量當且僅當聲明的時候指派
public final double PAI2;//當用final作用于類的成員變量時,成員變量(注意是類的成員變量,局部變量隻需要保證在使用之前被初始化指派即可)必須在定義時或者構造器中進行初始化指派,而且final變量一旦被初始化指派之後,就不能再被指派了。
public static double PAI3;
public Test(){
//this.PAI = 3.1415926;
this.PAI2 = 3.1415926;
this.PAI3 = 3.1415926;
}
}
10.如下代碼,那一句存在錯誤?
public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;
public static double PAI3 = 3.1415926;
public double PAI4 = 3.1415926;
public static void test(){ //都不能用this
//this.PAI = 3.14; //靜态變量不能改變值
//this.PAI2 = 3.14; //使用final變量一次指派之後不能更改
this.PAI3 = 3.14;
//this.PAI4 = 3.14; //靜态方法隻能調用靜态變量
}
}
11.如下代碼那一句存在錯誤
public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;;
public static double PAI3 = 3.1415926;;
public double PAI4 = 3.1415926;
public static void test(){
//PAI = 3.14; //被final修飾不能二次指派
//PAI2 = 3.14; //同上
PAI3 = 3.14;
//PAI4 = 3.14; //靜态方法隻能調用靜态變量
}
}