内部类与匿名内部类

一   内部类

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

内部类使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值