美文网首页
java面向对象之内部类

java面向对象之内部类

作者: pretty_rain | 来源:发表于2019-08-14 10:18 被阅读0次

    1.内部类的定义
    把类定义在另一个类的内部,该类就被称为内部类。
    2.内部类的访问规则
    a:可以直接访问外部类的成员,包括私有
    b:外部类要想访问内部类成员,必须创建对象
    3.内部类的分类
    a:成员内部类
    b:局部内部类
    4.成员内部类
    a:成员内部类不是静态的:外部类名.内部类名 对象名 = new 外部类名().new 内部类();
    b:成员内部类是静态的:外部类名.内部类名 对象名 = new 外部类名.内部类名();

    输出结果:30,20,10,10
            
            class Outer {
                public int num = 10;
                
                class Inner {
                    public int num = 20;
                    
                    public viod show() {
                        int num  = 30;
                        
                        System.out.println(num);
                        System.out.println(this.num);
                        System.out.println(Outer.this.num);
                                           System.out.println(new Outer().num);
                    }
                }
            }
    
    

    5.局部内部类访问局部变量必须加final修饰
    因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
    所以,堆内存还是用该变量,而改变量已经没有了。
    为了让该值还存在,就加final修饰。
    通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

    class Outer {
        private int num  = 10;
        public void method() {
            final int num2 = 20;
            class Inner {
                public void show() {
                    System.out.println(num);
                    //从内部类中访问本地变量num2; 需要被声明为最终类型
                    System.out.println(num2);//20
                }
            }
            //System.out.println(num2);
            Inner i = new Inner();
            i.show();
        }
    }
    class InnerClassDemo5 {
        public static void main(String[] args) {
            Outer o = new Outer();
            o.method();
        }
    }
    

    6.匿名内部类
    a:是局部内部类的简化形式
    b:前提:存在一个类或者接口
    c:格式:
    new 类名或者接口名() {
    重写方法;
    }
    d:本质:其实是继承该类或者实现接口的子类匿名对象
    7.匿名内部类在开发中的使用

    interface Person {
                public abstract void study();
            }
            
            class PersonDemo {
                public void method(Person p) {
                    p.study();
                }
            }
            
            class PersonTest {
                public static void main(String[] args) {
                    PersonDemo pd = new PersonDemo();
                    pd.method(new Person() {
                        public void study() {
                            System.out.println("好好学习,天天向上");
                        }
                    });
                }
            }
            
    

    相关文章

      网友评论

          本文标题:java面向对象之内部类

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