可以将一个类的定义放在另一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类。

主要作用

内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

内部类的方法可以直接访问外部类的所有数据,包括私有的数据。

内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。

内部类允许继承多个非接口类型。

内部类的类体中不可以声明类变量和类方法。

注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

详细分类

成员内部类

相当于所在外部类的一个成员变量,可以使用任意访问修饰符。内部类里可以直接访问外部类的方法和属性。如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。定义成员内部类后,必须使用外部类对象来创建内部类对象,即:

内部类 对象名 = 外部类对象.new 内部类();

所以成员内部类不能含有static的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的。

2. 静态内部类

静态内部类是 static 修饰的内部类,通常被称为嵌套类。不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问。如果外部类的静态成员与内部类的成员名称相同,可通过类名.静态成员访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名直接调用外部类的静态成员。嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。创建静态内部类的对象时,不需要外部类的对象,可以直接创建:

内部类 对象名 = new 内部类();

局部内部类

局部内部类,是指内部类定义在方法和作用域内。局部内部类也像别的类一样进行编译,但只是作用域不同而已。不能使用public或private访问说明符进行声明。局部类的方法只能引用定义为final的局部变量。

匿名内部类

当使用类创建对象时,程序允许把类体与对象的创建组合在一起。也就是说。类创建对象时,除了构造方法还有类体,此类体被认为是该类的一个子类去掉类声明后的类体,称为匿名类。匿名类就是一个子类,由于无名可用,不能用来声明对象,但是却可以直接用匿名类创建对象。

使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类。因为没有名字,不能重用,通常用来简化代码。使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。匿名内部类是不能加访问修饰符的。当所在的方法的形参需要在内部类里面使用时,该形参必须为final。要注意的是,new 匿名类,这个类是要先定义的。

尽管匿名类创建的对象没有经过类声明步骤,但匿名类对象的引用必须传递给一个匹配的参数,匿名类的主要用途就是向方法的参数传值。

//假设f(B x)是一个方法

void f(B x) {

//x调用B中的方法

}

//其中参数是B类对象,那么在调用方法f时可以向其参数x传递一个匿名对象,如

f (new B() {

//匿名类的类体

}

);

此外还有一种和接口相关的匿名类。类似的,Java 允许直接用接口名和一个类体创建一个匿名对象。如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要实现接口中的全部方法。

java 内部类传值_Java 封装(内部类)相关推荐

  1. java内部类写法_Java学习-内部类

    一.概念 内部类:在一个类的内部定义的一个类: 分类: 可以分为 成员内部类.局部内部类.匿名内部类和静态内部类: <Think in java>): 1.内部类可以用多个实例,每个实例都 ...

  2. java 封闭实例_java – 每个内部类都需要一个封闭的实例是真的吗?

    术语内部类通常被认为是指"需要封闭实例的嵌套类".然而,JLS规定如下: 07000 [-] Inner classes include local (§14.3), anonym ...

  3. java 类爆炸_Java 封装与类

    一.面向对象编程 面向对象编程三大特性:封装.继承和多态. 类是实现封装的手段,是面向对象编程的基本单元. 封装隐藏了类的内部实现细节,暴露给外界可控的操作,提高数据的完整性和安全性,提高模块的可重用 ...

  4. java 如何封装类_Java封装一个类怎么实现?

    封装 将某些东西包装在一起,然后以新的完整形式呈现出来: 隐藏属性.方法或实现细节的处理方式称为封装: 封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的安全性问题. 构建对象的方法 和数组相似 ...

  5. java swing 传值_java swing 窗体之间怎么传值?

    展开全部 传递一个对象过去32313133353236313431303231363533e58685e5aeb931333332623366:package org.somken; import j ...

  6. java 继承重写_java 封装 继承 重写 多态

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离.便于使用.提高重用性.提高安全性 封装原则: 将不需要对外提供的内容都隐藏起来.把属性都隐藏,提供公共方法对其访问. ...

  7. java 注解传值_java注解 - Mr.yang.localhost - 博客园

    注解使用 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang. ...

  8. java内部类规则_Java内部类规则

    Java内部类分为 成员内部类 和 局部内部类 一.成员内部类也即实名内部类 又分为 非静态实名内部类 和 静态实名内部类 1.实名内部类可以看做外部类的成员 , 因而可以具有 private .默认 ...

  9. java内部类 缺点_Java中的内部类及其优势

    Java中提供了定义内部类的选择,这一机制使得代码的书写更为方便和优雅(功能上相关的代码被紧密的组织在了一起). 需要注意的是,内部类和传统的组合(即将一个类的实体定义为另一个类的成员)是完全不同的, ...

最新文章

  1. MySql错误处理(三)- 错误处理的例子
  2. GDCM:gdcm::Sorter的测试程序
  3. 大道至简第六章读后感
  4. Oculus关于Internal Error:OVR53225466报错解决方法
  5. 字节转换,字符串与数字转换
  6. 【算法】—— str2int(正序和逆序)
  7. CMOS数字集成电路
  8. 可调稳压电源lm317实验报告_LM317可调稳压电源实训实验.doc
  9. 快速达成目标的12种方
  10. 绩效/加薪/年终奖,虐你如初恋
  11. c# 获取本地主机的ip地址
  12. ASP.NET MVC 上传文件方法
  13. Unity 事件中心
  14. view基础知识介绍(一)
  15. abp项目怎样发布到服务器,ABP框架的基础配置及依赖注入讲解
  16. ipados链接android,iPadOS怎么升级 iPadOS升级教程
  17. 9.FLINK Sink\API\自定义sink
  18. <script>alert(1)</script>怎么在页面显示且不出现功能
  19. 传输层 - TCP / UDP 协议详解
  20. 旧金山犯罪预测与可视化分析

热门文章

  1. MySQL(三)表记录的更新操作
  2. 数据库表在join时的三种方式
  3. Windows -- Qt不能进行调试 -- Unknown debugger type No Engine
  4. C++_类和对象_对象特性_静态成员函数---C++语言工作笔记047
  5. 大数据之-Hadoop之HDFS_HDFS的优缺点---大数据之hadoop工作笔记0049
  6. Linux工作笔记039---CentOS8.2卸载mysql
  7. SpringColoud学习笔记007---杂七杂八001--@Resource与@Autowired注解的区别
  8. android学习笔记---使用AsyncTask实现异步处理,内部使用线程加Handler
  9. findstr()与strfind()的区别
  10. jsp页面引用相关js,css文件路径问题