今天就讲一下内部类,内部类顾名思义,就是在类中的类,那么内部类具体有哪些呢,一起来看一下:
内部类分类:
- 实例内部类
- 静态内部类
- 匿名内部类
- 本地内部类
Ⅰ.实例内部类
1.如何实例化内部类对象呢?
-
外部类名.内部类名 变量 = 外部类对象引用.new 内部类();
2.只要是内部类,那么生成的字节码文件格式:
-
外部类名$内部类名.class
3.在实例内部类当中,不能定义静态的成员变量!
-
如果一定要编译,那么一定是在编译时期确定的值 例如public static final
4.this实际上是一个静态的成员
-
System.out.println(OutClass.this.data1)
5.实例内部类实际上拥有两个this,一个是实例内部类自己的,一个是外部类的
6.面试题:实力内部类是否有额外的内存开销?
-
有的,因为它拥有两个this
class OutClass{
public int data1 = 1;
public static int data2 = 2;
class InClass{
public int data1 = 11;
//public static int data3 = 3;
public static final int data4 = 4;
public InClass(){
}
public void test(){
System.out.println("InClass的test()方法!");
System.out.println(data4);
System.out.println(data1); //访问的是内部类自己的变量data1
System.out.println(OutClass.this.data1); //访问的是外部类变量data1
System.out.println(data2);
}
}
}
public class TestDemo2 {
public static void main(String[] args) {
OutClass outClass = new OutClass(); //外部类对象
OutClass.InClass inClass = outClass.new InClass(); //通过外部类对象引用访问内部类
inClass.test();
}
}
代码执行结果:
此外需要注意的是:实例内部类中不能出现静态数据成员!
Ⅱ.静态内部类
1.怎么拿到静态内部类的实例对象
外部类名.内部类名 变量 = new 外部类名.内部类名
2.字节码文件: 外部类$内部类.class
3.在静态内部类当中,是不可以访问外部类的非静态数据成员的!!!
因为外部类的非静态数据成员是依赖于外部类对象的, 但是非要访问怎么办?
解答:创建外部类对象引用,此时public OutClass1
outClass1,这时候并未实例化,不能通过该引用直接访问非静态数据成员;将其传入内部类构造函数中,然后通过外部类对象引用调用外部类非静态数据成员就ok!
class OutClass1{
public int data1 = 6;
public static int data2 = 12;
static class InClass{
public int data3 = 3;
public static int data4 = 4;
public OutClass1 outClass1;
//将外部类对象引用当作参数传入内部类构造方法中
public InClass(OutClass1 outClass1){
this.outClass1 = outClass1;
}
public void test(){
System.out.println("InClass的test()方法");
System.out.println(outClass1.data1); //访问外部类非静态数据
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
}
}
}
public class TestDemo1 {
public static void main(String[] args) {
OutClass1 outClass1 = new OutClass1();
//拿到静态内部类对象
OutClass1.InClass inClass = new OutClass1.InClass(outClass1);
inClass.test();
}
}
Ⅲ.匿名内部类
在匿名内部类当中,使用的变量是整个过程中没有发生改变过的量或者是常量!!!
匿名内部类在多线程中常用,具体来看一下他的形式:
class OutClass2{
public void test(){
System.out.println("啦啦啦啦啦啦啦,内部类学完咯");
}
}
public class TestDemo3 {
public static void main(String[] args) {
//匿名内部类,可以看作是OutClass2的子类
int data = 1;
new OutClass2(){
@Override
public void test() {
//data = 9;
super.test();
System.out.println(data);
}
}.test();
}
}
Ⅳ.本地内部类
本地内部类几乎不用,它是定义在方法内部的类,说白了意义不大真的
public void func(){
//本地内部类
class A{
}
}
咱也不知道它要搞个什么名堂你说是不?