Java基础学习:局部内部类,匿名内部类

后端学习评论12.2K字数 1936阅读6分27秒阅读模式

局部内部类和匿名内部类的简单介绍,欢迎指正补充!

局部内部类

定义:如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。文章源自亦枫博客-https://yflad.cn/2067.html

局部内部类只有当前所属的方法才能使用它,出了这个方法就不可以使用。它和成员内部类的区别在于局部内部类的访问仅限于方法内。文章源自亦枫博客-https://yflad.cn/2067.html

需要注意的是,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。文章源自亦枫博客-https://yflad.cn/2067.html

 文章源自亦枫博客-https://yflad.cn/2067.html

局部内部类的语法

修饰符 class 外部类名称 {
    修饰符 返回值类型 外部类方法名称(参数列表) {
        class 局部内部类名称 {
            // ...
        }
    }
}

 文章源自亦枫博客-https://yflad.cn/2067.html

局部内部类的实例:

package cn.oop.d1_inner;

/**
 * @Author: yflad (bat@yflad.cn)
 * @Blog: https://yflad.cn
 * @Date: 2019-01-05
 * @Role: 局部内部类
 */
public class D3_Local {

    public void Stu() {
        class Student {  // 局部内部类
            int age = 20;

            public void Students() {
                System.out.println(age);  // 20
            }
        }

        Student student = new Student();  // 创建一个对象来调用局部内部类里面的方法
        student.Students();
    }
}

 文章源自亦枫博客-https://yflad.cn/2067.html

实现类:文章源自亦枫博客-https://yflad.cn/2067.html

package cn.oop.d1_inner;

/**
 * @Author: yflad (bat@yflad.cn)
 * @Blog: https://yflad.cn
 * @Date: 2019-01-05
 * @Role:
 */
public class D3_LocalTest {
    public static void main(String[] args) {
        D3_Local local = new D3_Local();
        local.Stu();
    }
}

 文章源自亦枫博客-https://yflad.cn/2067.html

输出结果:文章源自亦枫博客-https://yflad.cn/2067.html

Java基础学习:局部内部类,匿名内部类文章源自亦枫博客-https://yflad.cn/2067.html

 文章源自亦枫博客-https://yflad.cn/2067.html

匿名内部类:

为什么要有匿名内部类?文章源自亦枫博客-https://yflad.cn/2067.html

如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类文章源自亦枫博客-https://yflad.cn/2067.html

 文章源自亦枫博客-https://yflad.cn/2067.html

实现匿名内部类的前提条件

通常这个类需要实现某个接口或者继承某个类文章源自亦枫博客-https://yflad.cn/2067.html

 文章源自亦枫博客-https://yflad.cn/2067.html

匿名内部类的语法:

new 父类名或者接口名() {
    重写父类方法或者实现接口中的方法。
    也可以自定义其他方法。
};

 文章源自亦枫博客-https://yflad.cn/2067.html

什么时候定义匿名内部类?

匿名内部类只是为了简化书写,匿名内部类有局限,通常定义匿名文章源自亦枫博客-https://yflad.cn/2067.html

内部类时,该类方法不超过3个文章源自亦枫博客-https://yflad.cn/2067.html

 文章源自亦枫博客-https://yflad.cn/2067.html

匿名内部类的好处和弊端:

好处:

简化代码书写

弊端:

1)不能直接调用自己的特有方法;2)不能执行强转换动作;3)如果该类里面方法较多,不允许使用匿名内部类

 

匿名内部类的实例:

package cn.oop.d1_inner;

/**
 * @Author: yflad (bat@yflad.cn)
 * @Blog: https://yflad.cn
 * @Date: 2019-01-06
 * @Role: 匿名内部类
 */
public interface D4_Anonymity {
    void Stu();
}

 

实现类:

package cn.oop.d1_inner;

/**
 * @Author: yflad (bat@yflad.cn)
 * @Blog: https://yflad.cn
 * @Date: 2019-01-06
 * @Role:
 */
public class D4_AnonymityTest {
    public static void main(String[] args) {
        D4_Anonymity anonymity=new D4_Anonymity() {
            @Override
            public void Stu() {
                System.out.println("我是匿名内部类");
            }
        };
        anonymity.Stu();
    }
}

 

运行结果:

Java基础学习:局部内部类,匿名内部类

 

小结:

类的权限修饰符:

Java基础学习:局部内部类,匿名内部类

由图可知:public > protected > 默认的(default) > private

定义一个类的时候,权限修饰符规则:

  1. 外部类:public / default
  2. 成员内部类:public / protected / default / private
  3. 局部内部类:什么都不能写

 

匿名内部类:

  1. 匿名内部类,是唯一一种没有构造器的类。
  2. 匿名内部类,不能有访问修饰符和static修饰符的。
  3. 匿名内部类,在[code]创建对象[/code]的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
  4. 匿名对象,在[code]调用方法[/code]的时候,只能调用唯一一次。如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
  5. 匿名内部类是省略了[code]实现类/子类名称[/code],但是匿名对象是省略了[code]对象名称[/code]
继续阅读
扫扫关注公众号
weinxin
我的微信
扫扫体验小程序
weinxin
我的公众号
亦枫
  • 本文由 发表于 2019年1月6日 00:28:44
评论  0  访客  0
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定