内部类:成员内部类(特例:静态内部类)、局部内部类(匿名内部类)
成员内部类:定义在外部类当中
1.定义在外部类当中,和外部类的属性、方法、构造,处于平等地位。
2.成员内部类拥有独立的class文件,其class文件的名字规则———外部类的类名+$+内部类的类名
3.成员内部类可以使用访问修饰符,使用后的效果和属性、方法、构造是一样的
4.成员内部类内部可以定义各种属性、构造、方法、初始化块、甚至可以再定义内部类
5.成员内部类中的属性和方法不能是static的成员内部类在外部产生对象的语法
1.外部类 外部类变量名 = new 外部类()
外部类.内部类 变量名 = 外部类变量名.new 内部类()
Outer outer = new Outer();
Outer.Inner inner =outer.new Inner();
2.外部类.内部类 变量名 = new 外部类().new 内部类()
Outer.Inner inner = new Outer().new Inner();成员内部类操作外部类的属性或方法:外部类.this.属性(或方法)
成员静态内部类:用static修饰的成员内部类
1.定义在外部类当中,和外部类的属性、方法、构造,处于平等地位。
2.成员静态内部类拥有独立的class文件,其class文件的名字规则———外部类的类名+$+内部类的类名
3.成员静态内部类可以使用访问修饰符,使用后的效果和属性、方法、构造是一样的
4.成员静态内部类内部可以定义各种属性、构造、方法、初始化块、甚至可以再定义内部类
5.成员静态内部类中的属性和方法可以是static的,与普通成员内部类不同成员静态内部类在外部产生对象的语法
1.外部类.内部类 变量名 = new 外部类.内部类()
Outer.Inner inner = new Outer.Inner();
2.无需产生外部类的对象,直接使用外部类类名。内部类类名的方法作为它的类型,new出来即可成员静态内部类不能操作外部类的非静态属性、方法,只能操作外部类中静态的属性、方法
1.内部类的应用场景:我们在描述A事物的时候,发现描述的A事物内部还存在另外一个比较复杂的事物B时候,而且这个比较复杂的事物B还需要访问A事物的属性等数据,那么这个时候我们就可以使用内部类来描述B事物
2.内部类的好处:内部类可以直接访问外部类的所有成员
3.内部类要注意的事项:
a.如果外部类与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量。
解决方法:外部类.this.成员变量名 来指定访问外部类的成员。示例:Outer.this.print()
b.私有的成员内部类,只能在外部类提供一个方法创建内部类进行访问
c.成员内部类一旦出现了静态成员,那么该类也必须使用static进行修饰
访问方式1示例
class Outer {
// 成员内部类
int x = 100;
class Inner {
int i = 10;
public void print() {
System.out.println("这个是成员内部类的print方法!");
}
}
public void instance() {
// 在外部的方法中创建了内部类的对象,然后调用对象的方法
Inner inner = new Inner();
inner.print();
System.out.println("x = " + this.x);
}
}
public class Demo12 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.instance();
}
}
访问方式2示例
class Outer {
// 成员内部类
int x = 100;
class Inner {
int i = 10;
public void print() {
System.out.println("这个是成员内部类的print方法!");
}
}
}
public class Demo12 {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.print();
}
}