java 接口 内部接口,Java内部类,内部接口详解

本文详细介绍了Java中的内部类概念,包括静态内部类、非静态内部类、静态方法内部类、非静态方法内部类和匿名内部类等五种类型,并通过示例代码进行了解释。此外,还介绍了内部接口的概念及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

通常情况下,我们创建类或者是接口都是一个类或接口对应一个文件,但是学习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 {

interface Entry {

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;

}

}

总结

相信大家对与内部类和内部接口有了一个全面的认识。其实我们把内部的类或者接口看成一个变量,就可以很好的理解上面的内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值