1.内部类
概念:一个类中又定义了一个类,类中类
//内部类的举例:
class A{//外部类A
String name;
int age;
public void eat(){}
class B{//内部类B
}
}
2.内部类的分类说明
(1)成员内部类
①定义位置:
类以内,方法以外
//成员内部类的举例:
class A{//外部类A
int outerField=10; //成员变量
public void outerMethod(){} //成员方法
class B{ //成员内部类B
int innerField=20;
public void innerMethod(){}
}
}
②创建对象:
依赖外部类的对象
//成员内部类的举例:
class A{//外部类A
int outerField=10; //成员变量
public void outerMethod(){} //成员方法
class B{ //成员内部类B
int innerField=20;
public void innerMethod(){}
}
}
public class Test06{
public static void main(String[] args){
A a01=new A();//创建外部类A的对象
A.B b01=a01.new B();//通过外部类对象来创建内部类
//语法:外部类类名.内部类类名 内部类对象名=外部类对象.new 内部类类名();
}
}
③当外部类属性与内部类属性重名时,使用外部类.this.属性名 区分
class A{//外部类A
int a=10; //成员变量
public void outerMethod(){} //成员方法
class B{ //成员内部类B
int a=20;
public void innerMethod(){
System.out.println(a);
System.out.println(A.this.a);
//访问外部重名属性语法:
//外部类类名.this.访问属性名
}
}
}
注意:
1.成员内部类中不能有静态成员(静态属性、静态初始化代码块、静态方法)
2.创建内部类对象前必须先有外部类对象
(2)静态内部类
①定义位置:
类以内,方法以外
//静态内部类的举例:
class A{//外部类A
int a=10; //成员变量
public void outerMethod(){} //成员方法
//静态内部类
static class InnerClass{
int innerField =20;
static int innerStaticField =30;
public void innerMethod(){}
public static void innerStaticMethod(){}
}
}
②创建对象:
不依赖外部对象
public class Test07{
public static void main(String[] args){
//直接创建内部类
OuterClass.InnerClass ocic=new OuterClass.InnerClass();
}
}
③可以通过访问内部类中的静态成员
public class Test07{
public static void main(String[] args){
//直接创建内部类
OuterClass.InnerClass ocic=new OuterClass.InnerClass();
//直接用外部类名.内部类名.静态内部成员变量可以调用
System.out.println(OuterClass.InnerClass.innerField);
//直接用外部类名.内部类名.静态内部方法() 可以调用
OuterClass.InnerClass.innerStaticMethod();
}
}
注意:
1.静态内部类中可以定义静态成员
2.静态内部类中不可以使用外部类的非静态成员
3.只访问静态内部类的静态成员时不会加载外部
成员内部类与静态内部类一般一个类需要使用自己独有的数据结构时定义。
(3)局部内部类
①定义位置:
方法以内
//局部内部类的举例:
class A{//外部类A
int a=10; //成员变量
public void outerMethod(){//成员方法
//局部内部类
class InnerClass{
}
}
}
②创建对象
与作用范围仅在该方法中(临时)
方法内部、生命周期与所在方法相同
//局部内部类的举例:
class A{//外部类A
int a=10; //成员变量
public void outerMethod(){//成员方法
//局部内部类
class InnerClass{
int innerField =20;
public void innerMethod(){}
}
//创建对象与作用范围仅在该方法中(临时类)
InnerClass ic = new InnerClass();
}
}
③访问外部方法中的局部变量 该变量需要被final修饰(提高该局部变量可见范围)
//局部内部类的举例:
class A{//外部类A
int a=10; //成员变量
public void outerMethod(){//成员方法
final int localVar=100;//最终局部变量
//局部内部类
class InnerClass{
int innerField =20;
public void innerMethod(){
//访问外部类属性
System.out.println(a);
//访问方法中的局部变量
System.out.println(localVar);
}
}
}
}
(4)匿名内部类
①定义位置
(必须依赖一个类或接口)方法内部
//匿名内部类的举例:
public static void main(String[] args){
//匿名内部类
Super sup=new Super(){//{}表示Super类的子类
//new Super(){};表示创建子类对象
public void m1(){//覆盖父类中的m1()方法
System.out.println("m1( )");
}
}; //;是对象的标志
}
class Super{
public void m1(){
System.out.println("Super m1()");
}
}
②特点
1.只能作为子类出现
2.在范围内只能产生一个对象
3.降低代码量 降低可读性