前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java内部类——静态和非静态内部类、匿名内部类、方法内部类

Java内部类——静态和非静态内部类、匿名内部类、方法内部类

原创
作者头像
逆回十六夜
修改2019-08-14 14:48:46
8970
修改2019-08-14 14:48:46
举报
文章被收录于专栏:逆回十六夜逆回十六夜

概念讲义转载自https://www.sxt.cn/Java_jQuery_in_action/five-inner-class.html

-----------------------------------------------------------------------------------------------------------------------------------------------------------

内部类的概念https://www.sxt.cn/Java_jQuery_in_action/five-inner-class.html

内部类的分类https://www.sxt.cn/Java_jQuery_in_action/five-classification.html

-----------------------------------------------------------------------------------------------------------------------------------------------------------

实验代码:

非静态内部类:

代码语言:javascript
复制
public class TestInnerClass{
    public static void main(String[] args){
        Outer.Inner inner = new Outer().new Inner();
        inner.show();
        Outer outer = inner.getOuter();
        outer.testOuter();

        Outer outer1 =new Outer();
        Outer.Inner inner1 = outer1.new Inner();
        outer1.testOuter();
        inner1.show();
    }
}

class Outer{
    private int age = 10;

    public void testOuter(){
        System.out.println("Outer.testOuter()");
    }

    class Inner{
        private Outer outer = Outer.this;

        public Outer getOuter() {
            return outer;
        }

        public void show(){
            System.out.println("外部类成员变量age:"+Outer.this.age);
        }
    }
}
观察分析各个类的地址可以看出他们的关系
观察分析各个类的地址可以看出他们的关系

发现:

  • 如果 Outer.Inner inner =newOuter().newInner();这么创建内部类,并没有外部类的引用,也就无法调用外部类自己的方法,同时也就屏蔽了外部类的操作
  • 但是如果在内部类中写上外部类的引用和get方法,就可以在这种定义方式的前提下获得外部类的引用了。

静态内部类

代码语言:javascript
复制
public class TestStaticInnerClass {
    public static void main(String[] args){
        Outer2 outer2 = new Outer2();
        Outer2.Inner2 inner2 = new Outer2.Inner2();
        Outer2.Inner2 inner3 = new Outer2.Inner2();
        inner2.age =30;
        inner2.Speak();
        inner3.age =40;
        inner3.Speak();
        inner2.Speak();
    }
}

class Outer2{
    public Outer2()
    {
        System.out.println("外部类被执行了!");
    }
    static class Inner2{
        public static int age = 20;
        public Inner2(){
            System.out.println("静态内部类被执行了!");
        }
        public void Speak(){
            System.out.println("静态内部类的age为:"+age);
        }
    }
}
代码语言:javascript
复制
        外部类被执行了!
        静态内部类被执行了!
        静态内部类被执行了!
        静态内部类的age为:30
        静态内部类的age为:40
        静态内部类的age为:40

发现:

  • 定义的两个内部类的age是同一个age,任意一个改变了则全都改变(静态区的同一个变量),但是引用指向的地址却不同。应该是在堆区建立的两个不同的对象。
  • 静态内部类和非静态内部类是有区别的:

内部类有外部类的this指针,但是静态内部类是没有外部类的this指针的,毕竟两者创建的时间也不用。这就直接导致了静态内部类无法直接通过this指针访问外部类的变量。静态内部类和内部类的调用方法也不同(这是当然的)

静态内部类编译报错
静态内部类编译报错
内部类存在this指针直接访问外部类变量
内部类存在this指针直接访问外部类变量

匿名内部类

代码语言:javascript
复制
public class NoNameInnerClass {
    public static void test01(AA a){
        a.aa();
    }

    public static void main(String[] args){
        NoNameInnerClass.test01(new AA() {
            @Override
            public void aa() {
                System.out.println("匿名内部类的方法执行!");
            }
        });
    }
}

interface AA{
    void aa();
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验代码:
    • 非静态内部类:
      • 发现:
        • 静态内部类
          • 发现:
            • 匿名内部类
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档