• 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();
    
        }
    }
    
    
  • 相关阅读:
    爬虫:Scrapy15
    爬虫:Scrapy14
    爬虫:Scrapy13
    爬虫:Scrapy12
    爬虫:Scrapy11
    爬虫:Scrapy10
    爬虫:Scrapy9
    线段树基础
    [USACO08DEC]秘密消息Secret Message
    阅读理解
  • 原文地址:https://www.cnblogs.com/comeluder/p/10441919.html
Copyright © 2020-2023  润新知