一、什么是内部类?

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。

内部类主要有一下几种:成员内部类、局部内部类、静态内部类、匿名内部类

二、内部类的共性

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。

(2)、内部类不能用普通的方式访问。

(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

(4)、外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问

三、为什么需要内部类?

其主要原因有以下几点:

1、内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据

2、内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

3、可以实现多重继承

4、当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷

使用内部类最吸引人的原因是:

每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。

四、内部类分类

1、成员内部类

即在一个类中直接定义的内部类,成员内部类与普通类的成员没什么区别,可以与普通成员一样进行修饰和限制。成员内部类不能含有static的变量和方法。

package com.test;public class Outer {private static int number = 100;private int j = 20;private String name = "Java";public static void outer_funOne(){System.out.println("外部类Outer的静态方法:outer_funOne");}public void outer_funTwo(){System.out.println("外部类的普通方法:outer_funTwo");}//成员内部类,可以访问外部类的所有成员class Demo{//内部类不允许定义静态变量//static int demo_i = 100;int j =50; //内部类和外部类的实例变量可以共存//成员内部类中的方法定义public void demo_funOne(){//内部类中访问内部类自己的变量直接用变量名//也可以用  this.jSystem.out.println(j);//内部类中访问外部类的成员变量语法:外部类类名.this.变量名System.out.println("内部类访问外部类变量:"+Outer.this.j);//如果内部类中没有与外部类中有相同的变量,则可以直接用变量名使用System.out.println(name);//内部类调用外部类方法outer_funOne();  //静态方法outer_funTwo();  //非静态方法}}public static void outer_funThree(){//外部类静态方法访问成员内部类// 1、建立外部类对象Outer out = new Outer();//  2、根据外部类建立内部类对象Demo demo = out.new Demo();// 访问内部类方法demo.demo_funOne();//访问内部类字段System.out.println("内部类成员字段:"+demo.j);}public static void main(String[] args) {//调用内部类的方法// 1、创建外部类对象Outer out = new Outer();// 2、通过外部类对象创建内部类对象Outer.Demo demo = out.new Demo();// 1、2步简写// Outer.Demo demo1 = new Outer().new Demo();//方法调用demo.demo_funOne();}}

2、局部内部类

在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。

需要注意的是:

(1)、局部内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

(2)、局部内部类对象不能使用该内部类所在方法的非final局部变量。

package com.test;public class Outer {private static int number = 100;private int j = 20;private String name = "Java";//定义外部类方法public void outer_funOne(int k){final int number = 100;int j = 50;//方法内部的类(局部内部类)class Demo{public Demo(int k){demo_funOne(k);}int number = 300; //可以定义与外部类同名的变量// static int j = 10;  //不可以定义静态变量//内部类的方法public void demo_funOne(int k){System.out.println("内部类方法:demo_funOne");//访问外部类的变量,如果没有与内部类同名的变量,则可直接用变量名System.out.println(name);//访问外部类与内部类同名的变量System.out.println(Outer.this.number);System.out.println("内部类方法传入的参数是:"+k);}}new Demo(k);}public static void main(String[] args) {//访问内部类必须要先有外部类对象Outer out = new Outer();out.outer_funOne(11);}}

3、静态内部类(嵌套类)

如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:

1、 要创建嵌套类的对象,并不需要其外围类的对象。

​ 2、不能从嵌套类的对象中访问非静态的外围类对象。

package com.test;public class Outer {private static int number = 100;private int j = 20;private String name = "Java";public static void outer_funOne(){System.out.println("外部类静态方法:outer_funOne");}public void outer_funTwo(){}//静态内部类可以用public、protected、private修饰//静态内部类可以定义静态类或非静态内部类private static class Demo{static int j = 100;String name = "C#";//静态内部类里的静态方法static void demo_funOne(){//静态内部类只能访问外部类的静态成员(静态变量、静态方法)System.out.println("静态内部类访问外部类静态变量:"+number);outer_funOne();//访问外部类静态方法}//静态内部类非静态方法void demo_funTwo(){}}public void outer_funThree(){//外部类访问内部类静态成员:内部类.静态成员System.out.println(Demo.j);//访问静态方法Demo.demo_funOne();//访问静态内部类的非静态成员,实例化内部类即可Demo demo = new Demo();//访问非静态变量System.out.println(demo.name);//访问非静态方法demo.demo_funTwo();}public static void main(String[] args) {new Outer().outer_funThree();}}

4、匿名内部类

匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

1、只用到类的一个实例。

2、类在定义后马上用到。

3、类非常小(SUN推荐是在4行代码以下)

4、给类命名并不会导致你的代码更容易被理解。

在使用匿名内部类时,要记住以下几个原则:

1、 匿名内部类不能有构造方法。

2、 匿名内部类不能定义任何静态成员、方法和类。

3、 匿名内部类不能是public,protected,private,static。

4、 只能创建匿名内部类的一个实例。

5、 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

6、 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
  
如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

何为JAVA内部类?相关推荐

  1. 看到如此详细的Java内部类,我泪目了

    Java内部类 介绍 定义 成员内部类 语法格式 使用说明 代码示例 局部内部类 语法格式 使用说明 代码示例 匿名内部类 语法格式 使用说明 代码示例 静态内部类 语法格式 使用说明 代码示例 介绍 ...

  2. Java内部类作用全解

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  3. netBeans调试时不进入java内部类(jdk源码)的方法 转载

    初次使用netbeans的调试功能时,会发现调试中,进入了java的内部类运行,具体情况,如下图所示: 对于我这样的一个新手,完全弄不懂啊. 后来我去论坛问了,同时自己研究,发现经过以下设置,就可以跳 ...

  4. Java内部类(Inner Class)小记

    一.引子 看到Trinea的博文Junit单测代码中java序列化失败的解决,让我想到Java内部类的一些小Gocha,初学Java时很迷惑.这里记录一下. 就以Trinea的博文中的序列化失败的例子 ...

  5. Java内部类简介.

    一, 什么是内部类 Java中所谓内部类, 就是定义在另1个类内的类. 例如: class A{int a;class B{int b;} } 上面类B就是类A的一个内部类. 但是下面的写法, B只是 ...

  6. java内部类文件,Java内部类学习

    Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...

  7. 在Java内部类中使用外部类的成员方法以及成员变量

    http://blog.csdn.net/zhongyili_sohu/article/details/8975947 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止 ...

  8. Java内部类引用外部类中的局部变量为何必须是final问题解析

    Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...

  9. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

最新文章

  1. 页面上表格金额统计汇总
  2. 顶会抄顶会?SIGIR论文作者回应质疑,ACM主席已介入
  3. setTimeout和setInterval实现定时器的区别
  4. AlphaBlend 使用方法
  5. 用Backbone.js创建一个联系人管理系统(一)
  6. matlab 边界连续,matlab的边界问题
  7. 认识 MySQL 和 Redis 的数据一致性问题
  8. k8s中使用MySQL共享存储_Kubernetes创建挂载共享存储的容器
  9. js修改mysql数据库数据_Node.js操作mysql数据库增删改查
  10. Retroifit原理
  11. C#基础(四)--值类型和引用类型,栈和堆的含义
  12. win7系统修改启动项
  13. go build 无文件_Go学习_30_Golang代码性能分析工具
  14. 晚上运动对身体好吗?
  15. nginx并发性能测试
  16. Java语言基础--枚举
  17. java高校贫困生助学贷款系统ssm框架毕业设计
  18. 【MySQL】不建议使用分区表
  19. kaggle上面的E-Commerce Data数据集练习(数据处理)
  20. 网页引用Font Awesome图标

热门文章

  1. 毕业相关——电网项目
  2. javaSE<String和StringBuffer和StringBuider>day11
  3. 用c语言实现扫雷小游戏。
  4. 什么是JMS(Java Message Service消息服务)
  5. python 全栈开发,Day43(python全栈11期月考题)
  6. 电路实验一阶电路误差分析_常见滤波电路分析技巧
  7. 一个普通高校学生入门C/C++入门的第一篇博客1.0.1
  8. goahead解析(一)---------route.txt
  9. 503 service unavailable 错误怎么解决?503 service unavailable 错误的解决方法。
  10. win7 64蓝牙耳机连接问题