在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类

内部类和外层封装它的类之间存在逻辑上的所属关系

Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class的名字不能与包含它的类名相同;

Inner class可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量;

内部类跟方法和成员变量一样,都是类的一个成员。所以像final,abstract,private,static,protected可以用来修饰内部类(比如外部类不能声明为private)。内部类享有和内部成员同样的待遇。

为什么使用内部类?

如果这个类没有定义在外部的必要,即使此类仅供外部类的方法来调用,而不会被其他外部类调用。

packagecom.atguigu.java;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;/*** 内部类:

* 1. 在类的内部定义的类成为内部类

* 2. 内部类相当于类的一个成员, 可以修饰类的成员的 private, static, final, abstract 都可以修饰内部类

* 3. 声明、使用内部类的实例.

* 3.1 非静态内部类的创建, 先创建外部类的实例, 再通过 外部类名.new 创建内部类的实例.

* OuterClass oc = new OuterClass();

* OuterClass.InnerClass in = oc.new InnerClass();

*

* 3.2 静态内部类的创建: 不再需要外部类的实例.

* OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass();

*

* 4. 内部类引用外部类的成员:

*

* 5. ** 匿名内部类对象: 使用某一个接口通常是 先创建接口的实现类, 再创建其实现类的对象.

* 还可以, 直接创建其实现类对象.

*

* InvocationHandler invocationHandler = new InvocationHandler() {

* @Override

* public Object invoke(Object proxy, Method method, Object[] args)

* throws Throwable {

* return null;

* }

* };

*

**/

public classOuterClass {intage;static classStaticInnerClass{voidtest(){//System.out.println(age);

}

}static String name = "-1";//内部类

classInnerClass{

String name= "0";public voidtest(){

String name= "1";

System.out.println(name);//1

System.out.println(this.name); //0

System.out.println(OuterClass.this.name); //-1

}

}

}

packagecom.atguigu.java;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;public classTestInnerClass {public static voidmain(String[] args) {

OuterClass.StaticInnerClass sic= newOuterClass.StaticInnerClass();

OuterClass oc= newOuterClass();

OuterClass.InnerClass in= oc.newInnerClass();

in.test();

Proxy.newProxyInstance(null, null, newInvocationHandler() {

@OverridepublicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable {//TODO Auto-generated method stub

return null;

}

});

InvocationHandler invocationHandler= newInvocationHandler() {

@OverridepublicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable {return null;

}

};

}

}

匿名内部类

使用匿名内部类课使代码更加简洁、紧凑,模块化程度更高。内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。

就是匿名内部类的两种实现方式:

第一种,继承一个类,重写其方法;

第二种,实现一个接口(可以是多个),实现其方法。下面通过代码来说明:

不使用内部类

abstract classPerson {public abstract voideat();

}classChild extends Person {public voideat() {

System.out.println("eat something");

}

}public classDemo {public static voidmain(String[] args) {

Person p= newChild();

p.eat();

}

}

运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类

abstract classPerson {public abstract voideat();

}public classDemo {public static voidmain(String[] args) {

Person p= newPerson() {public voideat() {

System.out.println("eat something");

}

};

p.eat();

}

}

运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。匿名内部类就是重写父类或接口的方法。

匿名内部类是没有名字的,所以我们没办法获得其类型,而只能把它当作超类或接口类型来使用。

java设置一个内部类child_java的内部类及匿名内部类相关推荐

  1. java new 一个内部类_java内部类

    java内部类的几种类型:成员内部类,静态内部类,方法内部类,匿名内部类. 成员内部类:成员内部类是类内部的非静态类.成员内部类不能定义静态方法和变量(final修饰的除外).这是因为成员内部类是非静 ...

  2. java内部类写法_java内部类怎么写

    一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 一.内部类基础 在Java中,可以将一个类定义在另一个类里面 ...

  3. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...

    1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...

  4. Java编程思想 第十章:内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类 内部类远不止如此,它就像是一个外围类:并能与之通信:而且你用内部类写出来的代码更加优雅清晰. 1. 创建内部类 将一个类定义在另一个类的内部,这 ...

  5. java提高篇(八)----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  6. java handler的用法_Handler和内部类的正确用法

    PS:本文摘抄自<Android高级进阶>,仅供学习使用 Android代码中涉及线程间通信的地方经常会使用Handler,典型的代码结构如下. 1 2 3 4 5 6 7 8 9 pub ...

  7. 在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象

    在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象   我们知道,在 Java 中,创建一个内部类对象之前,需要它的一个外部类对象.这是因为内部类可能使用外部类的数据.   在内部类中 ...

  8. java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)

    内部类 package AA;public class类 {int de=123; StringBuffer dee=newStringBuffer();public class成员内部类{publi ...

  9. java提高篇之详解内部类

    转载自 java提高篇之详解内部类 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无 ...

  10. java中常见的几种内部类,你会几个?(未完)

    点击上方蓝色关注我们! 大家好,我是雄雄,今天给大家介绍的是java中的几种内部类. java中常见的几个内部类,你会几个?我会四个! 在看每个新知识点时,我们不禁有这样或者那样的疑问,比如它是什么? ...

最新文章

  1. Flutter Hero 实现组件跨界面跳动效果
  2. LeetCode 454 4Sum II(哈希法)
  3. 1.0 深度学习回顾与PyTorch简介 - PyTorch学习笔记
  4. byte转换int时为何与0xff进行与运算
  5. 给页面字段中添加一个按钮,点击按钮实现弹窗效果
  6. datetimepicker控件怎么改变hover颜色_VBA入门课程,ActiveX控件系列知识,复合框的属性与常见VBA代码...
  7. django3.2.8使用simpleui注意事项
  8. [机器学习笔记] Note2--单变量线性回归
  9. JAR——pinyin4j-2.5.0
  10. UE4手册中文翻译速查表
  11. 有关计算机编程论文,有关计算机程序的论文范文
  12. 制作u盘winpe启动盘_u盘启动盘制作工具软件哪个好?
  13. Java 他们每人单独过桥的时间是_java实现 n人过桥问题
  14. 自己封装一个v-model指令
  15. 单片机串口连接电脑,USB转TTL线的使用
  16. Python环境搭建系列
  17. LogExplore简介
  18. (java)密码加密。某系统的数字密码,比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
  19. QGis二次开发基础 -- 构建图层管理器
  20. mysql中设计suk表_电商项目-商品表(spu)、规格表(sku)设计

热门文章

  1. 超声广义相干因子( Generalized Coherence Factor,GCF)波束合成仿真
  2. 掌握企业邮箱3个好用的技巧,商务沟通安全又轻松!
  3. melp算法matlab,svpwm过调制算法研究与实现 [MELP声码器的算法研究及实现]
  4. VsCode使用笔记【2】Ubuntu+.deb文件安装VScode
  5. 如何申请163邮箱账号
  6. Index.ANALYZED in lucene4 is deprecated
  7. 计算机硬盘格式化与储存原理
  8. ZZULIOJ:1044: 不及格率
  9. 参考文献格式(含文献标识码说明)
  10. Docker中文文档 分享