1、内部类,顾名思义就是一个类内部的类。
2、内部类访问特点:
1)内部类可以直接访问外部类中的成员。
2)外部类要访问内部类,必须建立内部类的对象。
3、内部类分类
1)成员内部类:
class Outer {
private int num = 3;
class Inner {
private int num = 4;
public void show() {
int num = 5;
System.out.println(num); //5
System.out.println(this.num); //4
System.out.println(Outer.this.num); //3
}
}
}
public class Demo {
public static void main(String[] args) {
new Outer().new Inner().show();
}
}
成员内部类持有外部类.this的引用。
Inner是Outer的成员,想访问成员就需要对象。
new Outer().new Inner().show();
Inner里面能直接访问Outer的所有成员。
2)静态内部类—成员方法:
class Outer {
private int num = 3;
static class Inner {
private int num = 4;
public void show() {
int num = 5;
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer().num);
}
}
}
public class Demo {
public static void main(String[] args) {
new Outer.Inner().show();
}
}
静态内部类里面不持有外部类.this的引用,如果想访问外部类的成员,得new外部类的对象。
System.out.println(new Outer().num);
由于Inner是静态的,静态成员直接类名调用即可:
new Outer.Inner().show();
2)静态内部类—静态方法:
class Outer {
private int num = 3;
static class Inner {
private int num = 4;
public static void show() {
int num = 5;
System.out.println(num);
System.out.println(new Inner().num);
System.out.println(new Outer().num);
}
}
}
public class Demo {
public static void main(String[] args) {
Outer.Inner.show();
}
}
注:如果内部类中有静态成员,那么该内部类也必须是静态的。
静态成员直接类名调用即可:
Outer.Inner.show();
由于方法是静态的,里面不持有this,访问成员变量需要对象。
System.out.println(new Inner().num);
3)局部内部类:
局部内部类就是方法里面的内部类。
注意:
1、局部内部类不能被public、private、static修饰;
2、在外部类中不能创建局部内部类的实例;
3、创建局部内部类的实例只能在包含他的方法中;
4、局部内部类访问包含他的方法中的变量必须有final修饰;
5、外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在局部内部类定义之后。
6、方法如果返回局部内部类的对象,只能以Object类型返回。
7、获取局部内部类的对象也只能以Object类型接收。
class Outer {
private int num = 3;
public Object show() {
final int num = 4;
class Inner {
public void method() {
System.out.println(num);
}
}
return new Inner();
}
}
public class Demo {
public static void main(String[] args) {
Object in = new Outer().show();
}
}
4)匿名内部类:
没有名字的内部类。
内部类必须继承或者实现一个外部类或者接口。
匿名内部类:其实就是一个匿名子类对象。
格式:new 父类or接口(){子类内容}
interface Inter {
void show();
}
class Outer {
void method() {
}
}
public class Demo {
public static void main(String[] args) {
new Inter() {
@Override
public void show() {
}
}.show();
Inter in = new Inter() {
@Override
public void show() {
}
};
in.show();
new Outer() {
@Override
void method() {
super.method();
}
}.method();
Outer out = new Outer() {
@Override
void method() {
super.method();
}
};
out.method();
}
}
5)内部接口:
顾名思义就是类里面的接口或者接口里面的接口。
interface Inter {
void show();
interface InnerInter {
void show();
}
}
public class Demo {
public static void main(String[] args) {
new Inter.InnerInter() {
@Override
public void show() {
System.out.println("InnerInter show()");
}
}.show();
new Inter() {
@Override
public void show() {
System.out.println("Inter show()");
}
}.show();
}
}
class Outer {
void show() {
System.out.println("Outer show()");
}
interface InnerInter {
void show();
}
}
public class Demo {
public static void main(String[] args) {
new Outer.InnerInter() {
@Override
public void show() {
System.out.println("Outer.InnerInter show()");
}
}.show();
}
}
创建内部接口实现类对象可以直接通过 new 外部接口.内部接口(){}或者new 外部类.内部接口(){}的格式完成。
手动创建类去实现接口:
interface Inter {
void show();
interface InnerInter {
void show();
}
}
class Test implements Inter {
@Override
public void show() {
}
}
class Test2 implements Inter.InnerInter {
@Override
public void show() {
}
}
public class Demo {
public static void main(String[] args) {
new Test();
new Test2();
}
}
class Outer {
void show() {
System.out.println("Outer show()");
}
interface InnerInter {
void show();
}
}
class Test implements Outer.InnerInter {
@Override
public void show() {
}
}
public class Demo {
public static void main(String[] args) {
new Test();
}
}