java匿名内部类详解-java匿名类
内部类:一个类在另一个类中
如:身体与心脏的关系,汽车与发动机的关系
分类:(1)成员内部类
(2)局部内部类(包括匿名内部类)
成员内部类:
定义格式:修饰类外部类名{
修饰类内部类名{}}
注:内用外用,免费获取; 对于外部使用内部使用,需要一个内部类对象
public class Body {//外部类
int num;//外部类成员变量
public class Heart{//内部类
public void beat(){
System.out.println("心脏");
System.out.println(num);//内部类访问外部类,直接访问
}
}
}
内部类的使用:
(1)间接方式:在外部类的方法中,使用内部类; 主函数调用外部类的方法
public class Body {//外部类
int num;//外部类成员变量
public class Heart{//内部类
public void beat(){
System.out.println("心脏");
System.out.println(num);//内部类访问外部类,直接访问
}
}
void method(){
System.out.println("外部类方法执行");
Heart heart =new Heart();
heart.beat();//外部类方法间接访问内部类
}
}
(2)直接方式:直接创建内部类
外部类名.内部类名对象名 = new 外部类名().内部类名();
Body.Heart heart=new Body().new Heart();
heart.beat();
内部类的重复名称:
使用外部类.this访问外部类,this访问内部类java匿名内部类详解,outer访问外部类
局部内部类:
定义:类定义在方法内部
特点:只有当前方法可以使用内部类
格式:public class { method () { class }}
使用:在方法中定义一个局部内部类,在main函数中调用外部类对象。 方法
package 内部类;
public class Body {//外部类
void method(){
class Heart{//局部内部类
public void beat(){
System.out.println("心脏");
}
}
//在方法中定义局部内部类 使用局部内部类
Heart heart=new Heart();
heart.beat();
}
}
Body a=new Body();
a.method();
为类定义权限修饰符
外部类:公共/(默认)
成员内部类:public/protected/(default)/private
局部内部类:只有所属的方法可以访问java匿名内部类详解,什么都不能写
内部类的最后
如果局部内部类访问方法的局部变量,那么这个局部变量必须是[valid final],(加final关键字或者只赋值一次)
原因:
新对象在堆内存中
●局部变量跟随方法,在栈内存中
方法运行结束后,立即出栈,局部变量立即消失
●但是新对象会一直存在于堆中,直到垃圾回收消失
所以如果new对象访问的是局部变量,局部变量是常量,可以复制一份,防止局部变量消失
匿名内部类:
简介:如果接口的实现类(或者父类的子类)只需要使用唯一一个
在这种情况下,您可以省略类的定义并使用 [匿名内部类] 代替。
定义格式:接口名对象名=新接口名(){//覆盖所有抽象方法}
public interface MyInterface {
void method();
}
public class Dmeo {
public static void main(String[] args) {
MyInterface obj=new MyInterface() {
//下面的代码块是匿名内部类,覆盖重写了接口的方法
@Override
public void method() {
System.out.println("匿名内部类实现了方法");
}
};
}
}
obj.method();//匿名内部类实现了方法
优点:可以单独保存一个类的定义
防范措施:
1.new表示创建对象的动作
2.接口名是匿名内部类需要实现的接口
3. {...} 匿名内部类的内容
4.匿名内部类在创建对象时只能使用一次。
5.匿名内部类也可以省略对象名,直接写成new interface(){}。 方法,并成为匿名对象
匿名对象只能在[调用方法]时被调用一次
6.匿名内部类省略[实现类/子类名],但匿名对象省略[对象名]