局部内部类和匿名内部类的简单介绍,欢迎指正补充!
局部内部类
定义:如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
局部内部类只有当前所属的方法才能使用它,出了这个方法就不可以使用。它和成员内部类的区别在于局部内部类的访问仅限于方法内。
需要注意的是,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
局部内部类的语法修饰符 class 外部类名称 {
修饰符 返回值类型 外部类方法名称(参数列表) {
class 局部内部类名称 {
// ...
}
}
}
局部内部类的实例: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();
}
}
实现类: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();
}
}
输出结果:
匿名内部类:
为什么要有匿名内部类?
如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类
实现匿名内部类的前提条件
通常这个类需要实现某个接口或者继承某个类
匿名内部类的语法:new 父类名或者接口名() {
重写父类方法或者实现接口中的方法。
也可以自定义其他方法。
};
什么时候定义匿名内部类?
匿名内部类只是为了简化书写,匿名内部类有局限,通常定义匿名
内部类时,该类方法不超过3个
匿名内部类的好处和弊端:好处:
简化代码书写弊端:
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();
}
}
运行结果:
小结:
类的权限修饰符:
由图可知:public > protected > 默认的(default) > private
定义一个类的时候,权限修饰符规则:外部类:public / default
成员内部类:public / protected / default / private
局部内部类:什么都不能写
匿名内部类:匿名内部类,是唯一一种没有构造器的类。
匿名内部类,不能有访问修饰符和static修饰符的。
匿名内部类,在创建对象的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
匿名对象,在调用方法的时候,只能调用唯一一次。如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
匿名内部类是省略了实现类/子类名称,但是匿名对象是省略了对象名称