黑马程序员技术交流社区

标题: 内部类知识点总结 [打印本页]

作者: 心在左边跳    时间: 2015-7-6 00:52
标题: 内部类知识点总结
本帖最后由 心在左边跳 于 2015-7-6 01:02 编辑

内部类访问规则

作用:内部类可以方便访问外部类成员,包括私有。外部类访问内部类,需要建立内部类对象。之所以可以直接访问外部类的成员,因为直接持有外部类引用,格式:Outer.this
访问格式:

  1. /**
  2. * Created by root on 15-6-14.
  3. */
  4. public class Outer {
  5.     int x;
  6.     class Inner{
  7.     int x;
  8.         void function(){
  9.         this.x;
  10.         Outer.this.x;//外部类的变量
  11.         }
  12.     }
  13.     void method(){
  14.         Inner inner=new Inner();
  15.         inner.function();
  16.     }
  17.     public static void main(String[]agrgs){
  18.         //内部类全名
  19.         Outer.Inner i = new Outer().new Inner();
  20.     }
  21. }
复制代码

内部类定义规则

什么时候使用内部类?
当描述事物时,事物中含有事物,该事物使用内部类描述。因为该事物使用外部事物。

  1. public class Outer {
  2.     private class Inner{//封装内部类
  3.         void function(){}
  4.     }
  5.     void method(){
  6.         new Inner().function();
  7.     }
复制代码
匿名内部类

内部类定义在局部时,不能被成员修饰符访问。可以访问外部类的成员,因为持有外部类的引用。但是不可访问它所在局部的变量。只能访问被final修饰的成员变量。


  1. public class Outer {
  2.     void method(final int x){
  3.          class Inner{
  4.             void function(){
  5.                 System.out.println(x);
  6.             }
  7.         }
  8.         new Inner().function();
  9.     }
  10.     public static void main(String[]agrgs){
  11.         //
  12.         Outer i = new Outer();
  13.         i.method(1);
  14.         i.method(2);
  15.     }
  16. }
复制代码

定义匿名内部类前提,内部类必须继承一个类,或者实现接口。
格式:new 父类或接口 {定义子类的内容}
其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
匿名内部类中定义方法最好不要超过3个。


  1. public class Outer {
  2.     int x;
  3.     void method(){
  4. //
  5.         new AbsDemo(){
  6.             @Override
  7.             void show(int x) {
  8.                 System.out.print("x="+x);
  9.             }
  10.         }.show(x);
  11.     }
  12.     public static void main(String []args){
  13.         Outer o= new Outer();
  14.         o.x=1;
  15.         o.method();
  16.     }
  17. }
  18. abstract class AbsDemo{
  19.     abstract void  show(int x);
  20. }


  21. //练习
  22. public class Outer {
  23.     public static Inner function(){
  24.         return new Inner() {
  25.             @Override
  26.             public void method() {
  27.                 System.out.print("返回匿名内部类");
  28.             }
  29.         };
  30.     }
  31.     public static void main(String[]args){
  32.     //function()运算后是一个对象,而且是一个Inner类对象。所以才调用method()方法
  33.         Outer.function().method();
  34.     }
  35. }
  36. interface Inner{
  37.     void method();
  38. }
复制代码

匿名内部类作为方法的参数

  1.     public static void show(Inner inner){
  2.     //
  3.     }
  4.         Outer.show(new Inner() {
  5.             @Override
  6.             public void method() {
  7.             }
  8.         });
复制代码

匿名内部类父类为Object

  1. new Object(){
  2.             public void method(){}
  3.         }.method();
复制代码




作者: Ruby    时间: 2015-7-6 10:16
赞 楼主加油
作者: 等你的季节-夏天    时间: 2015-7-6 10:48
谢谢分享
作者: wing-SF    时间: 2015-7-6 11:26
不错,得好好看看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2