課程地址:https://www.imooc.com/learn/124java
powerDesign-uml下載地址:http://www.uml.org.cn/UMLTools/powerDesigner/powerDesignerToolIntroduction.htm框架
定義類的首字母要大寫eclipse
常常把屬性稱爲實例變量測試
默認值是0this
成員變量spa
調用成員變量.net
局部變量只能在內部使用3d
咱們能夠基於一個類建立多個該類的對象,每一個對象都擁有本身的成員,互相獨立。然而在某些時候,咱們更但願該類全部的對象共享同一個成員。此時就是 static 大顯身手的時候了!!code
Java 中被 static 修飾的成員稱爲靜態成員或類成員。它屬於整個類全部,而不是某個對象全部,即被類的全部對象所共享。靜態成員可使用類名直接訪問,也可使用對象名進行訪問。固然,鑑於他做用的特殊性更推薦用類名訪問~~htm
使用 static 能夠修飾變量、方法和代碼塊。
本小節,咱們先認識一下靜態變量。
例如,咱們在類中定義了一個 靜態變量 hobby ,操做代碼以下所示:
要注意哦:靜態成員屬於整個類,當系統第一次使用該類時,就會爲其分配內存空間直到該類被卸載纔會進行資源回收!~~
與靜態變量同樣,咱們也可使用 static 修飾方法,稱爲靜態方法或類方法。其實以前咱們一直寫的 main 方法就是靜態方法。靜態方法的使用如:
須要注意:
一、 靜態方法中能夠直接調用同類中的靜態成員,但不能直接調用非靜態成員。如:
若是但願在靜態方法中調用非靜態變量,能夠經過建立類的對象,而後經過對象來訪問非靜態變量。如:
二、 在普通成員方法中,則能夠直接訪問同類的非靜態變量和靜態變量,以下所示:
三、 靜態方法中不能直接調用非靜態方法,須要經過對象來訪問非靜態方法。如:
public class HelloWorld { // 定義靜態變量score1 static int score1 = 86; // 定義靜態變量score2 static int score2 = 92; // 定義靜態方法sum,計算成績總分,並返回總分 public static int sum() { return score1+score2; } public static void main(String[] args) { // 調用靜態方法sum並接收返回值 int allScore =HelloWorld.sum(); System.out.println("總分:" + allScore); } }
Java 中能夠經過初始化塊進行數據賦值。如:
在類的聲明中,能夠包含多個初始化塊,當建立類的實例時,就會依次執行這些代碼塊。若是使用 static 修飾初始化塊,就稱爲靜態初始化塊。
須要特別注意:靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量。
咱們來看一段代碼:
運行結果:
經過輸出結果,咱們能夠看到,程序運行時靜態初始化塊最早被執行,而後執行普通初始化塊,最後才執行構造方法。因爲靜態初始化塊只在類加載時執行一次,因此當再次建立對象 hello2 時並未執行靜態初始化塊。
設爲私有屬性
發現不能調用
get和set方法
使用
類裏面自動建立get,set方法
調用方法
定義:
內部類( Inner Class )就是定義在另一個類裏面的類。與之對應,包含內部類的類被稱爲外部類。
內部類的主要做用以下:
1. 內部類提供了更好的封裝,能夠把內部類隱藏在外部類以內,不容許同一個包中的其餘類訪問該類
2. 內部類的方法能夠直接訪問外部類的全部數據,包括私有的數據
3. 內部類所實現的功能使用外部類一樣能夠實現,只是有時使用內部類更方便、
分類:
//外部類HelloWorld public class HelloWorld { // 內部類Inner,類Inner在類HelloWorld的內部 public class Inner { // 內部類的方法 public void show() { System.out.println("welcome to imooc!"); } } public static void main(String[] args) { // 建立外部類對象 HelloWorld hello = new HelloWorld(); // 建立內部類對象 Inner i = hello.new Inner(); // 調用內部類對象的方法 i.show(); } }
(1)成員內部類:
內部類中最多見的就是成員內部類,也稱爲普通內部類。咱們來看以下代碼:
從上面的代碼中咱們能夠看到,成員內部類的使用方法:
一、 Inner 類定義在 Outer 類的內部,至關於 Outer 類的一個成員變量的位置,Inner 類可使用任意訪問控制符,如 public 、 protected 、 private 等
二、 Inner 類中定義的 test() 方法能夠直接訪問 Outer 類中的數據,而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性a
三、 定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );
四、 編譯上面的程序後,會發現產生了兩個 .class 文件
其中,第二個是外部類的 .class 文件,第一個是內部類的 .class 文件,即成員內部類的 .class 文件老是這樣:外部類名$內部類名.class
另外,友情提示哦:
一、 外部類是不能直接使用內部類的成員和方法滴
可先建立內部類的對象,而後經過內部類的對象來訪問其成員變量和方法。
二、 若是外部類和內部類具備相同的成員變量或方法,內部類默認訪問本身的成員變量或方法,若是要訪問外部類的成員變量,可使用 this 關鍵字。如:
//外部類HelloWorld public class HelloWorld{ //外部類的私有屬性name private String name = "imooc"; //外部類的成員屬性 int age = 20; //成員內部類Inner public class Inner { String name = "愛慕課"; //內部類中的方法 public void show() { System.out.println("外部類中的name:" + HelloWorld.this.name ); System.out.println("內部類中的name:" + name ); System.out.println("外部類中的age:" + age); } } //測試成員內部類 public static void main(String[] args) { //建立外部類的對象 HelloWorld o = new HelloWorld (); //建立內部類的對象 Inner inn = o.new Inner(); ; //調用內部類對象的show方法 inn.show(); } }
(2)靜態內部類
特色是:
一、 靜態內部類不能直接訪問外部類的非靜態成員,但能夠經過 new 外部類().成員 的方式訪問
二、 若是外部類的靜態成員與內部類的成員名稱相同,可經過「類名.靜態成員」訪問外部類的靜態成員;若是外部類的靜態成員與內部類的成員名稱不相同,則可經過「成員名」直接調用外部類的靜態成員
三、 建立靜態內部類的對象時,不須要外部類的對象,能夠直接建立 內部類 對象名= new 內部類();
//外部類 public class HelloWorld { // 外部類中的靜態變量score private static int score = 84; // 建立靜態內部類 public static class SInner { // 內部類中的變量score int score = 91; public void show() { System.out.println("訪問外部類中的score:" + HelloWorld.score ); System.out.println("訪問內部類中的score:" + score); } } // 測試靜態內部類 public static void main(String[] args) { // 直接建立內部類的對象 SInner si=new SInner(); // 調用show方法 si.show(); } }
(3)方法內部類
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可使用。
必定要注意哦:因爲方法內部類不能在外部類的方法之外的地方使用,所以方法內部類不能使用訪問控制符和 static 修飾符。
//外部類 public class HelloWorld { private String name = "愛慕課"; // 外部類中的show方法 public void show() { // 定義方法內部類 class MInner { int score = 83; public int getScore() { return score + 10; } } // 建立方法內部類的對象 MInner mi= new MInner(); // 調用內部類的方法 int newScore=mi.getScore(); System.out.println("姓名:" + name + "\n加分後的成績:" + newScore); } // 測試方法內部類 public static void main(String[] args) { // 建立外部類的對象 HelloWorld mo=new HelloWorld(); // 調用外部類的方法 mo.show(); } }
‘
’
父類寫好
建立子類,並創建關係
建立測試類
測試調用
先執行父類的構造方法,再執行子類的構造方法
10被20覆蓋了,屬性的初始化是先執行的,而後執行構造方法
(1)final修飾類
子類會報錯
(2)final修飾方法
子類方法不容許覆蓋或重寫
(3)final修飾屬性
子類屬性報錯
final關鍵字修飾屬性,系統不會自動初始化
(4)final修飾變量
不容許修改變量
main裏調用屬性
main調用父類方法
main調用子類方法
父類無參的構造方法
子類的無參構造方法,隱式的顯示
會自動執行父類構造方法
此時不是第一行,構造方法就不能夠了
注意報錯
子類沒有顯示調用父類的構造方法
父類定義一個有參的構造方法
報錯
包名+地址
eclipse自帶根據對象屬性生成自帶toString方法
執行main後生成
即便是兩個對象的屬性值同樣,也是不一樣的地址
相似於==判斷
eclipse提供了生成equals的方法
刪除hash方法
分析
建立工程,默認選項
建立父類
建立子類
建立測試類
引用的多種形態
不能子類引用指向父類
父類寫方法
子類重寫方法
obj1()調用的是父類方法
obj2()調用的是子類方法
建立cat類,繼承animal類
cat裏不重寫建立方法
子類繼承父類的方法
子類獨有地方法
main中不能經過繼承調用子類獨有的方法
練習
子類轉換成父類
父類到子類,不容許
強制轉換
強制轉換存在風險,雖然編譯器不保存,可是運行會報錯
使用:instanceof關鍵字
定義父類爲抽象類
定義子類,早年電話,繼承父類
建立子類,智能電話
建立測試類
extends關鍵字和implements關鍵字是不能調換的
一般在給接口命名的時候前面會加上一個大寫的‘i’字母,用來區分和普通的類名不一樣
聲明接口的時候,省略掉了abstract關鍵字
聲明接口裏的方法時,也省略了abstract關鍵字
一般abstract關鍵字是不寫的
書寫接口
接口的建立
建立psp類,繼承玩遊戲
用接口來描述
接口的使用
內部類使用後,注意分號結束,經過接口調用
經過new和.直接調用
說明:在安卓開發和高級框架開發中,常常會使用匿名內部類的方式來使用接口
、
按住鼠標左鍵進行連線
選擇繼承關係
接口定義好
實現關係是虛線,繼承關係是實線
修改父類返回值
子類自動修改
根據圖像生成java語言
和之前作對比
改寫統一名稱方法,從新生成java
創建父類
建立子類
繼承關係
多態關係
新建抽象類
子類繼承抽象類
效果同樣,可是更合理
分析同窗案例:
右邊更合理,不一樣類型的車用不一樣類
使用繼承關係
使用多態