• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
10, inner classes
 

10, inner classes

on

  • 322 views

About Java inner class

About Java inner class

Statistics

Views

Total Views
322
Views on SlideShare
308
Embed Views
14

Actions

Likes
0
Downloads
0
Comments
0

4 Embeds 14

http://ebshome.blogspot.com 8
http://ebshome.blogspot.jp 3
http://translate.googleusercontent.com 2
http://ebshome.blogspot.sg 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    10, inner classes 10, inner classes Presentation Transcript

    • 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