1、静态内部类
package com.company.inner_class;
/*
* 关于静态内部类:
* 1、静态内部类可以等同看做静态变量
*
* 2、内部类重要的作用:可以访问该外部类中私有的数据,由于s1变量被private修饰,
* 一般的类无法直接访问,但是InnerClass可以访问,因为他们都在OuterClass内部。
*
* 3、内部类的class文件名:
* 外部类名$内部类名.class
* 例如:OuterClass$InnerClass.class
*
* 4、静态内部类可以直接访问外部类的静态数据,无法直接访问成员。
* */
public class OuterClass01 {
// 静态变量
private static String s1 = "A";
// 成员变量
private String s2 = "B";
// 静态方法
private static void m1(){
System.out.println("static's m1 method executed!");
}
// 成员方法
private void m2(){
System.out.println("m2 method executed!");
}
// 静态内部类
// 可以用访问控制权限的修饰符修饰
// public、protected、private、缺省
static class InnerClass{
// 静态方法
public static void m3(){
System.out.println(s1);
//System.out.println(s2); // 编译报错,在static方法中不能直接访问成员变量/成员方法
m1();
//m2();
}
// 成员方法
public void m4(){
System.out.println(s1);
m1();
//System.out.println(s2);
//m2(); //仍然不能访问
}
}
// 入口
public static void main(String[] args) {
// 执行m3
OuterClass01.InnerClass.m3();
// 执行m4
InnerClass inner = new OuterClass01.InnerClass();
inner.m4();
}
}
2、成员内部类
package com.company.inner_class;
/*
* 关于成员内部类:
*
* 1、成员内部类可以等同看做成员变量
*
* 2、成员内部类中不能有静态声明
*
* 3、成员内部类可以访问外部类中所有数据
* */
public class OuterClass02 {
// 静态变量
private static String s1 = "A";
// 成员变量
private String s2 = "B";
// 静态方法
private static void m1(){
System.out.println("static's m1 method executed!");
}
// 成员方法
private void m2(){
System.out.println("m2 method executed!");
}
// 成员内部类
// 可以用访问控制权限的修饰符修饰
// public、protected、private、缺省
class InnerClass{
// 静态方法
//public static void m3(){} //成员内部类中不能有静态声明
// 成员方法
public void m4(){
//成员内部类可以访问外部类中所有数据
System.out.println(s1);
m1();
System.out.println(s2);
m2();
}
}
// 入口
public static void main(String[] args) {
// 窗键外部类对象
OuterClass02 oc = new OuterClass02();
InnerClass inner = oc.new InnerClass();
inner.m4();
}
}
3、局部内部类
package com.company.inner_class;
/*
* 局部内部类等同于局部变量
*
* 重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰。
*
* */
public class OuterClass03{
public void m1(){
// 局部变量
//int i = 10;
//局部内部类在访问局部变量的时候,局部变量必须使用final修饰
final int i = 10;
// 局部内部类
// 由于是"局部",所以不能用访问控制权限修饰符修饰。
class InnerClass{
//内部类不能有静态声明
//public static void m1(){}
// 成员方法
public void m2(){
System.out.println(i);
}
}
// m2只是在类中声明,没有调用
// 局部内部类就相当于局部变量,出了大括号就失效了,在main方法中创建不了对象
// 所以必须在该方法中创建对象,再调用m2
InnerClass inner = new InnerClass();
inner.m2();
}
// 入口
public static void main(String[] args) {
//调用局部类中的方法
OuterClass03 oc = new OuterClass03();
oc.m1();
}
}
4、匿名内部类
package com.company.inner_class;
/*
* 匿名内部类:
* 指的是类没有名字
* */
public class OuterClass04 {
public static void t(CustomerService cs){
cs.logout();
}
// 入口
public static void main(String[] args) {
// 调用t方法,t方法需要参数
// 而参数是CustomerService类型的引用,Customer是接口类型,无法创建对象
// 那么如何调用t方法?
// 方法一:需要将接口实现
//t(new CustomerServiceImp());
// 使用匿名内部类的方式执行t方法
//
t(new CustomerService(){
@Override
public void logout() {
System.out.println("系统已经安全退出!");
}
});
// 匿名内部类的缺点:少定义一个类
// 缺点:无法重复使用!
}
}
// 接口
interface CustomerService{
// 退出系统
void logout();
}
/*
方法一:
//编写一个类实现CustomerService接口
class CustomerServiceImp implements CustomerService{
public void logout(){
System.out.println("系统已经安全退出!");
}
}
*/