简介

一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口。

内部类

先讲内部类,内部类就是在类中定义的类。类中的类可以看做是类的一个属性,一个属性可以是static也可以是非static的。而内部类也可以定义在类的方法中,再加上匿名类,总共有5种内部类。

静态内部类

我们在class内部定义一个static的class,如下所示:

@Slf4j
public class StaticInnerClass {static class Inner {void print() {Home("Inner class is: " + this);}}public static void main(String[] args) {StaticInnerClass.Inner inner = new StaticInnerClass.Inner();inner.print();}
}

因为static变量可以直接根据类名来存取,所以我们使用new StaticInnerClass.Inner()来实例化内部类。

非静态内部类

class中定义的类也可以是非静态的,如下所示:

@Slf4j
public class InnerClass {class Inner {void print() {Home("Inner class is: " + this);}}public static void main(String[] args) {InnerClass.Inner inner = new InnerClass().new Inner();inner.print();}
}

要访问到类的变量,需要实例化外部内,然后再实例化内部类:new InnerClass().new Inner()。

注意这里我们需要使用到两个new。

静态方法内部类

我们可以在静态方法中定义一个类,这个类其实就相当于方法中的变量,这个变量当然不能是static的。我们看下面的例子:

@Slf4j
public class StaticMethodInnerClass {private static String x = "static x";public static void print() {class MyInner {public void printOuter() {Home("x is " + x);}}MyInner i = new MyInner();i.printOuter();}public static void main(String[] args) {StaticMethodInnerClass.print();}
}

方法中的类,我们是无法在外部实例化的。

非静态方法的内部类

同样的非静态方法也可以定义内部类:

@Slf4j
public class MethodInnerClass {private  String x = "non static x";public  void print() {class MyInner {public void printOuter() {Home("x is " + x);}}MyInner i = new MyInner();i.printOuter();}public static void main(String[] args) {new MethodInnerClass().print();}
}

注意,这里需要先实例化外部类才可以继续调用。

匿名类

最后一个,匿名类,直接在需要的时候实例化的类。匿名类我们遇到了很多次了,比如在构建SortedSet的时候,可以传入自定义的Comparator,我们可以用匿名类来实现,也可以直接使用lambda表达式。

public class AnonymousClass {public static void main(String[] args) {SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){@Overridepublic 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{@Overridepublic Object getKey() {return 0;}@Overridepublic Object getValue() {return null;}@Overridepublic Object setValue(Object value) {return null;}
}

总结

本文讲解了5个内部类的实现和一个内部接口的应用。大家只要把内部的类或者接口看成一个变量,就可以很好的理解上面的内容了。

实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定相关推荐

  1. 软件外部接口和内部接口_java中的内部类内部接口详解

    简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. ...

  2. 内部类(static内部类)的定义与使用、与子类、接口有关匿名类的定义与使用

    内部类的定义: 在一个类中定义另一个类,这样的类称为内部类,而包含内部类的类称为外嵌类,所以内部类也是外嵌类的一种成员: 内部类要点: 1.外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用 ...

  3. java 匿名接口实现_Java通过接口实现匿名类的实例代码

    package com.chase.test; /** * 通过接口实现匿名类的实例 * * @author chase * * @date 2013-10-18 下午04:28:17 * * @ve ...

  4. java 匿名类调用方法_Java匿名内部类使用与示例

    首先说为什么有匿名类(产生的使命) 两个原因 1.简化代码编写 某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类 2.在不同的包内的类内调用类的p ...

  5. 创建一个商品类Product类,在该类中定义3个属性id,name,price和重写toString()方法

    ·创建一个商品类Product类,在该类中定义3个属性id,name,price和重写toString()方法,分别实现setter()和getter()方法,创建一个测试类,调用Product类的构 ...

  6. a.创建动物类Animal,在该类中创建一个成员方法cry(), 输出“动物会发出叫声”,以及一个eat()方法,输出“动物需要食物”; b.创建一个Animal子类Dog类,在该类中重写父类的成员

    创建Zoo类作为主类,在main方法中分别创建各个类对象 ,并调用各自类的cry()方法, 创建Dog类的对象赋值给Animal类的对象,然后调用cry()和eat()方法. ** a.创建动物类An ...

  7. JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche

    JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...

  8. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  9. python中getitem_Python类中方法getitem和getattr详解

    1.getitem 方法 使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key'] 使用中括号对对象中的属性进行取值.赋值或者删除时,会自动触发对应的__getitem__. ...

最新文章

  1. 机器学习中的分类距离
  2. Qt中用QuaZip来压缩和解压缩文件
  3. 校园计算机故障解决方论文法,计算机故障与处理-计算机专业毕业论文.pdf
  4. 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID
  5. BZOJ-1923-外星千足虫-SDOI2010
  6. 关闭vue中的eslint校验
  7. 放射性核废料处理matlab模型,放射性废物处理问题
  8. 深度学习_pytorch中的forward()的使用与解释
  9. Angular 4.0 安装组件
  10. java NumberFormat数字格式化
  11. python游戏设计毕业论文_游戏设计游戏策划毕业论文
  12. 计算机1946考试试题,统考计算机考试试题及答案
  13. utility restore.php,PHP实现短网址还原实例代码
  14. 可见光成像通信(OOC)驱动频率区域的计算
  15. html字体铺盖颜色,买被子也是有讲究的?这几种颜色的被子,再好看都别往卧室放!...
  16. 打印机可以打印不能扫描怎么弄_打印机无法扫描怎么解决 打印机无法扫描相关介绍【解决方法】...
  17. ftp服务器文件服务器,ftp服务器和文件服务器的区别
  18. sql server查询不显示结果_仅凭网上查询结果显示邮件由行政机关签收,能证明行政机关一定收到了当事人的申请吗?...
  19. 因为电脑分区合并引发的磁盘动态无效问题
  20. Mysql 检查表是否存在并创建表,检查列是否存在并新增、修改、删除列

热门文章

  1. #3456. 城市规划(生成函数,多项式求逆)
  2. P3246 [HNOI2016]序列 莫队 + ST表 + 单调栈
  3. Gym - 100952H--H. Special Palindrome--dp整数划分(模板)
  4. CF961G Partitions
  5. Doing Homework HDU - 1074
  6. 2020牛客国庆集训派对day2 AKU NEGARAKU
  7. CodeForces - 1189B Number Circle
  8. CodeForces 1191A---Tokitsukaze and Enhancement
  9. 黑客(续) (压位高精+状压dp)
  10. YBTOJ:字符串匹配(KMP)