内部类(二)— 匿名内部类

前言:

最大特点就是匿名,无法在其它地方使用这个类,只能使用一次。

一、基本介绍:

  • 使用匿名内部类时,必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
  • 匿名内部类中是不能定义构造函数的,用初始构造块代替构造函数。
  • 匿名内部类中不能存在任何的静态成员变量和静态方法。
  • 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

其实很简单,就是一个简化写法,好了,讲这么多,不如看几个 例子。



接口是一样的,Thread类和Runnable接口的匿名内部类实现:

public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}
public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}

二、其他用法(SpringBoot源码中有用过):

一般我们见的多的就是多线程中Thread.start(),当然还有一个用处:当特别想用一个类的protected方法时,但是又不和这个类在同一个包下,是没办法调用的。这时声明一个匿名类继承该类,并定义一个方法,在这个方法内使用super调用你想调用的那个方法(当然,也可以继承那个类,也能调用,但是匿名的话简洁,因为我们只是想调用这个方法而已)。 



为什么用super,而this也是对的?

答:首先匿名内部类是继承或者实现一个类或接口的,所以用super是调用其父类的方法,当然这里是继承用this也会出现正确的结果。

三、使用形参为何要final

尽管Java8之后不要硬性加final,但是它会默认加上。

在编译时,内部类也会产生一个class文件,和外部class类并不是同一个class文件,仅仅只保留对外部类的引用。但是从Java程序角度来看是直接被调用。

注:Java8后可以不加final关键字


    public InnerClass(String name,String age){
        this.InnerClass$name = name;
        this.InnerClass$age = age;
    }
    
    
    public void display(){
        System.out.println(this.InnerClass$name + "----" + this.InnerClass$age );
    }
}

        实际上,内部类并不是调用方法传递的参数,而是利用自身的构造器对传入参数进行备份,自己内部方法调用的实际上是自己的属性而不是外部方法传递进来的参数。

       站在程序员角度这两个值是一样的,所以加上final来避免形参的不改变。

总之:拷贝引用,避免引用值发生改变,用final来引用值不可改变

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
局部内部类匿名内部类Java中的两种特殊类型的内部类。 局部内部类是定义在方法或者代码块内部的类。它的作用域被限定在所属的方法或代码块内部,不能在外部访问。局部内部类可以访问所属方法或代码块的局部变量,但是这些变量必须声明为final或者事实上的final(在Java 8之后,可以省略final关键字,但是不能对这些变量进行修改)。局部内部类的定义形式如下: ```java public class OuterClass { public void someMethod() { final int localVar = 10; class LocalInnerClass { public void innerMethod() { System.out.println(localVar); } } LocalInnerClass inner = new LocalInnerClass(); inner.innerMethod(); } } ``` 匿名内部类是没有名字的内部类,它直接继承了一个父类或者实现了一个接口。通常用于创建只使用一次的简单类。匿名内部类没有构造方法,因此可以直接通过实例化后的对象进行方法调用。匿名内部类的定义形式如下: ```java public class OuterClass { public void someMethod() { Thread thread = new Thread(new Runnable() { public void run() { System.out.println("Thread is running"); } }); thread.start(); } } ``` 在上述代码中,我们使用匿名内部类实现了Runnable接口,并在Thread类的构造方法中传入了该匿名内部类的实例。 总结一下,局部内部类是定义在方法或代码块内部的类,它的作用域被限定在所属的方法或代码块内部;而匿名内部类是没有名字的内部类,通常用于创建只使用一次的简单类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值