java内部类的使用

1.静态内部类

静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;

@Data
public class StaticAnimal {
    private String name;
    private static int age =18;
    static class Cat{
        public void miaomiao(){
            System.out.println(age);
            // System.out.println(name); error
        }
    }
    // 静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;
    // 静态内部类的创建方式,new 外部类.静态内部类()
    public static void main(String[] args) {
        Cat cat = new StaticAnimal.Cat();
        cat.miaomiao();
    }
}

2.成员内部类

/**
* 外部类
*/
@Data
public class Person {
    private String head;
    private int age;
    public String name;
    /**
     * 成员内部类
     */
    @Data
    protected class Eyes{
       private int num;
       private String shape;
       public int calculate(){
           // 成员内部类可以无条件的访问外部类的所有成员属性和成员的方法
           // 包括private成员和静态成员
           return num + age;
       }
    }
}

3.局部内部类

public class MainTest {
    public static void main(String[] args) {
        // 测试成员内部类
        Person person = new Person();
        person.setAge(10);
        person.setHead("大头");
        // 创建成员内部类的对象
        Person.Eyes eyes = person.new Eyes();
        eyes.setNum(15);
        int result = eyes.calculate();
        System.out.println(result);// 25
        MainTest mainTest = new MainTest();
        mainTest.hearing();
    }

    // 局部内部类
    public void hearing(){
        // 定义在某个方法内部的内部类,仅使用一次
        @Data
        class Ear{
            String shape = "circle";
            int distance;
        }
        Ear ear = new Ear();
        ear.setDistance(100);
        System.out.println("ear:" + ear); // ear:Ear(shape=circle, distance=100)
    }
}

4.匿名内部类

public class MainTest {
    public static void main(String[] args) {
        // Human是接口,不是类,  匿名内部类就是没有名字的类
        Human man = new Human() {
            @Override
            public void eat() {
                System.out.println("不知名学生正在吃饭!");
            }
        };
        man.eat();
    }
}
// 匿名内部类必须继承或实现一个已有的接口
public interface Human {
    public  void eat();
}

当所在的方法的形参需要被匿名内部类使用时,必须声明为 final

为什么要加final呢?是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题

public class MainTest {
    public static void main(String[] args) {
        final int age = 10;
        Human man = new Human() {
            @Override
            public void eat() {
                System.out.println("age = " + age);
            }
        };
        man.eat();
    }
}

匿名内部类在项目中的使用: 逐条从数据库取数据

private void indexWeChatMsg(String indexName) throws Exception {
        long startTime = System.currentTimeMillis();
        List<WeChatMsgDto> dtos = new ArrayList<>();
        weChatMsgMapper.getWeChatMsgInfo(new ResultHandler<WeChatMsgDao>() {
            @Override
            public void handleResult(ResultContext<? extends WeChatMsgDao> resultContext) {
                WeChatMsgDao dao = resultContext.getResultObject();
                WeChatMsgDto dto = new WeChatMsgDto();
                BeanUtils.copyProperties(dao, dto);
                String msgType = dao.getMsgType();
                String msgContext = dao.getMsgContext();
                dtos.add(dto);
            }
        });
    }
public interface ResultHandler<T> {
   void handleResult(ResultContext<? extends T> resultContext);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值