java内部类总结(静态内部类、成员内部类、局部内部类、匿名内部类)

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("系统已经安全退出!");
    }
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值