内部类与匿名内部类

原创 2013年12月02日 09:54:46

一   内部类

类中嵌套类叫内部类,包含内部类的类叫外部类;

内部类使用static 修饰叫静态内部类
外部类可以使用内部类;
外部类中静态函数不能使用new创建内部类的对象(只能创建引用类型变量),创建静态内部类对象例外;
内部类可以任意方式使用外部类;
内部类可以使用任何访问权限修饰符修饰;
内部类的访问权限对外部类没有任何约束;
内部类可以使用其它类
其它类使用内部类时受内部类的访问权限修饰符约束,约束规则与外部类的成员一样;

其它类可以创建内部类的引用类型变量,但是只能创建静态内部类的对象;

示例:

//Hello叫外部类、Stu叫内部类
public class Hello {
          public void m() {
                     Stu stu = new Stu();
                     stu.study();
          }
          public static void main(String[] args) {
                      new Hello().m();
          }
         class Stu {
                   public void study() {
                              System.out.println("Stu study()....");
                  }
         }

}

二  匿名内部类

(1)匿名内部类是在一个类中写一个没有名子的子类,或没有名字的接口实现类,并且直接创建了对象;

(2)匿名内部类的父类可以是普通类;

示例:
public class Stu {
     public void study() {
          System.out.println("good good study");
     }
     public void sleep() {
         System.out.println("sleep");
     }
}


public class Hello {
     public Stu stu  = new Stu() {
     

     };
     public static void main(String[] args) {
          Hello h = new Hello();
          h.stu.study();
          h.stu.sleep();
    }
}


public class Hello2 {
      public Stu stu  = new Stu() {
           @Override
           public void study() {
               System.out.println("好好学习");
          }
       };
       public static void main(String[] args) {
            Hello2 h = new Hello2();
            h.stu.study();
            h.stu.sleep();
       }
}

(3)匿名内部类的父类可以是抽象类

public abstract class  Stu {
     public void study() {
              System.out.println("good good study");
     }
     public void sleep() {
             System.out.println("sleep");
     }
     public abstract void go();
}

public class Hello {
         public Stu stu  = new Stu() {
                  @Override
                  public void study() {
                         System.out.println("好好学习");
                  }
                  @Override
                  public void go() {
                         System.out.println("走....");
                  }
          };
          public static void main(String[] args) {
                 Hello h = new Hello();
                 h.stu.study();
                 h.stu.sleep();
                 h.stu.go();
          }
}

(4)匿名类部类是接口的实现类

public interface Inf {
public abstract void go();
}

public class Hello {
       public Inf inf = new Inf() {
              @Override
               public void go() {
                      System.out.println("go");
                      this.xx();
               }
               public void xx() {
                      System.out.println("xx");
              }
       };
       public static void main(String[] args) {
              Hello h = new Hello();
              h.inf.go();
              //h.inf.xx();//错
       }
}

(5)前面匿名内部类对象都是为外部类的成员变量赋值,实际上匿名内部类对象也可以为外部类函数中的局部变量赋值

public interface Inf {
         public abstract void go();
}

public class Hello {
        private void test() {
                Inf inf = new Inf() {
                       @Override
                       public void go() {
                            System.out.println("go()...");
                       }
                };
       }
}

三  内部类中访问外部类对象

内部类函数中的this表示内部类对象,要得到外部类对象可使用"外部类名.this",所以访问外部类对象成员格式为:
    "外部类名.this.外部类成员"

public interface Inf

{
        public abstract void go();
}

public class Hello {
         public int x = 100;
         public void m1() {
                  System.out.println("m1....");
         }
         private void test() {
                  Inf inf = new Inf() {
                          public int x = 20;
                          @Override
                           public void go() {
                                      System.out.println("go()...");
                                      Hello.this.m1();
                                      m1();
                                      System.out.println(Hello.this.x);//100
                                      System.out.println(Hello.this.x);//20
                           }
                };
          }
}


相关文章推荐

java基础四种匿名内部类

  • 2017年08月09日 23:08
  • 42.78MB
  • 下载

匿名内部类代码

  • 2012年12月06日 10:57
  • 12KB
  • 下载

匿名内部类如何同时调用多个方法

在这里有关匿名内部类的知识就不再赘述了,主要分享一种用法给大家。 匿名内部类如何同时调用多个方法前几天看Java学习视频的时候,讲到匿名内部类说只可以一次调用一种方法;要调用另一种方法,只能重新再建一...
  • JadynAi
  • JadynAi
  • 2015年12月17日 17:25
  • 1494

Java 匿名内部类

  • 2017年08月02日 22:58
  • 6KB
  • 下载

java中的匿名内部类总结

  • 2013年10月09日 21:57
  • 30KB
  • 下载

Java的匿名内部类与Lambda表达式

匿名内部类匿名内部类适合只需要使用一次的类,创建匿名内部类时会立即创建一个该类的实例。定义匿名内部类new 接口() | 父类构造器(实参列表) {} 匿名内部类必须继承一个父类,或实现一个接口。1)...

java 匿名内部类的使用规范

  • 2010年06月21日 15:01
  • 59KB
  • 下载

关于匿名内部类的资料

  • 2009年07月19日 03:27
  • 34KB
  • 下载

匿名内部类访问外部类方法中的局部变量

匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型   1. 这里所说的“匿名内部类”主要是指在其外部类的成员方法内定义,同时完成实例化的类,若其访问该成员方法中的局部变量...

JAVA_匿名内部类

  • 2012年08月16日 12:56
  • 64KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内部类与匿名内部类
举报原因:
原因补充:

(最多只允许输入30个字)