10, inner classes

272
-1

Published on

About Java inner class

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
272
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

10, inner classes

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

×