内部类
1、静态内部类
/*
* 关于静态内部类
* 1.静态内部类可以等同看作静态变量
*
* 内部类重要作用:可以访问外部类中的私有数据
*
* 2.静态内部类可以直接访问外部类私有的静态数据,无法访问非静态数据
*/
package u静态内部类;
public class OutClassjt {
//静态变量
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、private、protected、缺省
static class InnerClass{
//定义静态方法
public static void m3(){
System.out.println(s1);
m1();
//System.out.println(s2);
//m2();
}
//成员方法
public void m4(){
System.out.println(s1);
m1();
}
}
public static void main(String[] args){
//调用静态方法m3,直接类名.
OutClassjt.InnerClass.m3();
//调用成员方法m4,创建对象
InnerClass inner = new OutClassjt.InnerClass();
inner.m4();
}
}
2、成员内部类
/*
* 关于 成员内部类
* 1. 成员内部类可以等同看作 成员变量
*
* 内部类重要作用:可以访问外部类中的私有数据
*
* 2. 成员内部类可以直接访问外部类所有的数据
*
* 3.成员内部类中不能有静态声明
*/
package u成员内部类;
public class OutClasscy {
//静态变量
private static String s1 = "A";
//成员变量
private String s2 = "B";
//静态方法
private static void m1(){
System.out.println("static's m1 method excuted!");
}
//成员方法
private void m2(){
System.out.println("m2 method excuted!");
}
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){
//成员内部类相当于成员变量,要访问须创建外部类对象
//创建外部类对象
OutClasscy oc = new OutClasscy();
//内部类中再访问成员方法还要创建对象
InnerClass inner =oc.new InnerClass();
//InnerClass inner = new InnerClass();
//没有任何类型 OutClasscy 的外层实例可访问。必须用类型 OutClasscy 的外层实例(例如,x.new A(),其中 x 是 OutClasscy 的实例)来限定分配。
inner.m4();
}
}
3、局部内部类
/*
* 关于局部内部类:
* 1.局部内部类相当于方法中的局部变量
* (所以说想要在方法中访问局部内部类中的成员方法只能在该方法中创建对象,因为出了括号就不认识了)
*
* 2.局部内部类中不能有静态声明
*
* 3.局部内部类要访问该方法的局部变量必须是最终型变量(变量类型前加final)
* 原因是方法中程序的执行是自上而下,当我们在内部类外访问m1方法时,访问之前i再被赋值就无法输出遵从自上而下的i值
* 避免该内部类之下局部变量再赋值
*
* 4.先在成员方法中创建其内部类的对象,调用内部类的成员方法,然后在外部类创建对象调用其成员方法,逐层逐级调用
*/
package u局部内部类;
public class OutClassjb {
public void m1(){
//局部变量
final int i = 10;
//因为是局部的只能在该方法用
//所以此处不能加访问控制权限修饰符
class InnerClass{
public void m2(){
System.out.println(i);//输出i
}
}
//i=100;
// 若不声明为最终变量,上面语句再进行赋值,i会改变,
// java自上而下:System.out.println(i)的语句是在上面的,
// 却是通过下面在 i=100; 语句这条语句执行后才调用的,所以如果i值改变JVM就会很纠结不知道输出哪个i值
//在该方法中创建对象
InnerClass inner = new InnerClass();
inner.m2();
}
//入口
public static void main(String[] args){
OutClassjb O = new OutClassjb();
O.m1();
}
}
4、匿名内部类
/*
* 指的是该内部类没有名字
*/
package u匿名内部类;
public class OutClassnm {
//静态方法
public static void m1(CustomerService cs){
cs.logout();
}
//入口
public static void main(String[] args){
//调用m1方法
//接口没法创建对象
//所以不能m1(new CustomerService());
//写一个接口的实现类可new一个实现类的对象
//m1(new CustomerServiceImp());系统已安全退出!
//不创建实现类,直接在参数列表写一个匿名内部类
m1( new CustomerService(){
//重写logout方法
public void logout(){
System.out.println("系统已安全退出!");
}
});
//匿名内部类优点:少定义一个类
//缺点:不能重复利用
}
}
interface CustomerService{
//退出系统
public abstract void logout();
}
//创建接口的实现类
/*class CusyomerServiceImp implements CustomerService{
//重写logout方法
public void logout(){
System.out.println("系统已安全退出!");
}
}*/