内部类:可以将一个类定义在另一个类或者一个方法的内部 。描述一个事物的一个完整结构的描述 。内部类包括:实例内部类(普通内部类),静态内部类,局部内部类(定义在方法里,几乎不用)和匿名内部类 。本文针对实例内部类进行介绍 。
1.对于内部类来说,和普通的成员变量是同一等级的,也依赖于对象 。所以,需要外部类对象的引用才能进行内部类的实例化 。
2.如何实例化内部类对象:
代码中提供了两个方法
①
OutClass out = new OutClass();OutClass.InnerClass inner1= out.new InnerClass();
②一步到位
【java实例内部类】OutClass.InnerClass inner2 = new OutClass().new InnerClass();
总的来说,就是定义方法:
外部类名.内部类名 变量 = 外部类对象的引用.new 内部类()
3.实例内部类中能定义静态成员变量吗?
不能,但可以通过加final关键字把它变成常量,定义必须要是编译的时候就确定的值,也就是说必须时 final的 。定义时也要进行初始化 。
public static final int data6 = 60;
4.实例内部类当中,有成员变量名和外部类的成员变量名冲突了怎么办
优先使用自己的
那么如何拿到外部类的呢?
System.out.println("外部类的data1:"+OutClass.this.data1);System.out.println("内部类的data1:"+this.data1);
可以得出结论:实例内部类不仅包含了自己的this,也包含了外部类的this
5.如何在外部类中访问实例内部类的成员变量和成员方法呢?
public void funcOut(){InnerClass in = new InnerClass();System.out.println(in.data5);in.func2();System.out.println("外部类的普通成员方法");}
通过实例化内部类对象,用.操作符去访问
6.实例内部类能拿到外部类的成员变量吗?
public void func(){System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}
可以看到,不仅可以访问权限的,也能访问权限的,静态的也能访问 。
7.实例内部类中可以有静态成员方法吗?
不行!无法通过编译 。
8.实例内部类字节码文件说明
文章插图
外部类$内部类 。
所以当用到实例内部类时,加载实例内部类的字节码文件,不用时不加载 。
其次,内部类和外部类共用一个java源文件,经过编译之后,内部类会形成单独的字节码文件 。
总结:
1.外部类的任何成员都可以直接在实例内部类方法中访问 。
2.实例内部类所处的位置与外部类成员的位置相同,所以受、等访问限定符的约束 。
3.在实例内部类方法中访问同名的方法时,优先访问自己的 。如果要访问外部类的同名的成员,使用外部类名.this.同名成员方式访问 。
4.实例内部类对象必须先有外部类对象才能创建 。
5.实例内部类的非静态方法中包含了一个指向外部类对象的引用(即this) 。
6.外部类中,不能直接访问内部类成员,如果要访问,必须先创建内部类对象 。
## 整体代码
class OutClass{public int data1 = 10;private int data2 = 20;public static int data3 = 30;/*** @Description:实例内部类*/class InnerClass{public int data4 = 40;private int data5 = 50;public static final int data6 = 60;public int data1 = 88;public InnerClass(){System.out.println("实例内部类的构造方法");}public void func(){System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);System.out.println("外部类的data1:"+OutClass.this.data1);System.out.println("内部类的data1:"+this.data1);System.out.println("实例内部类的普通成员方法");}public void func2(){System.out.println("实例内部类的普通成员方法");}}public void funcOut(){InnerClass in = new InnerClass();System.out.println(in.data5);in.func2();System.out.println("外部类的普通成员方法");}}public class TestDemo {public static void main(String[] args) {OutClass out = new OutClass();OutClass.InnerClass inner1= out.new InnerClass();OutClass.InnerClass inner2 = new OutClass().new InnerClass();System.out.println("_________________");out.funcOut();}}
- Linux内核内存管理
- 远程桌面出现了内部错误有哪些解决方法?
- C/C++内存泄漏原因分析与应对方法
- java hashtable 初始化_Java中HashTable和HashMa
- 内存管理专题04 伙伴分配器原理
- linux内核异步内存回收的另一个思路:基于冷热文件的冷热区域精准的回收冷文件页
- 内存换出和缓冲区释放
- java 运行.jnlp文件,在Linux系统上执行/打开JNLP文件的方法
- java/php/net/python软考软件设计师考试题库学习设计
- java--HashMap数据结构