关闭

内部类与匿名内部类

标签: java内部类匿名内部类
639人阅读 评论(0) 收藏 举报
分类:

一   内部类

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

内部类使用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
                           }
                };
          }
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:117628次
    • 积分:2059
    • 等级:
    • 排名:第18631名
    • 原创:86篇
    • 转载:22篇
    • 译文:0篇
    • 评论:38条
    文章分类
    最新评论