zoukankan      html  css  js  c++  java
  • JAVA基础补漏--内部类

    成员内部类

    public class InnerClass {
    
        public static void main(String[] args) {
    
            System.out.println("+++++++++++++++++++++++");
    
            Outer.Inner oi = new Outer().new Inner();
            oi.methodInner();
        }
    
    }
    
    
    public class Outer {
    
        int num = 10;
    
        public class Inner{
    
            int num = 20;
    
            public void methodInner(){
                int num =30;
                System.out.println(num);
                System.out.println(this.num);
                System.out.println(Outer.this.num);
            }
        }
    }
    
    

    局部内部类

    public class InnerClass {
    
        public static void main(String[] args) {
    
            Outer out = new Outer();
            out.methodOuter();
        }
    
    
    }
    
    
    public class Outer {
    
        int num = 10;
    
        public void methodOuter(){
    
             class Inner{
    
                 int num = 10;
                 public void methodInner(){
                     System.out.println(num);
                 }
    
            }
    
            Inner in = new Inner();
             in.methodInner();
        }
    
    }
    

    权限修饰符

    外部类:public / default

    成员内部类:public protect default private

    局部内部类:什么都不能用

    局部内部类,如果希望访问所在方法的局部变量,这个局变量必是final的。如果这个变量不变,final可不写。

    原因

    1.new 的对象在堆内存中。
    2.局部变量跟着方法走,在栈内部中。
    3.方法运行结束后,立即出栈,局部变量会消失。
    4.但是内部类的方法要使用,必须要new一个对象,new出来对象在内存中一直存在,直到垃圾回收,这时局部变量可能已经销毁了。如果要使用,就自己要拷贝一个,但如果变量总变,没有办法拷贝,如果是final,则可以直接拷贝。

    public class Outer {
        
        public void methodOuter{
            
            final int num = 10;
            
            class Inner{
                
                public void methodInner(){
                    
                    System.out.println(num);
                }
            }
        }
        
    }
    

    匿名内部类

    如果接口实现类(或者父类的子类)只使用一次,这时候可以省略类的定义,而使用匿名内部类。

    格式:

    接口类名称 对象 = new 接口名称(){
    //覆盖重写所有抽象方法
    }

    public class main {
    
        public static void main(String[] args) {
    
    
    
            myInterface obj = new myInterface() {
                @Override
                public void method() {
                    System.out.println("Inner method");
                }
                
            };
    
            obj.method();
            
            new myInterface(){
    
                @Override
                public void method() {
                    System.out.println("匿名对象使用匿名内部类");
                }
            }.method();
    
        }
    }
    
    
  • 相关阅读:
    呵呵,23号了,难道要通宵???
    开会效果不错
    开完会罗,明天离开这上有点奢华的地方:)
    感冒了,感觉糟透了。。。
    你好,深圳!你好,2010!
    上班 第一天
    。。轻。。。
    那天我生日
    英雄七十寿 无物下冷酒 横刀上闹市 直取数人头
    李孝利 唠叨
  • 原文地址:https://www.cnblogs.com/comeluder/p/10441919.html
Copyright © 2011-2022 走看看