SlideShare a Scribd company logo
Inner Classes
Agenda
•   概述
•   创建一个内部类
•   内部类 - 如何与外部类关联?
•   .this & .new
•   内部类与访问权限
•   局部内部类
•   匿名内部类
•   嵌套类
•   为什么使用内部类?
•   内部类 - 继承
•   内部类 - 覆盖
概述
• 所谓内部类(Inner Class)是指一个类的定义包含
  在另一个类的里面. 内部类用于将某个类的相
  关逻辑全部组织在一起, 形成一个单元; 合理地
  使用内部类对提供代码的可读性有一定的好处;
• 需要注意内部类与组合(Composition)的区别:内
  部类是将当前类的某一部分进行抽象, 而组合
  则是引用其他类的对象;
• 内部类分为static内部类和非static内部类, 除非
  显式声明, 均指非static内部类.
创建一个内部类
• 将类的声明放在另一个类里面, 就创建了一个
   内部类, 比如:
class Outer {
   ...
   class Inner {...} // Inner是一个内部类
}
• 内部类编译之后的.class文件命名, 以上面的为
   例, 会生成文件Outer$Inner.class;
• 示例: demo/Demo1.java
内部类
                      如何与外部类关联?
• 在初始化一个内部对象之前必须确保相应的外部对象已经初始
  化, 否则会出现编译错误, 示例:
   class Outer {
      class Inner {}
   }
   Outer.Inner inner = new Outer.Inner(); // 编译错误
• 内部对象(Inner object)具有指向当前外部对象(Outer object)的引
  用, 并且可以直接访问外部对象的成员(包括属性和方法), 示例:
   class Outer {
      private int i;
      public void f() ...
      class Inner {
        void ifunc() {
                  System.out.println(i);   // 访问外部对象的属性
                  f();                     // 访问外部对象的方法
        }
      }
• 示例: demo/Demo2.java
.this & .new
• 如果你需要得到外部对象的引用, 那么使用外部类名称加上.this
  即可; 示例:
   class Outer {
      class Inner {
         Outer outer() {
                    return Outer.this; // 返回外部对象
         }
      ......
• 使用.new语法创建外部对象的一个内部类对象, 示例:
public class Outer{
  public class Inner {}
  public static void main(String[] args) {
          Outer outer = new Outer();
         // 创建一个内部对象并且关联在一起
          Outer.Inner inner= outer.new Inner();
  }
内部类与访问权限
• 普通类只有public和包访问权, 内部类则还可
  以被声明为private或者protected; 当声明为
  private时只有当前类可以访问, 声明为
  protected时, 当前类/同一个包下面的类/子
  类均可以访问.
局部内部类
                                 local inner class
• 出于某种设计的考虑, 你不希望内部类是可见的或者只需要返回
  某个接口的匿名实现; java允许在方法或者任意代码块内创建内
  部类, 同时还提供了匿名内部类机制;
• 局部内部类同样可以访问外部类的成员和方法;
• 方法内部类(method inner class)
示例:
public class Parcel5 {
  public Destination destination(String s) {
        class PDestination implements Destination {
                   private String label;
                   private PDestination(String whereTo) {
                               label = whereTo;
                   }
                   public String readLabel() { return label; }
        }
    return new PDestination(s);
}
局部内部类
              代码块内部类
• 代码块内部类(scope inner class), 是指将内部类的定
   义嵌套在某段代码块里面, 比如在if语句里面; 示例:
class Outer {
   void f() {
       boolean isOk = false;
       ...
       if(isOk) {
               class Inner {...} // 代码块内部类
       }......
• 关于嵌套在方法/代码块里的内部类 : 使用较少, 并
   且通常代码可读性较差, 不推荐使用.
匿名内部类
                 Anonymous inner class
• 匿名内部类是一个经常会被使用到的特性,
  尤其在使用java swing编程中; 匿名内部类实
  现了指定的接口或者抽象类, 并返回一个该
  类对象的引用;
interface IA {void f();}
class A {
    IA getInterfaceA() {
          return new IA() {
                  // 这里创建了一个内部类, 该类实现了接口IA, 之后返回了一个该内部类的一个对象

                  void f() {...};
           };     // 这里的分号是必须的
   } ...
• 示例: demo/Demo3.java
嵌套类
• 嵌套类(nested class), 又称静态内部类(static
  inner class); 嵌套类同样定义在另一个类的内部,
  但是它和外部类没有任何关联; 这意味着:
1), 创建一个嵌套类对象, 不需要有相关联的外部
  对象被创建;
2),嵌套类对象没有与之相关联的外部对象可以访
  问;
• 内部类不能有static成员, 也不能在内部类内部
  定义嵌套类; 而嵌套类则没有这些限制,
• 示例: demo/Demo4.java
为什么使用内部类?
• 为什么需要使用内部类?
1, 内部类提供了一种访问外部对象的途径;
2, 内部类提供了另一种方式用来实现继承多个非接口
   类.
• 示例:
abstract class A {...}
class B {...}
class C extends B {
   class Inner extends A {...} // C相当于同时继承了A和B
}
内部类继承
• 由于内部类对象在初始化时必须确保外部对象已经初始化, 在继
    承一个内部类时有以下不同点:
1), 不能使用默认构造器;
2), 必须传入一个外部对象, 并且在构造方法体中使用
    enclosingClass.super()进行初始化;
• 示例:
class Outer {
    class Inner {...}
}
class InnerInherit extends Outer.Inner {
    InnerInherit (Outer outer){
          outer.super(); ...
    }
}
内部类
          覆盖
• 内部类能否像方法一样被覆盖? 答案是可以
  在子类中声明同名的内部类, 但是不会发生
  覆盖行为.
• 示例: demo/Demo5.java
END

More Related Content

What's hot

5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
Justin Lin
 
Python面向对象开发基础篇
Python面向对象开发基础篇Python面向对象开发基础篇
Python面向对象开发基础篇modou li
 
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
ted-xu
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
Justin Lin
 
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿
Justin Lin
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件
Justin Lin
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13ArBing Xie
 
[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3ArBing Xie
 
[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5ArBing Xie
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
 
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
 
深入模組化
深入模組化深入模組化
深入模組化
Justin Lin
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]ReflectionArBing Xie
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
Justin Lin
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
 

What's hot (20)

5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
Python面向对象开发基础篇
Python面向对象开发基础篇Python面向对象开发基础篇
Python面向对象开发基础篇
 
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
 
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
 
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13
 
[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
 
[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
 
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
 
深入模組化
深入模組化深入模組化
深入模組化
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
 
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
 

Viewers also liked

final report complete
final report completefinal report complete
final report completeSRIJAN ROY
 
New Skills In English
New Skills In English New Skills In English
New Skills In English
Hala Nur
 
Region and place presentation
Region and place presentationRegion and place presentation
Region and place presentation
Beth Hitchen
 
советы логопеда первоклассникам
советы логопеда первоклассникамсоветы логопеда первоклассникам
советы логопеда первоклассникам
Titenko1
 
Presentation on simple os
Presentation on simple osPresentation on simple os
Presentation on simple os
Bijay Rai
 
Что нужно первокласснику
Что нужно первоклассникуЧто нужно первокласснику
Что нужно первокласснику
Titenko1
 
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about SmilesМаленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
Freekidstories
 
Práctica de los valores
Práctica de los valoresPráctica de los valores
Práctica de los valores
emilyguizela
 
гра склади ритм
гра склади ритмгра склади ритм
гра склади ритм
nataliyu roschina
 
The future of HealthCare is digital
The future of HealthCare is digitalThe future of HealthCare is digital
The future of HealthCare is digital
Alexander Vanwynsberghe
 

Viewers also liked (10)

final report complete
final report completefinal report complete
final report complete
 
New Skills In English
New Skills In English New Skills In English
New Skills In English
 
Region and place presentation
Region and place presentationRegion and place presentation
Region and place presentation
 
советы логопеда первоклассникам
советы логопеда первоклассникамсоветы логопеда первоклассникам
советы логопеда первоклассникам
 
Presentation on simple os
Presentation on simple osPresentation on simple os
Presentation on simple os
 
Что нужно первокласснику
Что нужно первоклассникуЧто нужно первокласснику
Что нужно первокласснику
 
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about SmilesМаленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
Маленький Детские Книги: Улыбнитесь - A Little Children's Book about Smiles
 
Práctica de los valores
Práctica de los valoresPráctica de los valores
Práctica de los valores
 
гра склади ритм
гра склади ритмгра склади ритм
гра склади ритм
 
The future of HealthCare is digital
The future of HealthCare is digitalThe future of HealthCare is digital
The future of HealthCare is digital
 

Similar to 10, inner classes

7, reusing classes
7, reusing classes7, reusing classes
7, reusing classes
ted-xu
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
 
6, access control
6, access control6, access control
6, access control
ted-xu
 
GDSC FCU 第2堂 Kotlin
GDSC FCU 第2堂 KotlinGDSC FCU 第2堂 Kotlin
GDSC FCU 第2堂 Kotlin
FCUGDSC
 
[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1ArBing Xie
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
Collection
CollectionCollection
Collection
Medivh2011
 
Java基础方面
Java基础方面Java基础方面
Java基础方面yiditushe
 
Io 1
Io 1Io 1
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
jane2006
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
CH17:反射與類別載入器
CH17:反射與類別載入器CH17:反射與類別載入器
CH17:反射與類別載入器
Justin Lin
 
9, interfaces
9, interfaces9, interfaces
9, interfaces
ted-xu
 
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDEJava SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
 
Jdk5
Jdk5Jdk5
Java物件導向
Java物件導向Java物件導向
Java物件導向
艾鍗科技
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
 

Similar to 10, inner classes (18)

7, reusing classes
7, reusing classes7, reusing classes
7, reusing classes
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
 
6, access control
6, access control6, access control
6, access control
 
GDSC FCU 第2堂 Kotlin
GDSC FCU 第2堂 KotlinGDSC FCU 第2堂 Kotlin
GDSC FCU 第2堂 Kotlin
 
[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Collection
CollectionCollection
Collection
 
Java基础方面
Java基础方面Java基础方面
Java基础方面
 
Io 1
Io 1Io 1
Io 1
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
 
CH17:反射與類別載入器
CH17:反射與類別載入器CH17:反射與類別載入器
CH17:反射與類別載入器
 
9, interfaces
9, interfaces9, interfaces
9, interfaces
 
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDEJava SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
 
Jdk5
Jdk5Jdk5
Jdk5
 
Java物件導向
Java物件導向Java物件導向
Java物件導向
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
SCJP ch09
SCJP ch09SCJP ch09
SCJP ch09
 

More from ted-xu

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
ted-xu
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
ted-xu
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
ted-xu
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rman
ted-xu
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
ted-xu
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle security
ted-xu
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storage
ted-xu
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
ted-xu
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
ted-xu
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
ted-xu
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
ted-xu
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
ted-xu
 
7, business event system
7, business event system7, business event system
7, business event system
ted-xu
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneous
ted-xu
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activityted-xu
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & apited-xu
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebsted-xu
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflowted-xu
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow introted-xu
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & api
ted-xu
 

More from ted-xu (20)

11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
 
8, OCP - backup with rman
8, OCP - backup with rman8, OCP - backup with rman
8, OCP - backup with rman
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle security
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storage
 
4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 
7, business event system
7, business event system7, business event system
7, business event system
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneous
 
5, workflow function activity
5, workflow function activity5, workflow function activity
5, workflow function activity
 
4, workflow tables & api
4, workflow tables & api4, workflow tables & api
4, workflow tables & api
 
3, workflow in ebs
3, workflow in ebs3, workflow in ebs
3, workflow in ebs
 
2, a simple workflow
2, a simple workflow2, a simple workflow
2, a simple workflow
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow intro
 
8, bes tables & api
8, bes tables & api8, bes tables & api
8, bes tables & api
 

10, inner classes

  • 2. Agenda • 概述 • 创建一个内部类 • 内部类 - 如何与外部类关联? • .this & .new • 内部类与访问权限 • 局部内部类 • 匿名内部类 • 嵌套类 • 为什么使用内部类? • 内部类 - 继承 • 内部类 - 覆盖
  • 3. 概述 • 所谓内部类(Inner Class)是指一个类的定义包含 在另一个类的里面. 内部类用于将某个类的相 关逻辑全部组织在一起, 形成一个单元; 合理地 使用内部类对提供代码的可读性有一定的好处; • 需要注意内部类与组合(Composition)的区别:内 部类是将当前类的某一部分进行抽象, 而组合 则是引用其他类的对象; • 内部类分为static内部类和非static内部类, 除非 显式声明, 均指非static内部类.
  • 4. 创建一个内部类 • 将类的声明放在另一个类里面, 就创建了一个 内部类, 比如: class Outer { ... class Inner {...} // Inner是一个内部类 } • 内部类编译之后的.class文件命名, 以上面的为 例, 会生成文件Outer$Inner.class; • 示例: demo/Demo1.java
  • 5. 内部类 如何与外部类关联? • 在初始化一个内部对象之前必须确保相应的外部对象已经初始 化, 否则会出现编译错误, 示例: class Outer { class Inner {} } Outer.Inner inner = new Outer.Inner(); // 编译错误 • 内部对象(Inner object)具有指向当前外部对象(Outer object)的引 用, 并且可以直接访问外部对象的成员(包括属性和方法), 示例: class Outer { private int i; public void f() ... class Inner { void ifunc() { System.out.println(i); // 访问外部对象的属性 f(); // 访问外部对象的方法 } } • 示例: demo/Demo2.java
  • 6. .this & .new • 如果你需要得到外部对象的引用, 那么使用外部类名称加上.this 即可; 示例: class Outer { class Inner { Outer outer() { return Outer.this; // 返回外部对象 } ...... • 使用.new语法创建外部对象的一个内部类对象, 示例: public class Outer{ public class Inner {} public static void main(String[] args) { Outer outer = new Outer(); // 创建一个内部对象并且关联在一起 Outer.Inner inner= outer.new Inner(); }
  • 7. 内部类与访问权限 • 普通类只有public和包访问权, 内部类则还可 以被声明为private或者protected; 当声明为 private时只有当前类可以访问, 声明为 protected时, 当前类/同一个包下面的类/子 类均可以访问.
  • 8. 局部内部类 local inner class • 出于某种设计的考虑, 你不希望内部类是可见的或者只需要返回 某个接口的匿名实现; java允许在方法或者任意代码块内创建内 部类, 同时还提供了匿名内部类机制; • 局部内部类同样可以访问外部类的成员和方法; • 方法内部类(method inner class) 示例: public class Parcel5 { public Destination destination(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); }
  • 9. 局部内部类 代码块内部类 • 代码块内部类(scope inner class), 是指将内部类的定 义嵌套在某段代码块里面, 比如在if语句里面; 示例: class Outer { void f() { boolean isOk = false; ... if(isOk) { class Inner {...} // 代码块内部类 }...... • 关于嵌套在方法/代码块里的内部类 : 使用较少, 并 且通常代码可读性较差, 不推荐使用.
  • 10. 匿名内部类 Anonymous inner class • 匿名内部类是一个经常会被使用到的特性, 尤其在使用java swing编程中; 匿名内部类实 现了指定的接口或者抽象类, 并返回一个该 类对象的引用; interface IA {void f();} class A { IA getInterfaceA() { return new IA() { // 这里创建了一个内部类, 该类实现了接口IA, 之后返回了一个该内部类的一个对象 void f() {...}; }; // 这里的分号是必须的 } ... • 示例: demo/Demo3.java
  • 11. 嵌套类 • 嵌套类(nested class), 又称静态内部类(static inner class); 嵌套类同样定义在另一个类的内部, 但是它和外部类没有任何关联; 这意味着: 1), 创建一个嵌套类对象, 不需要有相关联的外部 对象被创建; 2),嵌套类对象没有与之相关联的外部对象可以访 问; • 内部类不能有static成员, 也不能在内部类内部 定义嵌套类; 而嵌套类则没有这些限制, • 示例: demo/Demo4.java
  • 12. 为什么使用内部类? • 为什么需要使用内部类? 1, 内部类提供了一种访问外部对象的途径; 2, 内部类提供了另一种方式用来实现继承多个非接口 类. • 示例: abstract class A {...} class B {...} class C extends B { class Inner extends A {...} // C相当于同时继承了A和B }
  • 13. 内部类继承 • 由于内部类对象在初始化时必须确保外部对象已经初始化, 在继 承一个内部类时有以下不同点: 1), 不能使用默认构造器; 2), 必须传入一个外部对象, 并且在构造方法体中使用 enclosingClass.super()进行初始化; • 示例: class Outer { class Inner {...} } class InnerInherit extends Outer.Inner { InnerInherit (Outer outer){ outer.super(); ... } }
  • 14. 内部类 覆盖 • 内部类能否像方法一样被覆盖? 答案是可以 在子类中声明同名的内部类, 但是不会发生 覆盖行为. • 示例: demo/Demo5.java
  • 15. END