局部内部类和匿名内部类的简单介绍,欢迎指正补充!
局部内部类
定义:如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。文章源自亦枫博客-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
文章源自亦枫博客-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
匿名内部类的好处和弊端:
匿名内部类的实例:
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(); } }
运行结果:
小结:
类的权限修饰符:
由图可知:public > protected > 默认的(default) > private
定义一个类的时候,权限修饰符规则:
- 外部类:public / default
- 成员内部类:public / protected / default / private
- 局部内部类:什么都不能写
匿名内部类:
- 匿名内部类,是唯一一种没有构造器的类。
- 匿名内部类,不能有访问修饰符和static修饰符的。
- 匿名内部类,在[code]创建对象[/code]的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
- 匿名对象,在[code]调用方法[/code]的时候,只能调用唯一一次。如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
- 匿名内部类是省略了[code]实现类/子类名称[/code],但是匿名对象是省略了[code]对象名称[/code]