JAVA基础(内部类)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,违者必究。 https://blog.csdn.net/Cricket_7/article/details/91490114

1,内部类概述

  • java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。

2,内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有。

  • 外部类要访问内部类的成员,必须创建对象。

    • 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

  • 案例

class Demo1_InnerClass {

    public static void main(String[] args) {

        //Inner i = new Inner();

        //i.method();

        //外部类名.内部类名 = 外部类对象.内部类对象

        Outer.Inner oi = new Outer().new Inner();            //创建内部类对象

        oi.method();





    }

}



class Outer {

    private int num = 10;

    class Inner {

        public void method() {

            System.out.println(num);

        }

    }

}

    

3,成员内部类私有使用

  • private

class Demo2_InnerClass {

    public static void main(String[] args) {

        //Outer.Inner oi = new Outer().new Inner();

        //oi.method();

        Outer o = new Outer();

        //o.print();

    }

}





class Outer {

    private int num = 10;





    private class Inner {

        public void method() {

            System.out.println(num);

        }

    }

    //内部类别私有了,我们只能提供对外的方法创建对象 

    public void print() {

        Inner i = new Inner();

        i.method();

    }

    

}

4,静态成员内部类,

  • static

  • 成员内部类被静态修饰后的访问方式是:

  • 外部类名.内部类名 对象名 = 外部类名.内部类对象;

class Demo1_InnerClass {

    public static void main(String[] args) {

        //外部类名.内部类名 对象名 = 外部类名.内部类对象;

        Outer.Inner oi = new Outer.Inner();

                         //Outer.new Inner();

        Outer.Inter oo = new Outer.Inner();

        oi.method();



        

        Outer.Inner2.print();

    }

}





class Outer {

    static class Inner {

        public void method() {

            System.out.println("method");

        }

    }





    static class Inner2 {

        public static void print() {

            System.out.println("print");

        }

    }

}

【1】内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this

  • 要求:使用已知的变量,在控制台输出30,20,10。

class Test1_InnerClass {

    public static void main(String[] args) {

        Outer.Inner oi = new Outer().new Inner();

        oi.show();

    }

}

//要求:使用已知的变量,在控制台输出30,20,10。

//内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this

class Outer {

    public int num = 10;

    class Inner {

        public int num = 20;

        public void show() {

            int num = 30;

            System.out.println(num);

            System.out.println(this.num);

            System.out.println(Outer.this.num);

        }

    }

}

5,局部内部类访问局部变量

【1】代码

class Demo1_InnerClass {

    public static void main(String[] args) {

        Outer o = new Outer();

        //o.method();

    }

}

//局部内部类

class Outer {

    public void method() {

        final int num = 10;

        class Inner {

            public void print() {

                System.out.println(num);

            }

        }





        Inner i = new Inner();

        i.print();

    }





    /*public void run() {

        Inner i = new Inner();                //局部内部类,只能在其所在的方法中访问

        i.print();

    }*/

}

【2】图解

  • 局部内部类访问局部变量必须用final修饰

  • 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?

  • 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用

  • 但是jdk1.8取消了这个事情,所以我认为这是个bug

    。

猜你喜欢

转载自blog.csdn.net/Cricket_7/article/details/91490114