Java内部类笔记整理

2023-03-18  本文已影响0人  超级小霸王

前言

由于平时使用内部类不多,所以对内部类只有一个很浅的认知。趁着春节有空,整理了一些内部类的使用笔记。

使用内部类的好处

使用内部类可以很好地解决多重继承的问题,每个内部类都能独立地继承一个(接口的)实现。

内部类的分类

成员内部类

静态内部类

方法内部类

匿名内部类

1.成员内部类

    private int num = 100;
    String name = "zhou";
    public class Inner{
        String name = "Inner Zhou";
        public void print(){
            System.out.println(Demo.this.name); //当内部类属性名和外部类属性名一样时,外部类需要(外部类.this.属性)来调用
            System.out.println(name);//当内部类属性名和外部类属性名一样时,默认调用内部类属性
            System.out.println(num);
        }
    }
    public static void main(String[] args){
        Demo o = new Demo();
        Inner in = o.new Inner();
        in.print();
    }
}

2.静态内部类

    private int num = 100;
    String str = "zhou";
    static String name = "zhou";
    public static class Inner{
        String name = "Inner Zhou";
        public void print(){
            System.out.println(new Demo().str);
            System.out.println(Demo.name);
            System.out.println(name);
        }
    }
    public static void main(String[] args){
        Inner in = new Inner();
        in.print();
    }
}

3.方法内部类

     String a = "zhou a";
    public void show() {
        String b = "Zhou b";
        class Inner {
            String c = "Zhou c";
            public void print(){
                System.out.println(a);
                System.out.println(b);
                System.out.println(c);
            }
        }
        Inner i = new Inner();
        i.print();
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.show();
    }
}

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.

4.匿名内部类

    public InnerClass getInnerClass(String str){
        return new InnerClass(){
            {
                a = 2; //利用构造代码块能够达到为匿名内部类创建一个构造器的效果
            }
            public String getStr(){
                return str;
            }
        };
    }

    abstract class InnerClass {
        int a;
       abstract String getStr();
    }
    //也可以是接口
    /*interface InnerClass{
        String getStr();
    }*/
    public static void main(String[] args) {
        Demo demo = new Demo();
        InnerClass inner = demo.getInnerClass("zhou");
        System.out.println(inner.getStr());
        System.out.println(inner.a);
    }
}
上一篇下一篇

猜你喜欢

热点阅读