1、抽象類
1.所謂抽象類,只聲明方法的存在而不去實現它的類;
2.抽象類不能被實例化,即不能實現其對象;
3.abstract class 類名{ 類體 }
4.包含一個或多個抽象方法的類必須聲明成抽象類;
5.abstract <方法返回值類型> 方法名(參數列表)app
2、內部類
1.若是在一個類中再定義一個類,就將在類中定義的那個類稱爲內部類;
2.內部類分爲成員內部類,局部內部類以及匿名內部類;
3.成員內部類:
a.能夠在內部類中直接存取其所在類的私有成員變量;
b.外部類不能夠直接訪問內部類成員變量;
c.public class OuterClass{
private class InnerClass{
}
}
d.內部類中能夠隨意使用外部類的成員方法及成員變量,儘管變量修飾爲private。
e.內部類的實例必定要綁定在外部類的實例上,若是在外部類初始人一個內部類對象,那麼內部類對象就會綁定在外部類對象上。
f.若是在外部類和非靜態方法以外實例化內部類對象,須要使用「外部類.內部類」的形式指定該對象的類型;
g.在實例化內部類對象時,不能在new操做符以前使用外部類名稱那種形式實例化內部類對象,而是應該使用外部類的對象來建立內部對象;
h.內部類對象會依賴於外部類對象,除非已經存在一個外部類對象,不然類中不會出現內部類對象;ide
4.使用this關鍵字獲取內部類與外部類的引用
a.若是在外部類中定義的成員變量與內部類的成員變量名稱相同,能夠使用this關鍵字;
b.例如在內部類中使用this.變量,能夠調用內部類的成員變量x;類名.this.變量,指定類的一個引用。學習
1 /*** 2 * @author: liu_y 3 * @Date: 2016年7月24日 4 * @Title:抽象類 、成員內部類、使用this關鍵字獲取內部類與外部類的引用 5 */ 6 /****************** 7 * 抽象類 8 */ 9 abstract class Fruit { 10 public String color; 11 12 // 定義構造方法 13 public Fruit() { 14 color = "green"; 15 } 16 17 // 定義抽象方法 18 public abstract void harvest(); 19 } 20 // 繼承抽象類Fruit 21 class Apple extends Fruit { 22 @Override 23 public void harvest() { 24 System.out.println("蘋果已經收穫!"); 25 } 26 } 27 // 繼承抽象類Fruit 28 class Orange extends Fruit { 29 @Override 30 public void harvest() { 31 System.out.println("橘子已經收穫!"); 32 } 33 } 34 /****************** 35 * 成員內部類學習 36 */ 37 class OuterClass { 38 private String season = "Summer"; 39 40 class InnerClass { 41 InnerClass() { // 內部類構造方法 42 } 43 public void inf() { // 內部類成員方法 44 System.out.println("這是內部類成員方法!"); 45 } 46 47 public int y; 48 } 49 50 InnerClass in = new InnerClass(); // 外部類實例化內部類對象 51 52 public void ouf() { // 在外部類中調用內部類方法 53 in.inf(); 54 System.out.println("外部類中調用內部類方法!"); 55 } 56 57 public InnerClass doit() { 58 // y=5; //外部類不能夠直接訪問內部類成員變量 59 in.y = 7; 60 season = "Autumn"; // 內部類能夠直接訪問其所在類的私有成員變量 61 System.out.println(season); 62 return new InnerClass(); 63 } 64 } 65 66 /*** 67 * 使用this關鍵字獲取內部類與外部類的引用 68 */ 69 class China { 70 private int age = 2016; // 外部類變量 71 // 內部類 72 73 class Beijing { 74 private int age = 1988; // 內部類變量 75 76 public void doit(int age) { 77 age++; 78 System.out.println("這是內部類方法中變量" + age); 79 System.out.println("這是內部類變量" + this.age); 80 System.out.println("這是外部類變量" + China.this.age); 81 } 82 } 83 } 84 85 public class Hello5Abstract { 86 87 public static void main(String[] args) { 88 // TODO Auto-generated method stub 89 /** 90 * 抽象類使用 91 */ 92 System.out.println("抽象類:"); 93 System.out.println("調用 Apple類的harvest()方法的結果:"); 94 Apple apple = new Apple(); 95 apple.harvest(); 96 System.out.println("調用 Orange類的harvest()方法的結果:"); 97 Orange orange = new Orange(); 98 orange.harvest(); 99 100 /**** 101 * 內部類----成員內部類 102 */ 103 System.out.println("\n內部類:"); 104 // 實例化內部類 105 OuterClass out = new OuterClass(); 106 out.ouf(); 107 108 System.out.println("\n調用外部類方法時返回一個內部類實例:"); 109 OuterClass.InnerClass in1 = out.doit(); // 直接new一個內部類實例 110 in1.inf(); 111 112 System.out.println("\n直接new一個內部類實例:"); 113 // OuterClass.InnerClass in2=new OuterClass.InnerClass(); //額不能夠這樣用。。 114 // 應該使用外部類的對象來建立內部對象,內部類對象會依賴於外部類對象 115 OuterClass.InnerClass in2 = out.new InnerClass(); 116 in2.inf(); 117 118 /*** 119 * 使用this關鍵字獲取內部類與外部類的引用 120 */ 121 System.out.println("\n使用this關鍵字獲取內部類與外部類的引用:"); 122 China china = new China(); 123 China.Beijing bj = china.new Beijing(); 124 bj.doit(26); 125 } 126 127 }
輸出結果:ui
1 抽象類: 2 調用 Apple類的harvest()方法的結果: 3 蘋果已經收穫! 4 調用 Orange類的harvest()方法的結果: 5 橘子已經收穫! 6 7 內部類: 8 這是內部類成員方法! 9 外部類中調用內部類方法! 10 11 調用外部類方法時返回一個內部類實例: 12 Autumn 13 這是內部類成員方法! 14 15 直接new一個內部類實例: 16 這是內部類成員方法! 17 18 使用this關鍵字獲取內部類與外部類的引用: 19 這是內部類方法中變量27 20 這是內部類變量1988 21 這是外部類變量2016