一*相关概念:

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。内部类也是封装的一种体现。

1.1.内部类:

将一个类定义在另一个类的内部。

1.2.外部类:

将一个类定义在一个方法的内部。

例子1:内部类和外部类的创建

public class OutClass{//外部类class InnerClass{//内部类}}public class A{}class B{}
//A和B是两个独立的类,彼此间没有关系

注意:

1.定义在class类名{}花括号外部,即使在一个文件里,都不能称为内部类。

2.内部类和外部类共用同一个Java源文件,但是经过编译之后,内部类会形成单独的字码文件。

二*内部类的分类:

2.1.实例内部类:(成员内部类或者普通内部类)未被static修饰。

2.2.静态内部类:(成员内部类或者普通内部类)被static修饰。

2.3.局部内部类:方法中可以定义的内部类。

例子2:相关内部类的创建

public class OutClass{public class InnerClass1{//未被static修饰,实例内部类}static class InnerClass2{//被static修饰,静态内部类}public void method(){class InnerClass5{//局部内部类:方法中定义的内部类,几乎不用}}
}

****在外部类中,内部类定义位置和外部类成员所处的位置相同,因此称为成员内部类。

例子3:内部类和外部类成员的访问:

public class Demo1 {//外部类private int a;static int b;int c;public void methodA(){a=1;System.out.println(a);}public static void methodB(){System.out.println(b);}class Demo2{//实例内部类:未被static修饰int c;//与外部类同名的变量cpublic void methodInnerA(){//在实例内部类成员方法中可以直接访问外部类中:任意访问限定                                                                                                                            符修饰的成员a=2;b=3;c=4;methodA();methodB();System.out.println(c);//如果外部类和实例内部类中具有相同名称成员时,优先访问的是内 部类自己的Demo1.this.c=5;System.out.println(Demo1.this.c);//如果要访问外部类同名成员,必须:外部类名.this. 同名成员名字}}public static void main(String[] args) {//外部类:对象创建 和 成员访问System.out.println("==========外部类访问==========");Demo1 demo1=new Demo1();//外部类对象创建System.out.println(demo1.a);System.out.println(Demo1.b);System.out.println(demo1.c);demo1.methodA();Demo1.methodB();System.out.println("=========实例内部类访问=========");//实例内部类对象必须在先有外部类对象的前提下才能创建//要访问实例内部类中的成员,必须要创建实例内部类对象//普通内部类定义和外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类名来定义Demo1.Demo2 demo2=new Demo1().new Demo2();//方法一:创建实例内部类对象demo2Demo1.Demo2 demo3=demo1.new Demo2();//方法二:创建实例内部类对象demo3demo2.methodInnerA();System.out.println(demo3.c);}
}

注意事项:

1.外部类中的任何成员都可以在实例内部类的普通成员方法(非静态成员方法)中被直接访问。

2.实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。

3.在实例内部类方法中访问同名成员时,优先访问自己的,如果要访问外部类同名的成员,则必须:外部类名.this.同名成员名 来访问。

4.实例内部类对象必须在有外部类对象前提下才能创建。

5.实例内部类的非静态方法中包含了一个指向外部类的对象引用。

6.外部类中,不能直接访问内部类中的成员,如果要访问必须要先创立外部类对象。

三*静态内部类:

被static修饰的内部成员类

例子4:静态内部类的访问

public class OutClass {private int a;static int b;public final int c=3;public void methodA(){a=1;System.out.println(a);}public static void methodB(){b=2;System.out.println(b);}static class InnerClass{private int d;public void methodInner(){d=1;System.out.println(d);}public  void  methodInnerA(){// 在静态内部类中只能访问外部类的静态成员,不能访问非静态成员//a=2;报错,不是内部类成员变量,且在外部类中也没有static修饰//System.out.println(c);d=4;//内部类成员变量System.out.println(4);b=3;System.out.println(b);//methodA();报错,不是内部类成员方法,且在外部类中也没有static修饰methodB();methodInner();//内部类成员方法}}public static void main(String[] args) {//静态内部类对象创建&成员访问//new 外部类名.内部类名();OutClass.InnerClass innerClass=new OutClass.InnerClass();innerClass.methodInnerA();//会报错,因为此时InnerClass是内部类,不需要创建外部类对象来访问内部类成员//OutClass.InnerClass innerClass1=new OutClass().new InnerClass();}
}

注意事项:

1.在静态内部类中只能访问外部类的静态成员。

2.创建静态内部类对象时,不需要先创建外部类对象。

四*局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。

注意事项:

1.局部类只能在所定义的方法内部使用

2.不能被public、static等修饰符修饰

3.编译器也有自己独立的字节码文件,命名格式:外部类名$内部类名.class

4.基本不会使用

五*匿名内部类

后期接口时补充

内部类和外部类的详解相关推荐

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

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

  2. java的内部类和外部类_java内部类 和外部类的区别

    下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.prote ...

  3. Python内部类,内部类调用外部类属性,方法

    一 Python中内部类 典型定义: class MyOuter:age=18def __init__(self,name):self.name=nameclass MyInner:def __ini ...

  4. java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?

    对普通类(没有内部类的类)来说,内部类和外部类都与他无关:对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类.所以,要回答这个问题,只需要讲解内部类是什么:Jav ...

  5. 反编译中内部类调用外部类成员问题

    .access$ 反编译偶内部类调用外部类成员问题 很简单的一个测试类源码: public class testOuter { private int a; private int b; privat ...

  6. 匿名内部类 可以访问外部类_Java 内部类与外部类的互访使用小结

    内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员. 内部类访问外部类 里面的可以自由访问外面的,规则和static一样.(访问非静态时必须先创建对象) 具体如下: 非静态内部类的非静态方法 ...

  7. JAVA基础系列:内部类获取外部类的成员变量

    内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer {public String name = "outer";cla ...

  8. 内部类与外部类之间的访问

    目           录 1.内部类与外部类 2.内部类的特点:内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员. 3.内部类与外部类之间的访问 在测试类中调用成员内部类中的方法: ...

  9. 外键约束详解及术语释疑

    外键约束详解及术语释疑 先要理清几个概念: 1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作 ...

最新文章

  1. aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取
  2. python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
  3. 《系统集成项目管理工程师》必背100个知识点-08项目可行性研究内容
  4. 筹码游戏java代码编写,PAT(Basic Level) 乙级练习题 ------ 1071 小赌怡情 java
  5. read name 和 read 在 Bash 中的区别
  6. 断电后supervisor启动时报错
  7. HTML文件可通过www进行传输,使用 zssh 进行 Zmodem 文件传输
  8. c语言中listnode是什么意思,怎么理解typedef Node * List
  9. sun服务器清理内存日志_服务器清理日志的命令行
  10. 浅谈C中的malloc和free\\感谢lj_860603,工作了,没时间验证了,觉得挺好的,转载了...
  11. 使用ORB_SLAM2的方式进行特征检测和提取
  12. python实现485通讯_Python编程实现USB转RS485串口通信
  13. html div自动撑起来,解决子级用css float浮动 而父级div没高度不能自适应高度
  14. 面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
  15. OpenMP与C++ 事半功倍地获得多线程的好处 下
  16. 水调歌头明月几时有赏析
  17. github octotree工具 gitee
  18. 代理 傲澜智伴机器人_机器人厂家_智伴机器人代理,莆田智伴机器人,傲澜智伴机器人(查看)_一呼百应网...
  19. matlab信号如何加白噪声,matlab给信号加白噪声
  20. 虚拟筛选及其方法学验证与ROC曲线python实现

热门文章

  1. Stata-Mata系列(一):Mata入门
  2. 城市轨道交通的GoA
  3. CEILING函数,你会用吗?
  4. 算法导论——矩阵连乘
  5. byr-加不加都告诉你
  6. 《单片机原理及应用》——概述
  7. Mac 打开JD-GUI报错:ERROR launching ‘JD-GUI‘
  8. 【Opencv实战】一文看懂车牌识别系统全部内容,未来市场前景看好(很赞)
  9. python培训排名机构
  10. hcip笔记(GRE,MGRE的介绍与配置)