前言
一、内部类
将一个类定义在另一个类或者方法的内部,前者为内部类,后者为外部类。
内部类是一个完整的结构,只为外部类服务。
1.实例内部类
在类里面,方法的外面
注意:在实例内部类中不能定义静态成员变量,因为静态不依赖对象。但是可以有静态常量(final)。
必须先实例化外部类,才能实例化内部类。
内部类也有单独的字节码文件:外部类$内部类
外部类的任何成员可以在实例内部类中直接访问。有同名,用this.访问内部的;用外.this.访问外部的。
在外部类调用内部类需要先实例化内部类。
class Outer{
public int age;
int price=80;
class Inner{
String name="张三";
int price=33;
public void sum(){
System.out.println("总价");
System.out.println(age);
System.out.println(this.price);//内
System.out.println(Outer.this.price);//外
}
}
public void test(){
Inner inner=new Inner();
System.out.println("外部类调用内部类");
System.out.println(inner.name);
}
}
public class Test02 {
public static void main(String[] args) {
//初始化1
Outer outer=new Outer();
outer.test();
Outer.Inner inner=outer.new Inner();
inner.sum();
//初始化2
Outer.Inner inner2=new Outer().new Inner();
inner2.sum();
}
}
2.静态内部类
实例静态内部类中 Outer.Inner是一个整体,不要实例化外部类
外部类非静态成员内部类不能访问。但是如果必须访问外部,可以在内部类中new一个外部类对象,然后调用需要的即可。
class Outer{
public int age;
int price=80;
static class Inner{
String name="张三";
int price=33;
public static int sex=1;
public void sum(){
System.out.println("总价");
// System.out.println(age);//报错
Outer outer1=new Outer();
System.out.println(outer1.age);//能访问外部
System.out.println(price);//内
}
}
}
public class Test02 {
public static void main(String[] args) {
Outer.Inner inner=new Outer.Inner();//一个整体
inner.sum();
}
}
3.局部内部类
定义在外部类的方法或{}中,该内部类只能在其定义的方法内位置使用,使用很少。
不能被public,static等修饰符修饰。
class Outer{
public int age;
int price=80;
public void test6(){
class Inner{
String name="张三";
}
Inner inner=new Inner();
System.out.println(inner.name);//只能在此使用。
}
}
}
public class Test02 {
public static void main(String[] args) {
}
}
4.匿名内部类
interface shape{
void draw();
}
public class Test03 {
public static void main(String[] args) {
int a=10;
new shape(){//匿名内部类
public void draw(){
// a=88;但是之后在里面写a=88,会报错。在匿名内部类中,访问的变量是不可以改变的。
System.out.println("矩形:"+a);
}
}.draw();//要调用,必须要.draw才能调
}
}