您好,登录后才能下订单哦!
这篇文章主要讲解了“Java有哪些内部类与内部接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java有哪些内部类与内部接口”吧!
一. 内部类
    内部类就是在类中定义类。我们可以把类中的类看做是类的一个属性,一个属性可以是static也可以是非static的。而内部类也可以定义在类的方法中,再加上匿名类,总共有5种内部类。 
    1. 静态内部类
静态内部类就是在class内部定义一个static的class,如下代码所示:
public class StaticInnerClass {
    static class Inner {
        void print() {
            log.info("Inner class is: " + this);
        }
    }
    public static void main(String[] args) {
        StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
        inner.print();
    }
}注意:静态内部类中因为static变量可以直接根据类名来存取,所以我们使用new StaticInnerClass.Inner()来实例化内部类。
    2.  非静态内部类
非静态内部类就是在class中定义的类也可以是非静态的,如下代码所示:
public class InnerClass {
     class Inner {
        void print() {
            log.info("Inner class is: " + this);
        }
    }
    public static void main(String[] args) {
        InnerClass.Inner inner = new InnerClass().new Inner();
        inner.print();
    }
}注意:非静态内部类要访问到类的变量,需要实例化外部内,然后再实例化内部类:new InnerClass().new Inner()。 (注:需要使用到两个new)
3.静态方法内部类
静态方法内部类就是在 静态方法中定义一个类,这个类其实就相当于方法中的变量,这个变量当然不能是static的。如下代码所示:
public class StaticMethodInnerClass {
    private static String x = "static x";
    public static void print() {
        class MyInner {
            public void printOuter() {
                log.info("x is " + x);
            }
        }
        MyInner i = new MyInner();
        i.printOuter();
    }
    public static void main(String[] args) {
        StaticMethodInnerClass.print();
    }
}注意:方法中的类,我们是无法在外部实例化的。
4. 非静态方法内部类
同样的非静态方法也可以定义内部类,如下代码所示:
public class MethodInnerClass {
    private  String x = "non static x";
    public  void print() {
        class MyInner {
            public void printOuter() {
                log.info("x is " + x);
            }
        }
        MyInner i = new MyInner();
        i.printOuter();
    }
    public static void main(String[] args) {
        new MethodInnerClass().print();
    }
}注意:这里需要先实例化外部类才可以继续调用。
5. 匿名内部类
匿名类是直接在需要的时候实例化的类。匿名类很常见,比如在构建SortedSet的时候,可以传入自定义的Comparator,我们可以用匿名类来实现,也可以直接使用lambda表达式。如下代码所示:
public class AnonymousClass {
    public static void main(String[] args) {
        SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
        SortedSet sortedSet2 = new ConcurrentSkipListSet((o1, o2) -> 0);
    }
}二. 内部接口
Inner Interface是指在接口中定义的接口。我们最常见的就是Map中的Entry了:
public interface Map<K, V> {
    interface Entry<K, V> {
        K getKey();
    }
}这里的内部接口一定是static的,因为接口是不能实例化的,所以为了访问到接口中的接口,必须定义为static。如果不指定,则默认就是static。
下面就来看看一个该内部接口的实现,如下代码所示:
public class MapImpl implements Map.Entry{
    @Override
    public Object getKey() {
        return 0;
    }
    @Override
    public Object getValue() {
        return null;
    }
    @Override
    public Object setValue(Object value) {
        return null;
    }
}感谢各位的阅读,以上就是“Java有哪些内部类与内部接口”的内容了,经过本文的学习后,相信大家对Java有哪些内部类与内部接口这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。