概述:

​ 定义在类的内部的类就叫做内部类

作用:

1、可以对资源进一步的封装,提升代码的安全性
2、间接的实现多继承

分类:

根据位置不同:

成员内部类
        普通成员内部类
        私有成员内部类
        静态成员内部类

局部内部类

根据名称划分:

有名内部类【所有位置划分的类都是有名内部类】

匿名内部类

如果内部类与外部类变量重名时使用this调用区分

例如:在外部类中有一个变量为num, 内部类中也有一个变量为num, 内部类的方法中也存在一个变量num,那么这个时候我们应该如何在内部类的方法中调用这三个变量呢?

分析

外部类名. this.变量名 (调用外部类同名变量)
this.变量名 (调用内部类中的同名变量)
直接变量名 (调用内部类方法中的变量)

代码示例

public class Outer {//外部类变量int num = 10;//内部类class Inner{ //内部类变量int num = 20;public void method() {//内部类方法中的变量int num = 30;System.out.println(num);  //  30System.out.println(this.num);  //20System.out.println(Outer.this.num);  //10}}
}测试类:
public class Demo {public static void main(String[] args) {//调用Inner内部类中的method方法//创建内部类对象Outer.Inner inner = new Outer().new Inner();//调用内部类方法inner.method();   //分别输出  30  20  10}
}

一、普通成员内部类

位置:

定义在类中方法外

定义格式:

class 内部类名 { 内部类的内容 }

使用注意:

1、 普通成员内部类只能定义非静态的资源

2、使用资源:

内部类的内部:可以使用所有的资源【外部类的资源和内部类自己的资源】

内部类的外部 ,外部类的内部(也就是本类中):

1、只能在外部类的普通方法中使用内部类的资源(在外部类的静态方法中无法使用)

2、通过创建内部类的对象使用资源

外部类的外部:

方式一:

1、创建外部类的对象

2、通过外部类的对象调用外部类中使用内部类资源的方法【前提:外部类有这个方法】,使用内部类资源

方式二:

1、直接创建内部类的对象

创建格式:

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

2、使用内部类的对象调用资源

代码示例
(注意:外部类中的inner.innerShow();和内部类中的show()不能同时运行,必须注释一个,因为他们在互相调用对方)


public class MemberClassDemo {int num1 = 10;static int num2 = 20;//外部类普通方法(可通过创建内部类对象来使用内部类资源)public void show() {System.out.println("我是外部类的普通方法");//外部类的内部,内部类的外部,使用内部类资源//System.out.println(num3);  //不能直接使用//创建内部类对象Inner inner = new Inner();System.out.println(inner.num3);  //可以通过对象方式访问内部类变量
//      inner.innerShow();   //通过内部类对象,可以访问内部类方法}// 外部类静态方法(无法使用内部类资源)public static void work() {System.out.println("我是外部类的静态方法");//外部类的内部,内部类的外部,使用内部类资源// System.out.println(num3); //不能直接使用// 创建内部类对象//Inner inner2 = new Inner(); //无法创建对象,所以无法使用内部类资源}//定义内部类class Inner{//定义内部类属性//属性int num3 = 30;//static int num4 = 40;   //内部类中不能定义静态变量//定义内部类的普通方法public void innerShow() {System.out.println("我是内部类");System.out.println("num1: " + num1 + "num2: " + num2 + "num3: " + num3);show();  //可以使用外部类非静态方法work();  //可以使用外部类静态方法}//内部类静态方法
//      public static void work() {    //内部类中不能有静态方法
//          System.out.println("我是内部类的静态方法");
//      }}
}测试类:
public class Test {public static void main(String[] args) {//外部类的外部,使用内部类资源//创建外部类对象MemberClassDemo memberClassDemo = new MemberClassDemo();memberClassDemo.show();  //通过外部类方法,访问内部类资源System.out.println("-------------");//方式二,通过创建内部类对象使用内部类资源MemberClassDemo.Inner inner = new MemberClassDemo().new Inner();System.out.println(inner.num3);  //使用内部类变量//使用内部类方法inner.innerShow();}}

二、私有成员内部类

概述:

被私有化的普通成员内部类就是私有成员内部类

位置:

类中方法外

定义格式:

private class 内部类名{内部类的内容}

使用注意:

​ 1、 私有成员内部类只能定义非静态的资源

​ 2、使用资源:

私有成员内部类的内部:可以使用所有的资源【外部类的资源和内部类自己的资源】

私有成员内部类的外部,外部类的内部(本类中,私有成员内部类外):

1、只能在外部类的普通方法中使用私有成员内部类的资源

2、创建私有成员内部类的对象使用资源

外部类的外部:

1、创建外部类的对象

​             2、外部类的对象去调用外部类中使用私有成员内部类资源的方法【前提:外部类中有这个方法】

外部类的外部无法创建私有成员内部类对象

代码示例

public class PrivateMemberClassDemo {//属性int num1 = 10;static int num2 = 20;//外部类普通方法(可通过创建私有成员内部类对象来使用私有成员内部类资源)public void show() {System.out.println("我是外部类的普通方法");//外部类的内部,内部类的外部,使用私有成员内部类资源
//      System.out.println(num3);  //不能直接使用//创建私有成员内部类对象Inner inner = new Inner();System.out.println(inner.num3);  //可以通过对象方式访问私有成员内部类变量inner.innerShow();   //通过内部类对象,可以访问私有成员内部类方法}// 外部类静态方法(无法使用内部类资源)public static void work() {System.out.println("我是外部类的静态方法");//外部类的内部,内部类的外部,使用内部类资源
//       System.out.println(num3); //不能直接使用// 创建内部类对象
//      Inner inner2 = new Inner(); //无法创建对象,所以无法使用内部类资源}//定义私有成员内部类private class Inner{//定义私有成员内部类属性//属性int num3 = 30;
//      static int num4 = 40;   //私有成员内部类中不能定义静态变量//定义私有成员内部类的普通方法public void innerShow() {System.out.println("我是私有成员内部类");System.out.println("num1: " + num1 + "num2: " + num2 + "num3: " + num3);
//          show();  //可以使用外部类非静态方法work();  //可以使用外部类静态方法}//私有成员内部类静态方法
//      public static void work() {    //私有成员内部类中不能有静态方法
//          System.out.println("我是私有成员内部类的静态方法");
//      }}}测试类:
public class TestPrivateMemberClass {public static void main(String[] args) {//外部类的外部,使用私有成员内部类资源// 创建外部类对象PrivateMemberClassDemo privateMemberClassDemo = new PrivateMemberClassDemo();privateMemberClassDemo.show(); // 通过外部类方法,访问私有成员内部类资源System.out.println("-------------");// 方式二,通过创建私有成员内部类对象使用私有成员内部类资源//PrivateMemberClassDemo.Inner inner = new PrivateMemberClassDemo().new Inner();  //无法创建对象}}

三、静态成员内部类

概述:

被static修饰的普通成员内部类就是静态成员内部类

位置:

类中方法外

定义格式:

static class 内部类名{内部类的内容}

使用注意:

​ 1、 静态成员内部类可以定义所有的资源

​ 2、使用资源:

静态成员内部类的内部

可以使用外部类的静态资源,可以使用自己的所有资源

静态成员内部类的外部,外部类的内部

​            在外部类的方法中使用

静态资源:

​                         是使用内部类名直接使用

​                  非静态资源:

创建内部类的对象使用资源

外部类的外部

方式一

普通方法:

​                              1、创建外部类的对象

​                              2、外部类的对象调用外部类中使用内部类资源的方法【前提:外部类有这个方法】

静态方法:

外部类名调用静态方法【前提:外部类有这个方法】

​                   方式二

1、直接创建静态成员内部类的对象

创建格式:

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

2、使用内部类的对象调用非静态资源

3、静态资源:

外部类名.内部类名.静态资源名称

代码示例:

public class StaticMemberClassDemo {int num1 = 10;static int num2 = 20;//外部类普通方法public void show() {System.out.println("我是外部类的普通方法");//无法直接使用静态成员内部类中的变量System.out.println("num1: " + num1 + "num2: " + num2 + "num3: " /* + num3 */ + "num4: " /* + num4 */);//创建静态成员内部类对象Inner inner = new Inner();System.out.println(inner.num3); // 可以通过对象方式访问内部类变量System.out.println(inner.num4); inner.innerShow();   //通过静态成员内部类对象,可以访问静态成员内部类方法Inner.work();  //静态方法可以直接静态成员内部类的类名调用}// 外部类静态方法public static void work() {System.out.println("我是外部类的静态方法");//外部类的内部,内部类的外部,使用内部类资源
//       System.out.println(num3); //不能直接使用静态成员内部类的变量// 创建内部类对象Inner inner2 = new Inner(); System.out.println(inner2.num3); // 可以通过对象方式访问内部类变量System.out.println(inner2.num4); inner2.innerShow();   //通过静态成员内部类对象,可以访问静态成员内部类方法Inner.work();  //静态方法可以直接静态成员内部类的类名调用}//定义静态成员内部类static class Inner{//定义静态成员内部类属性//属性int num3 = 30;static int num4 = 40;   //静态成员内部类中可以定义静态变量//定义静态成员内部类的普通方法public void innerShow() {System.out.println("我是静态成员内部类");//无法访问外部非静态资源System.out.println("num1: " + /* num1 + */ "num2: " + num2 + "num3: " + num3 + "num4: " + num4);
//          show();  //不能使用外部类非静态方法work();  //可以使用外部类静态方法}//内部类静态方法public static void work() {   System.out.println("我是静态成员内部类的静态方法");}}
}测试类:
public class TestStaticMemberClass {public static void main(String[] args) {//方式一//外部类的外部,使用静态成员内部类资源StaticMemberClassDemo st = new StaticMemberClassDemo();st.show();   //通过创建外部类对象,访问内部资源//通过外部类名调用静态方法System.out.println("-------------");StaticMemberClassDemo.work();//方式二//直接创建静态成员内部类对象StaticMemberClassDemo.Inner inner = new StaticMemberClassDemo.Inner();//非静态资源System.out.println(inner.num3);inner.innerShow();//静态资源,不提倡对象访问, 建议类名访问System.out.println(StaticMemberClassDemo.Inner.num4);StaticMemberClassDemo.Inner.work();  }
}

四、局部内部类

位置:

方法的方法体中

执行时机:

​ 所在的方法被调用的时候被加载使用

格式:

​ class 内部类名{内部类的内容}

使用:

​ 资源的定义:

局部内部类只能定义非静态资源

​ 资源的使用:

普通方法中的内部类

内部类内部:

可以使用所有的资源

内部类的外部所在方法中:

1、创建内部类的对象

​                  2、使用对象调用内部类的资源

外部类内部内部类所在方法的外部:

1、定义普通方法【注意:看内部类所在的方法进行定义】

2、方法中调用内部类所在的方法

3、内部类所在的方法必须有使用内部类资源的相关代码

外部类的外部

1、创建外部类的对象【针对普通方法】

2、外部类对象调用内部类所在的普通方法

​                         【内部类所在的方法必须有使用内部类资源的相关代码】

静态方法中的内部类

内部类内部:

不能使用外部类的非静态资源

内部类的外部所在方法中:

1、创建内部类的对象

2、使用对象调用内部类的资源

外部类内部内部类所在方法的外部:

​                  1、定义方法【注意:看内部类所在的方法进行定义】

2、方法中调用内部类所在的方法

3、内部类所在的方法必须有使用内部类资源的相关代码

外部类的外部

1、外部类类名调用内部类所在的静态方法

【内部类所在的方法必须有使用内部类资源的相关代码】

代码示例

public class MemberClassDemo {int num1 = 10; //外部类变量static int num2 = 20; //外部类静态变量//外部类普通方法public void work() {System.out.println("我是外部类中的普通方法");//访问内部类资源
//      System.out.println(num3); //无法访问局部内部类所在的方法的变量
//      System.out.println(num5); //无法直接访问内部资源//通过调用局部内部类所在的方法,使用局部内部类的资源show();System.out.println("================");//调用静态局部内部类staticShow();}//外部类静态方法public static void staticWork() {System.out.println("我是外部类中的静态方法");//无法调用在非静态中的局部内部类//show();System.out.println("================");// 调用静态局部内部类staticShow();}public void show() {int num3 = 30; //方法内的变量//static int num4 = 40;   //方法内无法定义静态变量//普通方法中的局部内部类class Inner {int num5 = 50; //内部类的变量//static int num6 = 60; //内部类中无法定义静态变量//内部类普通方法public void workNei() {System.out.println("我是内部类的普通方法");//使用外部资源System.out.println(num1); //外部类普通变量System.out.println(num2); //外部类静态变量System.out.println(num3); //方法中普通变量System.out.println(num5); //内部类中普通变量
//              work(); //可以使用外部类普通方法 , 避免程序报错这里先注释//staticWork(); //外部类静态方法, 避免程序报错这里先注释}//内部类静态方法 ,(局部内部类中无法创建内部类对象)
//          public static void staticWork() {}}//内部类的外部,所在的方法中创建对象Inner inner = new Inner();System.out.println("局部内部类调用的内部类变量: " + inner.num5);  //使用内部类普通变量inner.workNei(); //使用内部类普通方法}public static void staticShow() {System.out.println("这是静态方法中的局部内部类");int num3 = 30; //方法内的变量
//      static int num4 = 40;   //方法内无法定义静态变量//普通方法中的局部内部类class Inner2 {int num5 = 50; //内部类的变量
//          static int num6 = 60; //内部类中无法定义静态变量//内部类普通方法public void workNei2() {System.out.println("我是内部类的普通方法");//使用外部资源//System.out.println(num1); //无法使用外部类普通变量System.out.println(num2); //外部类静态变量System.out.println(num3); //方法中普通变量System.out.println(num5); //内部类中普通变量
//              work(); //无法使用外部类普通方法 //staticWork(); //可以使用外部类静态方法  , 避免程序报错这里先注释}//内部类静态方法 ,(局部内部类中无法创建内部类对象)
//          public static void staticWork() {}}//内部类的外部,所在的方法中创建对象Inner2 inner2 = new Inner2();System.out.println("局部内部类调用的内部类变量: " + inner2.num5);  //使用内部类普通变量inner2.workNei2(); //使用内部类普通方法}}测试类:
public class Test {public static void main(String[] args) {//创建外部类对象MemberClassDemo memberClassDemo = new MemberClassDemo();//调用外部类普通对象,在外部类方法中去使用局部内部类资源memberClassDemo.work();//调用外部类的静态方法访问局部内部类资源MemberClassDemo.staticWork();System.out.println("=====");//静态方法中的局部内部类//直接外部类类名调用内部类所在的静态方法MemberClassDemo.staticShow();}
}

五、匿名内部类

概述:

没有名字的内部类

格式:

 new 父类或父接口 (实参) {​      重写相关的方法​    }

本质:

​ 子类或实现类的对象

使用前提:

​ 必须有继承和实现关系

使用场景:

​ 有一个父类,想要使用子类对象来调用相关资源,子类没有存在,又要创建子类对象这个时候就可以使用匿名内部类

代码示例

接口:
public interface interfaceA {void show();void work();}测试类:
public class TestinterfaceA {public static void main(String[] args) {//通过匿名内部类使用接口中的方法new interfaceA() {@Overridepublic void work() {System.out.println("我是匿名内部类中的work方法");}@Overridepublic void show() {}}.work();  //一次只能调用一个方法new interfaceA() {@Overridepublic void work() {}@Overridepublic void show() {System.out.println("我是匿名内部类中的show方法");}}.show();}}

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.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  10. 如何新建java内部类_java内部类-1(内部类的定义)

    小胖从官网出发,研究下为什么我们需要些内部类,内部类的区别和联系. 思考三个问题: (1)为什么需要内部类?静态内部类和非静态内部类有什么区别: (2)为什么内部类可以无条件访问外部类成员: (3)为 ...

最新文章

  1. Linux 运维工程师的十个基本技能点
  2. 中心频率为150kHz的选频放大检波电路补充测试
  3. python需要学多久才能找到工作-为什么Python适合初学者,一般要学习多久
  4. 发那科2021参数_三菱发那科常用参数对照
  5. TortoiseSVN使用帮助和下载
  6. 联想服务器st系列,联想ThinkSystem ST50评测 一款超值的入门级服务器
  7. 从科大讯飞跳槽到腾讯被判赔 1200 万;华为多款机型将取消充电器;苹果春季发布会定档4月21日|极客头条...
  8. 【Java并发】Runnable、Callable、Future、FutureTask
  9. 异步promise、Async/await介绍
  10. 基于android的家庭财务通 .apk,毕业设计(论文)-基于Android的家庭财务管家的设计与实现.doc...
  11. 竞品分析报告模板----笔记2
  12. linux使用定时器回调函数示例
  13. 智慧路灯杆网关_路灯杆控制网关_路灯杆通信网关
  14. uni-app第三方插件 根据银行卡卡号查询银行类型和卡类型
  15. 常用计算机 启动bios,电脑进入BIOS的方法集合
  16. 修改华为路由器lan端口
  17. Adobe Acrobat XI经验总结(更于2022.5.11)
  18. 经典重写alert方法
  19. 求助,耳机插上后识别不到,扬声器会跟着耳机一块有声
  20. (01)ORB-SLAM2源码无死角解析-(62) BA优化(g2o)→追踪线程:Optimizer::PoseOptimization→仅位姿优化

热门文章

  1. 静态代码块与静态函数的执行顺序
  2. python运行错误总结(按字母序)
  3. inrange函数_掌握这些数学函数,你会在算法效率的分析时经常用到
  4. CCF201403-1 相反数
  5. Java-Hashmap
  6. 何谓 SQL 注入,这个漫画告诉你
  7. 这两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍
  8. 详述WebLogic反序列化远程命令执行漏洞的处理过程,云和恩墨技术通讯精选
  9. Oracle 19c 新特性:自动化索引 Automatic indexing 实践
  10. 快来一起玩转LiteOS组件:Curl