Cloud9527
Alex_赵
Struggle
shixinzhang
通过反编译介绍四种内部类
结合实战介绍内部类的使用场景
抽象类和接口 (完成)
内部类
修饰符
装箱拆箱
注解
反射
泛型
异常(完成)
集合
IO
字符串
其他
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?); //填入合适的代码
System.out.println(??);
System.out.println(???);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
interface Inter {
void show();
}
class Outer {
//补齐代码
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
成员内部类
局部内部类
匿名内部类
静态内部类
public class OutClass2 { private int i = 1; public static String str = "outclass"; class InnerClass { // 成员内部类 private int i = 2; public void innerMethod() { int i = 3; System.out.println("i=" + i); System.out.println("i=" + this.i); System.out.println("i=" + OutClass2.this.i); System.out.println("str=" + str); } }}public class TestClass { public static void main(String[] args) { //先创建外部类对象 OutClass2 outClass = new OutClass2(); //创建内部类对象 OutClass2.InnerClass in = outClass.new InnerClass(); //内部类对象调用自己的方法 in.innerMethod(); }}
outClass.new InnerClass()
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.simon.androidlife.innerclass;
import com.example.simon.androidlife.innerclass.OutClass2;
class OutClass2$InnerClass {
private int i;
OutClass2$InnerClass(OutClass2 var1) {
this.this$0 = var1;
this.i = 2;
}
public void innerMethod() {
byte var1 = 3;
System.out.println("i=" + var1);
System.out.println("i=" + this.i);
System.out.println("i=" + OutClass2.access$000(this.this$0));
System.out.println("str=" + OutClass2.str);
}
}
在内部类中,直接使用变量名,会按照从方法中的局部变量、到内部类的变量、到外部类的变量的顺序访问
也就是说,如果在外部类、内部类、方法中有重名的变量/方法,编译器会把方法中直接访问变量的名称修改为方法的名称
如果想在方法中强制访问内部类的成员变量/方法,可以使用 this.i
,这里的 this 表示当前的内部类对象
如果想在方法中强制访问外部类的成员变量/方法,可以使用 OutClass.this.i
,这里的 OutClass.this 表示当前外部类对象
public class Outclass3 {
private String name;
private int age;
public static class InnerStaticClass {
private String name;
public String getName() {
return name;
}
public int getAge() {
return new Outclass3().age;
}
}
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.simon.androidlife.innerclass;
import com.example.simon.androidlife.innerclass.Outclass3;
public class Outclass3$InnerStaticClass {
private String name;
public Outclass3$InnerStaticClass() {
}
public String getName() {
return this.name;
}
public int getAge() {
return Outclass3.access$000(new Outclass3());
}
}
public class OutClass4 { private String className = "OutClass"; { class PartClassOne { // 局部内部类 private void method() { System.out.println("PartClassOne " + className); } } new PartClassOne().method(); } public void testMethod() { class PartClassTwo { // 局部类内部类 private void method() { System.out.println("PartClassTwo " + className); } } new PartClassTwo().method(); }}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.simon.androidlife.innerclass;
import com.example.simon.androidlife.innerclass.OutClass4;
class OutClass4$1PartClassOne {
OutClass4$1PartClassOne(OutClass4 var1) {
this.this$0 = var1;
}
private void method() {
System.out.println("PartClassOne " + OutClass4.access$000(this.this$0));
}
}
package com.example.simon.androidlife.innerclass;
import com.example.simon.androidlife.innerclass.OutClass4;
class OutClass4$1PartClassTwo {
OutClass4$1PartClassTwo(OutClass4 var1) {
this.this$0 = var1;
}
private void method() {
System.out.println("PartClassTwo " + OutClass4.access$000(this.this$0));
}
}
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub }});
public class OutClass5 {
private OnClickListener mClickListener;
private OutClass5 mOutClass5;
interface OnClickListener {
void onClick();
}
public OutClass5 setClickListener(final OnClickListener clickListener) {
mClickListener = clickListener;
return this;
}
public OutClass5 setOutClass5(final OutClass5 outClass5) {
mOutClass5 = outClass5;
return this;
}
public void setClickInfo(final String info, int type) {
setClickListener(new OnClickListener() {
@Override
public void onClick() {
System.out.println("click " + info);
}
});
setClickListener(new OnClickListener() {
@Override
public void onClick() {
System.out.println("click2 " + info);
}
});
}
}
class OutClass5$1 implements OnClickListener {
OutClass5$1(OutClass5 var1, String var2) {
this.this$0 = var1;
this.val$info = var2;
}
public void onClick() {
System.out.println("click " + this.val$info);
}
}
class OutClass5$2 implements OnClickListener {
OutClass5$2(OutClass5 var1, String var2) {
this.this$0 = var1;
this.val$info = var2;
}
public void onClick() {
System.out.println("click2 " + this.val$info);
}
}
为了避免文章太长,我们把使用场景放到下一篇。
点击“原文链接”去我们的 github 项目,欢迎关注!