匿名内部类
内部类
要点
1、什么是内部类?
内部类:在类的内部又定义了一个新的类。被称为内部类。
2、内部类的分类:
静态内部类:类似于静态变量
实例内部类:类似于实例变量
局部内部类:类似于局部变量
3、使用内都类编写的代码,可读性很差。能不用尽量不用。
4、匿名内都类是局部内部类的一种。
因为这个类没有名字而得名,叫做匿名内都类。
5、学习匿名内部类主要是让大家以后在阅读别人代码的时候,能够理解。
匿名内部类有两个缺点:
缺点1:太复杂,太乱,可读性差
缺点2:类没有名字,不能重复使用,只能用一次。
实例一
class Test{
//静态变量
static String country;
//该类在类的内部,所以称为内部类
//由于前面有static,所以称为”静态内部类”
static class Inner1{}
//实例变量int age;
//该类在类的内部,所以称为内部类
//没有static叫做实例内部类
class Inner2{}
//方法
public void dosome(){
//局部变量
int i=100;
//该类在类的内部,所以称为内部类/局部内部类。
class Inner3{}
}
public void doother{
//dosome()方法中的局部内部类Inner3,在doother()中不能用
}
//main方法,入口
public static void main(String[] args){
MyMath mm = new MyMath();
//使用匿名内部类
//这里表面看上去好像是接口可以直接new了,实际上后面的{}代表了对接口的实现
mm.mySum(new Compute(){
public int sum(int a, int b){
return a+b;
}
},200,300);
}
}
//负责计算的接口
interface Compute{
int sum(int a,int b);
}
//数学类
class MyMath{
public void mySum(Compute c, int x, int y){
int retvalue = c.sum(x,y);
System.out.println(x + "+" + y + "=" + retvalue);
}
实例二
public class MyClass {
private static class InnerClass{
//静态方法
public static void m1(){
System.out.println("静态内部类的m1方法执行");
}
//实例方法
public void m2(){
System.out.println("静态内部类中的实例方法执行");
}
}
public static void main(String[] args) {
//静态方法执行直接通过类名调用
MyClass.InnerClass.m1();
//实例方法执行要创建对象
MyClass.InnerClass mi=new MyClass.InnerClass();
mi.m2();
//Set集合中存储对象类型为InnerClass
Set<MyClass.InnerClass> set1=new HashSet<>();
//Set集合中存储对象类型为String
Set<String> set2=new HashSet<>();
}
}