Java内部类
Java内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
public class Outer {
private int outId = 1;
public void outerMethod() {
System.out.println("这是一个外部方法");
}
public void method() {
class Innner3 {
public void in() {
System.out.println("Innner3.in");
}
}
}
/**
* 静态内部类
*/
public static class StaticInner {
private int inId = 2;
public void inMethod() {
System.out.println("这是一个内部方法");
}
public static void staticInMethod() {
System.out.println("这是一个内部方法");
}
}
/**
* 成员内部类
*/
public class Inner {
private int inId = 2;
public void inMethod() {
System.out.println("这是一个内部方法");
}
public void getOutId() {
System.out.println("获取外部Id:"+outId);
}
}
}
class Inner2 {
}
interface Test {
void print();
}
测试类
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
Outer.Inner inner = outer.new Inner();
inner.inMethod();
inner.getOutId();
System.out.println("=========");
Outer.StaticInner staticInner = new Outer.StaticInner();
staticInner.inMethod();
Outer.StaticInner.staticInMethod();
Test test = new Test() {
@Override
public void print() {
System.out.println("匿名内部类");
}
};
test.print();
}
}
public static void main(String[] args) {
//方法一(局部内部类)
class Mouse implements USB {
@Override
public void service() {
System.out.println("鼠标接入");
}
}
USB mouse = new Mouse();
mouse.service();
//方法二(匿名内部类,可以减少代码量)
USB usb = new USB() {
@Override
public void service() {
System.out.println("鼠标接入");
}
};
usb.service();
}
补充
/**
* 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
* 备注:从java8+开始,只要局部变量实际不变,那么final关键字可以忽略
*
* 原因:
* 1. new出来的对象在堆内存中
* 2. 局部变量是跟着方法走的,在栈内存当中
* 3. 方法运行结束之后,立刻出栈,局部变量会立刻消失
* 4. 但是new出来的对象会在堆当中持续存在,直到垃圾回收消失
*
*/
//外部类
public class MyOuter {
//方法
public void outerMethod() {
//所在方法的局部变量
int i = 10;
i++;
int finalI = i;
//局部内部类
class MyInner {
public void innerMethod() {
System.out.println(finalI);
}
}
}
}
编译后生成MyOuter.class MyOuter$1MyInner.class文件中的代码如下
public class MyOuter {
public MyOuter() {
}
public void outerMethod() {
byte var1 = 10;
int var3 = var1 + 1;
class MyInner {
MyInner(int var2) {
this.val$finalI = var2;
}
public void innerMethod() {
System.out.println(this.val$finalI);
}
}
}
}
class MyOuter$1MyInner {
MyOuter$1MyInner(MyOuter var1, int var2) {
this.this$0 = var1;
this.val$finalI = var2;
}
public void innerMethod() {
System.out.println(this.val$finalI);
}
}
本文来自博客园,作者:Cn_FallTime,转载请注明原文链接:https://www.cnblogs.com/CnFallTime/p/15832174.html