内部类_Java

作者:爱塔居的博客_CSDN博客-JavaSE领域博主

专栏:JavaSE

文章目录

目录

文章目录

一、内部类的概念

二、内部类的分类

1.静态内部类(被static修饰)

2.非静态内部类

 3.局部内部类

 4.匿名内部类


一、内部类的概念

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。

内部类也是封装的一种体现。

public class OutClass{

 class InnerClass{

……

      }

}

🍵OutClass是外部类,InnerClass是内部类

二、内部类的分类

🥑内部类分为:

1.静态内部类

2.非静态内部类/实例内部类

3.局部内部类

4.匿名内部类

1.静态内部类(被static修饰)

静态内部类当中,不能直接访问内部类的非静态成员。

通过这个代码,我们主要注意怎么实例化对象,还有如何访问外部类的非静态变量。

class Outer {
    public int a1=1;
    private int a2=2;
    static public int a3=3;
    static class Inner{
        public int a4=4;
        private int a5=5;
     public void func(){
         Outer outer=new Outer();
         System.out.println(outer.a1);//通过引用,访问外部类的非静态成员
         System.out.println(outer.a2);
         System.out.println(a3);
         System.out.println(a4);
         System.out.println(a5);
     }
    }
}
public class Test{
    public static void main(String[] args) {
        Outer.Inner inner=new Outer.Inner();//静态内部类的实例化
        inner.func();
    }
}

2.非静态内部类

class Outer {
    public int a1=1;
    private int a2=2;
    static public int a3=3;
     class Inner{
        public int a4=4;
        private int a5=5;
       public void func(){
      Outer outer=new Outer();
           System.out.println(outer.a1);
           System.out.println(outer.a2);
         System.out.println(a3);
         System.out.println(a4);
         System.out.println(a5);
     }
    }
}
public class Test{
    public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
    }
}

当外部类和内部类有同名变量时:

class Outer {
    public int a1=1;
     class Inner{
        public int a1=2;
       public void func(){
      Outer outer=new Outer();
           System.out.println(outer.a1);
           System.out.println(Inner.this.a1);
     }
    }
}
public class Test{
    public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
    }
}

输出:

注意: 

class Outer {
    public int a1=1;
     class Inner{
      static final   public  int a1=2;//加上final就相当于常量。否则会报错。因为static静态类是不依赖对象的。
       public void func(){
      Outer outer=new Outer();
           System.out.println(outer.a1);
           System.out.println(Inner.this.a1);
     }
    }
}
public class Test{
    public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
    }
}

 3.局部内部类

 定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。

class Outer {
    public int a=1;
    public void method(){
        int b=10;
        class Inner{
            public void func(){
                Outer outer=new Outer();
                System.out.println(a);
                System.out.println(b);
            }
    }
    Inner inner=new Inner();
        inner.func();
    }
}
public class Test{
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.method();
    }
}

🍧局部内部类不能被public,static等访问修饰限定符修饰。同时,只能在该方法体内部使用,其他位置都不能使用。

 4.匿名内部类

interface  IA{
    void func();
}
class AA implements IA{
    public void func(){
        System.out.println("hello");
    }
}
public class Test{
    public static void main(String[] args) {
        new IA(){//这个类没有名字,所以叫匿名内部类
            public void func(){
                System.out.println("hi");
            }
        }.func();
    }
}

输出结果:


  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值