一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 整理java讀書筆記十五之java中的內部類

整理java讀書筆記十五之java中的內部類

2020-03-06 19:53mrr JAVA教程

內部類是指在一個外部類的內部再定義一個類。類名不需要和文件夾相同。本文給大家分享java讀書筆記十五之java中的內部類,對java讀書筆記相關知識感興趣的朋友一起學習吧

內部類是指在一個外部類的內部再定義一個類。類名不需要和文件夾相同。
*內部類可以是靜態static的,也可用public,default,protected和private修飾。(而外部頂級類即類名和文件名相同的只能使用public和default)。

前言

 Java從JDK1.1的時候,就開始引入內部類的概念了,那么小編也通過這篇博客來分享一下Java中有關內部類的一些特性。

 什么是內部類?

 在很多情況下,類被定義成一個獨立的程序單元,但是有時候也會把一個類放在另一個類的內部定義,這個定義在其他類內部的類就稱為內部類。

從語法上來看的話,定義內部類和定義外部類的語法大致相同,內部類除了需要定義在其他類里面之外,還存在如下兩點區別。

 1.內部類比外部類多使用三個修飾符:private——protected、static——外部類不可以使用這三個修飾符。

 2.非靜態內部類不能擁有靜態成員。

 除了以上兩點之外,其他的地方都與普通的類相同,下面來列舉一下常見的內部類操作。

  非靜態內部類

  定義內部類也非常簡單,只要把一個類放在另一個類內部定義即可,甚至都可以放置在方法的內部。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class Cow
{
  private double weight;
  // 外部類的兩個重載的構造器
  public Cow(){}
  public Cow(double weight)
  {
    this.weight = weight;
  }
  // 定義一個非靜態內部類
  private class CowLeg
  {
    // 非靜態內部類的兩個實例變量
    private double length;
    private String color;
    // 非靜態內部類的兩個重載的構造器
    public CowLeg(){}
    public CowLeg(double length , String color)
    {
      this.length = length;
      this.color = color;
    }
    // 下面省略length、color的setter和getter方法
    public void setLength(double length)
    {
      this.length = length;
    }
    public double getLength()
    {
      return this.length;
    }
    public void setColor(String color)
    {
      this.color = color;
    }
    public String getColor()
    {
      return this.color;
    }
    // 非靜態內部類的實例方法
    public void info()
    {
      System.out.println("當前牛腿顏色是:"
        + color + ", 高:" + length);
      // 直接訪問外部類的private修飾的成員變量
      System.out.println("本牛腿所在奶牛重:" + weight);  //①
    }
  }
  public void test()
  {
    CowLeg cl = new CowLeg(1.12 , "黑白相間");
    cl.info();
  }
  public static void main(String[] args)
  {
    Cow cow = new Cow(378.9);
    cow.test();
  }
}
</span>

 在上述中非靜態內部類的成員可以訪問外部類的private成員,但反過來就不成立了。非靜態內部類的成員只在非靜態內部類范圍內是可知的,并不能被外部類直接使用。如果外部類需要訪問非靜態內部類的成員,則必須顯式創建非靜態內部類對象來調用訪問其實例成員。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class Outer
{
  private int outProp = 9;
  class Inner
  {
    private int inProp = 5;
    public void acessOuterProp()
    {
      // 非靜態內部類可以直接訪問外部類的private成員變量
      System.out.println("外部類的outProp值:"
        + outProp);
    }
  }
  public void accessInnerProp()
  {
    // 外部類不能直接訪問非靜態內部類的實例變量,
    // 下面代碼出現編譯錯誤
    // System.out.println("內部類的inProp值:" + inProp);
    // 如需訪問內部類的實例變量,必須顯式創建內部類對象
    System.out.println("內部類的inProp值:"
      + new Inner().inProp);
  }
  public static void main(String[] args)
  {
    // 執行下面代碼,只創建了外部類對象,還未創建內部類對象
    Outer out = new Outer();   //①
    out.accessInnerProp();
  }
}
</span>

 注意:非靜態內部類中不能有靜態方法、靜態成員變量、靜態初始化塊。

 靜態內部類

 如果使用static來修飾一個內部類,則這個內部類就屬于外部類本身,而不屬于外部類的某個對象,因此使用static修飾的內部類被稱為類內部類,有的地方也稱為靜態內部類。靜態內部類可以包含靜態成員,也可以包含非靜態成員。根據靜態成員不能訪問非靜態成員的規則,靜態內部類不能訪問外部類的實例成員,只能訪問外部類的類成員。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class StaticInnerClassTest
{
  private int prop1 = 5;
  private static int prop2 = 9;
  static class StaticInnerClass
  {
    // 靜態內部類里可以包含靜態成員
    private static int age;
    public void accessOuterProp()
    {
      // 下面代碼出現錯誤:
      // 靜態內部類無法訪問外部類的實例變量
      System.out.println(prop1);
      // 下面代碼正常
      System.out.println(prop2);
    }
  }
}
</span>

 匿名內部類

 使用匿名內部類可以創建那種只需要一次使用的類,并且創建匿名內部類時會立即創建一個該類的實例,但是也需要注意一下規則

 1.匿名內部類不能是抽象類,因為系統在創建匿名內部類時,會立即創建匿名內部類的對象,因此不允許將匿名內部類定義成為抽象類

 2.匿名內部類不能定義構造器,由于匿名內部類沒有類名,所以無法定義構造器 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
interface Product
{
  public double getPrice();
  public String getName();
}
public class AnonymousTest
{
  public void test(Product p)
  {
    System.out.println("購買了一個" + p.getName()
      + ",花掉了" + p.getPrice());
  }
  public static void main(String[] args)
  {
    AnonymousTest ta = new AnonymousTest();
    // 調用test()方法時,需要傳入一個Product參數,
    // 此處傳入其匿名實現類的實例
    ta.test(new Product()
    {
      public double getPrice()
      {
        return 567.8;
      }
      public String getName()
      {
        return "AGP顯卡";
      }
    });
  }
}
</span>

下面給大家總結以下內部類的共性編輯

(1)、內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號 。
(2)、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變量,無論是否是private的 。
(3)、內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量 。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 火影忍者小南裸羞羞漫画 | chinese456老年gay china外卖员gay帮口 | 国产美女亚洲精品久久久综合91 | 久久久久久久99精品免费观看 | 国产精品13p | 40岁女人三级全黄 | 国产欧美一区二区精品性色 | 久久中文字幕无线观看 | 欧美伊人久久久久久久久影院 | 亚洲国产欧美另类va在线观看 | 国产精品国语自产拍在线观看 | 国产人妖ts在线视频网 | 男gay男gay男gay野外 | 日韩视频免费 | 日韩影院在线观看 | www.日日操| 免费看男女污污完整版 | 九色PORNY真实丨国产免费 | 欧美日韩国产最新一区二区 | 99av涩导航 | 大叔在线观看 | 午夜综合网 | 99热99在线| a级在线看 | 天堂va亚洲va欧美va国产 | 91亚洲精品丁香在线观看 | 91看片淫黄大片欧美看国产片 | 成人精品福利 | 四虎4hu永久免费国产精品 | 亚洲精品国产成人 | 国产欧美日韩在线播放 | 精品国产美女福利在线 | 免看一级一片一在线看 | 国内精品久久久久久野外 | 亚洲国产欧美日韩在线一区 | 久久AV国产麻豆HD真实乱 | 亚洲天天做夜夜做天天欢 | 国产精品2 | 国产绿帽 | 含羞草传媒网站免费进入欢迎 | 色婷婷久久综合中文久久一本` |