内部类和外部类的详解
一*相关概念:
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。内部类也是封装的一种体现。
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.基本不会使用
五*匿名内部类
后期接口时补充
内部类和外部类的详解相关推荐
- Java内部类引用外部类中的局部变量为何必须是final问题解析
Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...
- java的内部类和外部类_java内部类 和外部类的区别
下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.prote ...
- Python内部类,内部类调用外部类属性,方法
一 Python中内部类 典型定义: class MyOuter:age=18def __init__(self,name):self.name=nameclass MyInner:def __ini ...
- java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?
对普通类(没有内部类的类)来说,内部类和外部类都与他无关:对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类.所以,要回答这个问题,只需要讲解内部类是什么:Jav ...
- 反编译中内部类调用外部类成员问题
.access$ 反编译偶内部类调用外部类成员问题 很简单的一个测试类源码: public class testOuter { private int a; private int b; privat ...
- 匿名内部类 可以访问外部类_Java 内部类与外部类的互访使用小结
内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员. 内部类访问外部类 里面的可以自由访问外面的,规则和static一样.(访问非静态时必须先创建对象) 具体如下: 非静态内部类的非静态方法 ...
- JAVA基础系列:内部类获取外部类的成员变量
内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer {public String name = "outer";cla ...
- 内部类与外部类之间的访问
目 录 1.内部类与外部类 2.内部类的特点:内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员. 3.内部类与外部类之间的访问 在测试类中调用成员内部类中的方法: ...
- 外键约束详解及术语释疑
外键约束详解及术语释疑 先要理清几个概念: 1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作 ...
最新文章
- aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取
- python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
- 《系统集成项目管理工程师》必背100个知识点-08项目可行性研究内容
- 筹码游戏java代码编写,PAT(Basic Level) 乙级练习题 ------ 1071 小赌怡情 java
- read name 和 read 在 Bash 中的区别
- 断电后supervisor启动时报错
- HTML文件可通过www进行传输,使用 zssh 进行 Zmodem 文件传输
- c语言中listnode是什么意思,怎么理解typedef Node * List
- sun服务器清理内存日志_服务器清理日志的命令行
- 浅谈C中的malloc和free\\感谢lj_860603,工作了,没时间验证了,觉得挺好的,转载了...
- 使用ORB_SLAM2的方式进行特征检测和提取
- python实现485通讯_Python编程实现USB转RS485串口通信
- html div自动撑起来,解决子级用css float浮动 而父级div没高度不能自适应高度
- 面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
- OpenMP与C++ 事半功倍地获得多线程的好处 下
- 水调歌头明月几时有赏析
- github octotree工具 gitee
- 代理 傲澜智伴机器人_机器人厂家_智伴机器人代理,莆田智伴机器人,傲澜智伴机器人(查看)_一呼百应网...
- matlab信号如何加白噪声,matlab给信号加白噪声
- 虚拟筛选及其方法学验证与ROC曲线python实现