美文网首页
【Java】内部类与外部类的互访使用小结

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

作者: 骇客与画家 | 来源:发表于2017-12-30 22:24 被阅读0次

    原博客链接:【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】内部类与外部类的互访使用小结

          本文链接:https://www.haomeiwen.com/subject/rzgngxtx.html