A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心在左边跳 中级黑马   /  2015-7-6 00:52  /  652 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 心在左边跳 于 2015-7-6 01:02 编辑

内部类访问规则

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

  • 当内部类定义在外部类成员位置上,而非私有,可以在外部其他类忠,直接建立内部类对象
    格式:
    外部类名.内部类名 变量名= 外部类对象.内部类对象;
    Outer.Inner i = new Outer().new Inner();
  • 当内部类定义在外部类成员位置上,就可以被成员修饰符修饰。比如:private ,内部类在外部类中封装。
    static ,内部类具有static特性。当内部类被static修饰后,只能访问外部类的静态成员。出现访问局限。
    new Outer.Inner().function()(直接访问内部类的非静态成员)
    Outer.Inner.function()(直接访问内部类的静态成员)
    注意:当内部类定义了静态成员,内部类必须时静态的。当外部类的静态方法访问内部类时,内部类必须是静态的。
  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();
复制代码



3 个回复

倒序浏览
赞 楼主加油
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
不错,得好好看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马