内部类:一个定义在另外一个类的内部,那么该类就称作内部类。
内部类的class文件名:外部类$内部类。 好处:便于区分该class文件时属于哪个外部类的。
内部类的类别:
成员内部类:
----------------成员内部类的访问方式:
----------------方式一: 在外部类提供一个方法,创建内部类的对象进行访问。
----------------方式二: 格式:外部类.内部类 变量名=new 外部类().new 内部类()
----------------注意: 格式:如果是一个静态内部类,那么在其他类创建的格式;
外部类.内部类 变量名=new 外部类.内部类();
1.内部类的应用场景:我们在描述事物A,发现A内部还有一个比较复杂的B,B还需要访问A的据,这时候我们就可以使用内部类描述B事物。
2.通常情况下,当一个类存在的意义仅仅是为某一个类单独服务时,那么就可以将该类定义为所服务类中的内部类,可以直接访问外部类的私有成员,而不再需要提供共有的get和set方法。
1. 内部类的好处:内部类可以直接访问外部类的所有成员
2. 内部类要注意的细节:
1. 如果外部类要与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量。
2. 如果外部类与内部类存在同名的情况下,可以通过外部类.this.成员变量名去指定访问外部类的成员。
3. 私有的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建对象
4. 成员内部类一旦出现了静态的成员,那么该类也必须使用static修饰
原因:.class文件被加载到内存,就存在内存当中了,静态的成员数据是不需要对象的存在就可以访问的
局部内部类: 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类
局部内部类要注意的细节:
1.直接将一个类的定义放在一个方法体的内部,因此该类的作用域为当前方法体的内部
1.如果局部内部类访问了一个局部变量,那么该局部变量必须使用final修饰
如果一个局部内部类访问一个局部变量的时候,那么就让该局部内部类访问这个局部变量,所谓复制品,就要保证俩份数据一样,为了不让别人修改,就只能使用final修饰了。
匿名内部类 (重点、难点)
没有类名的类就称作为匿名内部类
匿名内部类的好处:简化书写。
匿名内部类的使用前提:必须存在继承或者实现关系才能使用。
(1)语法格式
父类/接口类型 引用变量名=new 父类/接口类型(){进行方法的重写};
当接口类型的引用作为方法的形参时,则实参的传递方式有俩种
a.自定义类实现接口并重写抽象方法,然后创建该类型的对象作为实参传递;
b.按照上述匿名内部类的语法格式创建对象作为实参传递
public interface A {
public abstract void show();
}
public class subA implements A {
@Override
public void show() {
System.out.println("实现类中的show方法");
}
}
public class TestA {
public static void test(A a) {
a.show();
}
public static void main(String[] args) {
//使用多态运行show方法
TestA.test(new subA());
//使用匿名对象类,重写方法完成运行show方法
TestA.test(new A() {
@Override
public void show() {
System.out.println("第一次实现匿名内部类");
}
});
}
}
匿名内部类与父类是继承关系,借用父类的类名重写方法。