【Java】内部类与外部类的互访使用小结

原博客链接:【Java】内部类与外部类的互访使用小结

内部类又称为嵌套类。可以把内部类理解为外部类的一个普通成员。

内部类访问外部类

里面的可以自由访问外面的,规则和static一样。(访问非静态时必须先创建对象)

具体如下:

非静态内部类的非静态方法

直接访问

public class Outter {
    int i = 5;
    static String string = "Hello";
    
    class Inner1{
        void Test1 () {
            System.out.println(i);
            System.out.println(string);
        }
    }
}

静态内部类的非静态方法

因为静态方法访问非静态外部成员需先创建实例,所以访问i时必须先new外部类

public class Outter {
    int i = 5;
    static String string = "Hello";
    
    static class Inner2{
        void Test1 () {
            System.out.println(new Outter().i);
            System.out.println(string);
        }
    }
}

静态内部类的静态方法

规则如上

public class Outter {
    int i = 5;
    static String string = "Hello";
    
    static class Inner2{
        static void Test2 () {
            System.out.println(new Outter().i);
            System.out.println(string);
        }
    }
}

外部类访问内部类

大方向:因为将内部类理解为外部类的一个普通成员,所以外部的访问里面的需先new一个对象。

非静态方法访问非静态内部类的成员:

new 内部类对象

public class Outter {
    static void Test2() {
        System.out.println(new Outter().new Inner1().i);
    }
    class Inner1{
        int i = 5;
//      static String string = "Hello"; 定义错误!
    }
}

静态方法访问非静态内部类的成员

静态方法Test2访问非静态Inner1需先new外部类;

继续访问非静态成员i需先new 内部类

所以访问规则为:new Outter().new Inner1().i。


public class Outter {  
    static void Test2(){  
        System.out.println(new Outter().new Inner1().i);  
    }  
    class Inner1{  
        int i = 5;  
//      static String string = "Hello";  定义错误!  
    }  
}

非静态方法访问静态内部类的成员

先“外部类.内部类”访问至内部类。

若访问非静态成员,则需先new再访问;若访问静态成员,则可直接访问。

public class Outter {
    void Test2() {
        Outter.Inner2 inner2 = new Outter.Inner2();
        System.out.println(inner2.i);
        System.out.println(inner2.string);
        System.out.println(Outter.Inner2.string);
    }
    static class Inner2{
        int i = 5;
        static String string = "Hello"; // 定义错误!
    }
}

非静态方法访问非静态内部类的成员

先“外部类.内部类”访问至内部类,再new即可访问静态成员。

  public class Outter {
    void Test1(){
        Outter.Inner1 inner2 = new Outter.Inner1();
        System.out.println(inner2.i);
    }
    class Inner1{
        int i = 5;
  //        static String string = "Hello"; 定义错误!
    }
  }

匿名内部类

匿名内部类访问外部成员变量时,成员变量前应加final关键字。

        final int k = 6;
        ((Button)findViewById(R.id.button2)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                System.out.println(k);
            }
        });

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。 1、成员内部类: 即作为外部类的一个成...
    ikaroskun阅读 1,253评论 0 13
  • 问:Java 常见的内部类有哪几种,简单说说其特征? 答:静态内部类、成员内部类、方法内部类(局部内部类)、匿名内...
    Little丶Jerry阅读 2,010评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 梦幻新品驾到!LADURÉE 2017新品一览 继「大腿唇彩」后,Les Merveilleuses LADURÉ...
    ponette阅读 248评论 0 0
  • 火锅加烧烤,一锅两用,真是好创意! 生活的美好与否其实只与自己的心态有关,普普通通的一片面包只需放在漂亮的白色盘子...
    jasmine南京阅读 187评论 4 3