内部类
指的是定义在类的内部的类。
成员内部类
定义在类的内部,方法的外部的内部类,称为成员内部类
局部内部类
指的是定义在方法内的内部类,称为局部内部类。
内部类的定义形式
class{
class{
}
}
思考问题
①如何创建内部类的对象?
外部类类名.内部类类名 对象名称 = new 外部类().new 内部类();
要产生内部类,首先需要产生外部类(内部类是外部类的一个成员,对于成员的访问我们都需要对象)
②对于包含了内部类的类,编译之后,会产生几个.class字节码文件?
产生两个字节码文件
内部类的字节码文件的名称为 外部类$内部类.class
③ 内部类能否访问外部类的私有的成员属性? 可以
内部类的构成和普通类的构成是一样,而且内部类能直接访问外部类的成员,包括私有的成员
④ 内部类能否使用private public protected进行修饰
可以。但是内部类使用private修饰之后,在其他类中访问是不方便的
⑤对于内部类中声明的变量,类似于外部类中的局部变量,只能在内部类中使用,而不能在外部类中使用。
⑥局部内部类不能在外部产生该内部类的对象,要产生该局部内部类的对象,只能在方法内部产生。但是对于局部内部类编译之后也会产生两个clas字节码文件。对于局部内部类,要想使用方法的局部变量,那么该变量一定是 final。jdk8 会自动为该变量添加 final 修饰
public class OutterClass {
private int num = 10;
private OutterClass.innerClass ic;
public OutterClass() {
System.out.println("outterclass 构造方法");
}
public void printInfo() {
System.out.println(num );
}
private class innerClass{//成员内部类
int a = 100;
public innerClass() {
System.out.println("innerClass 构造方法");
}
public void show() {
num = 200;
System.out.println(num);
printInfo();
}
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public OutterClass.innerClass getIc() {
return ic;
}
public void setIc() {
this.ic = new OutterClass().new innerClass();;
}
public static void main(String[] args) {
OutterClass oc = new OutterClass();
OutterClass.innerClass ic = new OutterClass().new innerClass();
System.out.println(oc);
System.out.println(ic);
System.out.println("-----------------------");
ic.show();
}
}
public class OutterClass2 {
public void test() {
final int num = 20;
class methodInnerClass{
public void show2() {
System.out.println(num);
}
}
methodInnerClass mc = new methodInnerClass();
mc.show2();
}
public void demo() {
}
public static void main(String[] args) {
OutterClass2 oc2 =new OutterClass2();
oc2.test();
}
}
public class Test {
public static void main(String[] args) {
OutterClass oc = new OutterClass();
oc.setIc();
Object obj = oc.getIc();
System.out.println(obj);
}
}