面向對象是相對面向過程而言的 面向對象和麪向過程都是一種思想 面向過程強調的是功能行爲 面向對象將功能封裝進對象,強調具有了功能的對象 面向對象是基於面向過程的java
面向對象的特徵:數組
java中用類Class來描述事物: 屬性:對應類中的成員變量 行爲:對應類中的成員函數安全
成員變量 成員變量定義在類中,在整個類中均可以被訪問 成員變量隨着對象的創建而創建,存在於對象所在的堆內存中 成員變量有默認初始化值ide
局部變量 局部變量之定義在局部範圍內,如函數內 局部變量存在棧內存中 做用的範圍結束,變量空間會自動釋放 局部變量沒有默認初始化值函數
匿名對象 匿名對象是對象的簡化形式 匿名對象有兩種使用狀況: 當對象方法僅進行一次調用時 匿名對象能夠做爲實際參數進行傳遞this
java -x 輸出java的非標準選項 java -Xss<size> xxx 設置stack大小 如:java -Xss521kspa
java -Xmx 設置堆最大值 java -Xms 設置堆初始值code
java中對象和數組都位於堆內存中,局部變量函數參數等都位於棧內存中對象
封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式blog
封裝原則: 將不須要對外提供的內容都隱藏起來 把屬性都隱藏起來,提供公共方法對其訪問
代碼例子:
package study_java.ex01; public class ClassDemo1 { public static void main(String[] args){ Man man = new Man(); // 不能直接經過man訪問到money,只能經過getMoney方法 System.out.println(man.getMoney()); man.addMoney(100); System.out.println(man.getMoney()); // 對於public的變量咱們能夠直接經過man訪問 System.out.println(man.age); } } class Man{ private int money = 100; public int age = 23; // 經過封裝的方式獲取money public int getMoney(){ return money; } // 經過封裝的方式修改money public void addMoney(int num){ money += num; } }
是一個權限修飾符 用於修飾成員變量和成員函數 被私有化的成員只在本類中有效
經常使用於: 將成員變量私有化,對外提供對應的set,get方法對其進行訪問,提升對數據訪問的安全性
函數名與類名相同 不用定義返回值類型 沒有具體的返回值
做用:給對象進行初始化
package study_java.ex01; public class ConstructDemo1 { public static void main(String[] args){ Dog d = new Dog("aa"); d.watch(); } } class Dog{ private String name; private String color; // 構造函數 public Dog(String n){ name = n; System.out.println("new Dog()"); } public void watch(){ System.out.println("旺旺"); System.out.println(name); } }
構造代碼塊也是類成員,是爲構造函數添加共有的一些內容 而且構造函數先於構造函數執行
對象的建立過程: 當new一個對象的時候
使用static修飾的代碼構造塊,在類加載的時候調用一次,之後再也不調用。 一般放置對靜態成員的初始化過程
static成員,跟對象無關,訪問的方式是經過Class.XXX()
this:表明其所在函數所屬對象的引用,即this表明類對象的引用
用於修飾成員(成員變量和成員函數)
被修飾後的成員具有如下特色: 隨着類的加載而加載 優先於對象存在 被全部的對象所共享 能夠直接被類名調用
使用注意: 靜態方法只能訪問靜態成員 靜態方法不能寫this,super關鍵字 主函數是靜態的
代碼例子以下:
package study_java.ex01; public class StaticDemo1 { public static void main(String[] args){ System.out.println(Benz.brand1); Benz b1 = new Benz(); System.out.println(b1.getBrand()); // 直接訪問靜態方法 System.out.println(Benz.getBrand1()); } } class Benz{ // 靜態成員 private static String brand = "BENZ"; public static String brand1 = "BENZ1"; private String color; public void setColor(String color){ this.color = color; } public String getBrand(){ return brand; } public static String getBrand1(){ return brand; } }
this(): 調用其餘構造函數的方式,並且必須做爲第一條語句
多個類中存在相同的屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼承那個類便可。
多個類能夠稱爲子類,單獨這個類稱爲父類 子類能夠直接訪問父類中國非私有的屬性和方法 經過extends關鍵字讓類與類之間產生繼承 java中只支持單衝繼承 + 多層繼承
簡單的例子:
package study_java.ex01; public class ExtendsDemo1 { public static void main(String[] args){ JingBa jingba = new JingBa(); jingba.name = "大黃"; jingba.watch(); jingba.owner="zz"; } } class Animal{ public String name; public int weight; public void move(){ System.out.println("move....."); } } class Dog extends Animal{ public void watch(){ System.out.println("有人來了"); } } class JingBa extends Dog{ public String owner; }
調用的是父類的構造函數,必須是第一條語句 經過下面例子理解:
package study_java.ex01; public class ExtendsDemo2 { public static void main(String[] args){ // 建立對象 BMWSportCar mychar = new BMWSportCar(); mychar.color = "red"; mychar.velocity = 200; mychar.price = 20000; mychar.run(); } } class Car{ public String color; public void run(){ System.out.println("running....."); } public Car(String color){ this.color = color; System.out.println("new car("+color+")"); } } class SportCar extends Car{ public int velocity; public SportCar(int velocity){ super("yellow"); this.velocity = velocity; System.out.println("new SportCar("+velocity +")"); } } class BMWSportCar extends SportCar{ public int price; public BMWSportCar(){ super(200); System.out.println("new BMWSportCar"); } }
若是被繼承的父類的屬性是私有的,若是想要訪問或者更改,能夠經過定義公有的方法來實現,代碼例子以下:
package study_java.ex01; public class ExtendsDemo2 { public static void main(String[] args){ // 建立對象 BMWSportCar mychar = new BMWSportCar(); mychar.setColor("red"); mychar.velocity = 200; mychar.price = 20000; mychar.run(); System.out.println(mychar.getColor()); } } class Car{ //私有屬性 private String color; public void run(){ System.out.println("running....."); } public Car(){ System.out.println("new car()"); } // 公有方法 public String getColor(){ return color; } public void setColor(String color){ this.color = color; } } class SportCar extends Car{ public int velocity; public SportCar(){ System.out.println("new SportCar()"); } } class BMWSportCar extends SportCar{ public int price; public BMWSportCar(){ System.out.println("new BMWSportCar"); } }
super和this的用法有點類似
super()和this()
調用父類的構造函數,必須是第一條語句
package study_java.ex01; public class ExtendsDemo2 { public static void main(String[] args){ // 建立對象 BMWSportCar mychar = new BMWSportCar(); mychar.setColor("red"); mychar.velocity = 200; mychar.price = 20000; mychar.run(); System.out.println(mychar.getColor()); } } class Car{ //私有屬性 private String color; public void run(){ System.out.println("running....."); } public Car(){ System.out.println("new car()"); } // 公有方法 public String getColor(){ return color; } public void setColor(String color){ this.color = color; } } class SportCar extends Car{ public int velocity; public SportCar(){ System.out.println("new SportCar()"); } public void setColorPro(String color){ // this.color = color; //這裏和下面的的super是同樣的 super.setColor(color); } public void setColor(String color){ super.setColor(color); } } class BMWSportCar extends SportCar{ public int price; public BMWSportCar(){ System.out.println("new BMWSportCar"); } }
任何一個對象的建立都包含整個家族簇的建立,任何一個成員的建立,都包含這一整個順序的完成 經過下面代碼理解這個過程
package study_java.ex01; public class ExtendsDemo3 { public static void main(String[] args){ // 建立對象 BMWSportCar mychar = new BMWSportCar(); mychar.setColor("red"); mychar.velocity = 200; mychar.price = 20000; mychar.run(); System.out.println(mychar.getColor()); } } class Car{ //私有屬性 private String color; { System.out.println("Cons Block in Car"); } public void run(){ System.out.println("running....."); } public Car(){ System.out.println("new car()"); } // 公有方法 public String getColor(){ return color; } public void setColor(String color){ this.color = color; } } class SportCar extends Car{ public int velocity; { System.out.println("Cons Block in SportCar"); } public SportCar(){ System.out.println("new SportCar()"); } public void setColor(String color){ super.setColor(color); } } class BMWSportCar extends SportCar{ public int price; public BMWSportCar(){ System.out.println("new BMWSportCar"); } }
子類中出現與父類中如出一轍的方法時,會出現覆蓋操做,也稱爲重寫或者複寫 父類中的私有方法不能夠被覆蓋 在子類覆蓋方法中,繼續使用被覆蓋的方法能夠經過super函數名獲取
覆蓋時須要注意的問題: 覆蓋時,子類方法權限必定要大於等於父類方法權限 靜態只能覆蓋靜態
主要的應用是: 當子類須要父類的功能,而功能主題子類有本身特有的內容時,能夠複寫父類中的方法,這樣就既沿襲了父類 的功能,又定義了父類特有的內容
代碼例子:
package study_java.ex01; public class OverrideDemo1 { public static void main(String[] args){ Rich2Man s2 = new Rich2Man(); s2.consume(200000); } } class RichMan{ public void consume(int money){ if(money < 500){ System.out.println("消費了"+money+"w"); } else { System.out.println("不能消費了"); } } } class Rich2Man extends RichMan{ public void consume(int money){ if(money < 50000){ System.out.println("消費了"+money+"w"); } else { System.out.println("不能消費了"); } } }
子類中全部的構造函數morning都會訪問父類中空參數的構造函數 由於每個構造函數的第一行都有一條默認的語句super() 子類會具有父類中的數據,因此要先明確父類是如何對這些數據初始化的。 當父類中沒有空參數的構造函數時,子類的構造函數必須經過this或者super語句指定要訪問的構造函數
final 能夠修飾類,方法和變量
final 修飾的類不能夠被繼承
final 修飾的方法不能夠被覆蓋(能夠繼承)
final 修飾的變量是一個常量只能被賦值一次
內部類只能訪問被final修飾的局部變量
package study_java.ex01; public class FinalDemo1 { public static void main(String[] args){ Jing8 j = new Jing8(); j.watch(); System.out.println(j.name); } } class Dog1{ // 常量 public final String name = "aaa"; // final 修飾的方法不能重寫 public /*final */ void watch(){ System.out.println("來人了"); } } class Jing8 extends Dog1{ public void watch() { System.out.println("聽一聽"); super.watch(); } }
關於內部類 定義在class內部的類 編譯產生OuterClass$Innerc.class 內部類訪問外部類的局部變量,須要final修飾
代碼例子:
package study_java.ex01; public class InnerClassDemo { public static void main(String[] args){ Car2 c = new Car2(); c.run(); } } class Car2{ public String color = "red"; public int tires; public void run(){ new Engine().fire(); System.out.println("running....."); } class Engine{ public void fire(){ System.out.println("fire"); } } }
可是若是內部類寫在了方法裏,這裏有一個問題須要注意:
public class InnerClassDemo { public static void main(String[] args){ Car2 c = new Car2(); c.run(); } } class Car2{ public String color = "red"; public int tires; public void run(){ // 這裏的key必須是final 字段 final String key = "ss"; class Engine{ public void fire(){ System.out.println("插入鑰匙"+key); System.out.println("fire"); } } new Engine().fire(); System.out.println("running....."); } }
抽象類的定義: 抽象就是從多個事物中將共性的,本質的內容抽取出來 java 中能夠定義沒有方法體的方法,該方法的具體實現交給子類完成該 方法稱爲抽象方法,包含抽象方法的類就是抽象類
抽象類和抽象方法必須用abstract關鍵字修飾 抽象方法只有方法聲明,沒有具體的方法體,定義在抽象類中 抽象類不能夠被實例化,也就是不能用new建立對象 抽象類經過其子類實例化,而子類須要覆蓋掉抽象類中全部的方法後才能夠建立對象,不然該子類也是抽象類