内部类

来说一说内部类,内部类一共分为四种,分别是

  1. 静态内部类
  2. 局部内部类
  3. 成员内部类
  4. 匿名内部类

静态内部类

类的成员
1. 成员变量
2. 成员方法
3. 构造方法
4. 代码块
5. 静态代码块
6. 内部类

按照内部类声明方式
1. 静态内部类
- static
- 属于类:类比于静态变量 静态方法,没有外部类的引用(不需要对象)(直接使用外部类的this也就是意味着不能直接访问外部类的非静态属性

总结
  1. 静态内部类可以直接访问外部类的静态成员变量,静态内部类不可以直接 访问外部类的非静态成员变量

  2. 调用方式:

    • 导包的时候倒到外部类名为止
      外部类类名.内部类类名 内部类对象名=new 外部类类名.内部类类名();
    • 导包的时候倒到内部类的类名为止

    内部类类名 内部类的对象名 =new 内部类类名 ();

    • 内部类的对象名.内部类方法名();
public class StaticInnerClass {
     static  int a=12;
     //静态内部类
     public static class Moo{
         int b=13;
         public void add(){
             int c=14;
             System.out.println(a);
         }
     }

     public static void main(String[] args) {
        Moo m=new Moo();
        m.add();

     }
}
import com.qf.oop.innerclass.StaticInnerClass;
import com.qf.oop.innerclass.StaticInnerClass.Moo;
public class Test {
    public static void main(String[] args) {
        /*StaticInnerClass.Moo m=new StaticInnerClass.Moo();
        m.add();*/
        Moo m=new Moo();
        m.add();
    }
}

局部内部类

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

注意:

  1. 局部内部类随方法的调用而被加载
  2. 也可以访问外部类的私有属性 持有外部类应用可以使用this
  3. 局部内部类的对象只能在该类中创建
  4. 局部内部类当中,如果访问外部类的局部变量(方法中的变量)一定是常量(使用final修饰)
public class LocInnerClass {
   public static void main(String[] args) {
      final int a=12;
      class Moo{
          int b=13;
          public void add(){
              int c=14;
             // a++;
              System.out.println(a);
          }
      }
      Moo m=new Moo();
      m.add();


      LocInnerClass l=new LocInnerClass();
      l.test();
   }

   public void test(){
       final int a=12;
          class Moo{
              int b=13;
              public void add(){
                  int c=14;
                 // a++;
                  System.out.println(a);
                  System.out.println(this);
              }
          }
          Moo m=new Moo();
          m.add();
   }
}

成员内部类

/**
 * 2.成员内部类 可以使用4种访问权限符修饰
 *   调用方式
 *     第一种方式:
 *       外部类类名 外部类对象名=new 外部类类名();
 *       外部类类名.内部类类名 内部类对象名= 外部类对象名.new 内部类类名();
 *       内部类对象名.方法名();
 *      第二种方式:
 *        外部类类名.内部类类名 内部类对象名=new 外部类类名().new 内部类类名();
 *        内部类对象名.方法名();
 * 
 *
 */
public class InnerClass {
    int a=12;
   //成员内部类
   public class Moo{
       int b=13;
       public void add(){
           int c=14;
           System.out.println(a);
       }
   }
   public static void main(String[] args) {
       /*InnerClass in=new InnerClass();
       System.out.println(in.a);*/
       //第一种方式
       InnerClass in=new InnerClass();
       InnerClass.Moo m=in.new Moo();
       m.add();
       InnerClass.Moo m1=in.new Moo();
       m1.add();

       //第二种方式
       InnerClass.Moo m3=new InnerClass().new Moo();
       m3.add();
   }
}

成员内部类变量名称一致的情况

public class InnerClass2 {
    int a=12;
   //成员内部类
   public class Moo{
       int a=13;
       public void add(){
           int a=14;
           System.out.println(a);
           System.out.println("内部类成员变量a="+new Moo().a);
           System.out.println("内部类成员变量a="+this.a);
           System.out.println("外部类的成员变量a="+new InnerClass2().a);
           System.out.println("外部类的成员变量a="+InnerClass2.this.a);
       }
   }
   public static void main(String[] args) {

       //第二种方式
       InnerClass2.Moo m3=new InnerClass2().new Moo();
       m3.add();
   }
}

匿名内部类

语法:

类名 对象名 = new 类名(){
实现抽象方法
}

注意:

匿名内部类没有构造方法

/**
 * 匿名内部类:没有名字
 * 语法:
 *   类名 对象名=new 类名(){
 *      实现抽象方法
 *   };
 * 注意:
 *   匿名内部类没有构造方法
 * 
 */
public class NoNameInnerClass {
   public static void main(String[] args) {
        //AA a=new AA();
        AA a=new BB();
        a.add();
        AA a1=new BB();
        a1.add();

        //Animal an=new Animal();
        Cat c=new Cat(){
            @Override
            public void catchMouse() {
                System.out.println("猫咪正在和老鼠玩耍");

            }   
        };
        c.catchMouse();

        Cat c1=new Cat(){

            @Override
            public void catchMouse() {
                System.out.println("小猫咪抓老鼠");

            }

        };
        c1.catchMouse();


        Cat c3=new MImi();
        c3.catchMouse();


   }
}
abstract class AA{
    public void run(){
        System.out.println("奔跑");
    }
    public abstract void add();
}
class BB extends AA{

    @Override
    public void add() {
        System.out.println(12); 
    }   
}
interface Animal{

}
interface Cat extends Animal{
    void catchMouse();
}
class MImi implements Cat{

    @Override
    public void catchMouse() {
        System.out.println("小猫咪抓老鼠");

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值