Java學習筆記(04)java
若有不對或不足的地方,請給出建議,謝謝!編程
面向對象的核心:找合適的對象作合適的事情jvm
面向對象的編程思想:儘量的用計算機語言來描述現實生活中的事物函數
面向對象:側重於對象學習
類是對同一類事物(對象)的抽象,對象是實際存在的該類的各類實體this
建立的對象內存分析:spa
建立的對象存在棧區,開闢的內存空間存在於堆區,在堆區保存值code
位置:對象
1.成員變量是在類中方法外。blog
2.局部變量存在方法中
做用域:
1. 成員變量當前類中均可以使用
2.局部變量只能在方法中使用
初始化:
1.成員變量默認有初始值
2.局部變量要想使用必須初始化。
生命週期:
1.成員變量隨着對象的建立而建立,隨着對象的消失而消失
2.局部變量出來方法的調用就消失
2.java中如何來找到對象
1.本身定義好的類,必須知道這個類。
//屬性 : 變量類型 變量名 = 值; String name; int age; String sex;
2.自定義類,經過這個類來建立出對象。
3.類的格式 :
class 類名 {
語法:數據類型 成員變量名
方法:描述對象的公共行爲。
語法: 普通方法:修飾符 返回值類型 方法名() {}
//方法 // 修飾符 返回值類型 方法名(參數列表){} public void cry(){ System.out.println(name+"哭了"); }
構造方法:修飾符 方法名() {} 在構造方法中,方法名和類名相同,無返回值類型
靜態方法:static 修飾符 返回值類型 方法名() {}
1 //靜態方法名的建立:修飾符 static 返回值類型 方法名() {} 2 public static void haha() { 3 Demo de1 = new Demo(); 4 System.out.println(de1.name1 +"代碼改變世界"); //報錯 5 System.out.println(Demo.name2 +"代碼改變世界"); 6 de1.xixi(); 7 } 8 /* 9 一、靜態方法中可直接調用靜態變量,而不能直接調用普通變量;要想調用普通變量,建立對象來調用。 並且在Java中,容許靜態方法中的對象名和主方法中的對象名相同 10 11 二、在普通方法中能夠直接調用靜態變量和普通變量,可是,在主方法不能直接用類名調用方法,而是經過建立對象 12 13 三、靜態方法和普通方法的相互調用,都須要建立對象來完成。並且不能本身調用本身,不然形成死循環 14 */
類名對象名 = new 類名();
Class Demo { Public static void main(String[] args) { Demo demo = new Demo(); System.out.println("HelloWorld"); } }
前提:必須有一個對象
語法:對象.屬性名 = 值;
訪問屬性:對象.屬性名
訪問方法:對象.方法名();
沒有名字的對象,不建議使用
class Person { String name; //名字 int age; // 年齡 } } class Demo3 { public static void main(String[] args) { new Person().name = "小紅"; new Person().age = 10; System.out.println(new Person().name);// null } }
1.咱們通常不會用匿名對象給屬性賦值,沒法獲取屬性值。
2.匿名對象永遠都不多是一個對象。
1.若是一個對象須要調用一個方法一次的時候,就能夠用匿名對象來調用。
2.能夠做爲實際參數在方法中調用。
在java中相似OC中的初始化方法叫構造方法
1.能夠在對象建立時初始化屬性值。
2.初始化方法只能被調用一次。
//公有屬性 String name; int age; //建立構造方法 public Person(String n,int a){ //給屬性賦值 name = n; age = a; }
給對應的對象進行初始化,對象建立時初始化屬性值。
建立構造方法: 修飾符 類名(參數列表){}
1.方法名和類名保持一致
2.構造方法沒有返回值的。
3.構造方法不是由咱們手動調用的,而是在對象被 建立時由java虛擬機調用
4.若是一個類咱們沒有給他定義構造方法,jvm在編 譯的時候會給這個類默認
添加一個無參的構造方法。
5.若是你本身定義構造方法,jvm就不會在建立無參 的構造方法。這個時候須要
本身定義一個無參的構造方法
//創鍵構造方法 Baby(String n,String s,int a){ // 局部變量 :必須初始化 //給屬性賦值 name = n; sex = s; age = a; } //參數的個數不同。 Baby(String n,String s){ name = n; sex = s; } //和第一個對比參數的順序不同 Baby(String s,int a,String n){ name = n; sex = s; age = a; }
在java中定義的方法是能夠重名的,這種重名的方法也叫方法的重載。
1 //創鍵構造方法 2 Baby(String n,String s,int a){ // 局部變量 :必須初始化 3 4 //給屬性賦值 5 name = n; 6 sex = s; 7 age = a; 8 } 9 //參數的個數不同。 10 Baby(String n,String s){ 11 name = n; 12 sex = s; 13 } 14 //和第一個對比參數的順序不同 15 Baby(String s,int a,String n){ 16 name = n; 17 sex = s; 18 age = a; 19 }
1.必須是方法名同樣,才能夠叫方法重載
2.任何方法均可以實現方法的重載,包括構造方法、普通方法、靜態方法
3.必需要保證參數列表的參數的順序或者個數不同
構造方法中是能夠調用普通方法的
在同一個類中,方法的調用直接拿到方法名調用就能夠了,而在不一樣類中調用就會報錯
1 //普通代碼塊 2 { 3 name2 = "正在學習"; 4 } 5 //靜態代碼塊 6 static { 7 name3 = "在慕課網學習"; 8 } 9 //靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量
做用:給對象統一初始化的值
位置:寫在成員變量的位置上
1.java中編譯器編譯一個java源文件的時候,會把成員變量的聲明放在類的最前面。即便你是把它定義在類的最後面,運行的時候系統也會在類的最前面給它進行聲明
**2.在有構造方法的前提下:成員變量的初始化都是在構造方法中執行的。
3.一旦通過java編譯器編譯後,那麼構造代碼塊中的代碼會移到構造函數中執行,並且會先於構造函數的代碼塊執行
4.成員變量的顯示初始化和構造代碼塊,按照當前代碼的順序來執行的,誰在後面就顯示誰。
this : 表明所屬方法 / 局部變量的調用對象,用來訪問這個類的屬性和方法。 和OC 中的self很象
*對象的引用變量(對象名)存在棧區,對象是存在於堆區,成員變量也隨着對象存在堆區中
內存分析:
this關鍵字的做用 :
// this在成員變量中的使用 public Person (String name , int age){ this.name = name; // 若是不適用this,兩個name都是指的時局部變量的name,Java中的就近原則 this.age =age;
this關鍵字的使用注意點:
1.存在與成員變量同名的局部變量時:方法內部會訪問局部變量(不然java採用就近原則)
2.在方法中不存在和成員變量同名的局部變量時:java編譯器在編譯時會默認給變量前面加一個this.
3.經過this實現構造方法中調用構造方法
構造方法中也能夠調用普通(實例)方法
語法: this(參數);
構造方法 / 函數何時調用:建立對象的時候有jvm(Java虛擬機)調用
//直接用方法名來調用方法 調用的是普通方法。,不能將這個方法作爲構造方法。 //Student(name,id,classNum,sex); //錯誤 //這個的原理和上面的同樣,若是沒有this,系統會自動添加this調用的 //this.Student(name,id,classNum,sex); 錯誤的。 //正確的構造方法中調用構造方法 this(name,id,classNum,sex); // 必須是第一個語句 this.age = age;
2.調用構造方法的注意點: