No2_5.類的高級特性_Java學習筆記_抽象類和成員內部類

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
相關文章
相關標籤/搜索