-
匿名解释
匿名就是没有名字的对象,在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储
匿名类/对象其实就是类/对象,对象具有的功能匿名类/对象都具有,只不过有名字的类/对象可以重复使用,匿名类/对象只能用一次罢了。
-
匿名类/对象特点
1、由于我们没有记录堆内存对象的地址值,所以只能用一次,再次使用就找不到了
2、匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间
-
代码演示
public class AnonymityTest {
public static void main(String[] args) {
method(new Student());//匿名对象
System.out.println("********************");
worker w = new worker();
method1(w); //非匿名的类非匿名的对象
method1(new worker()); //非匿名的类匿名对象
System.out.println("********************");
//创建匿名子类对象
Person p = new Person() {
@Override
public void eat() {
System.out.println("吃东西(匿名子类对象创建)");
}
@Override
public void breath() {
System.out.println("呼吸(匿名子类对象创建)");
}
};
method1(p);
System.out.println("********************");
//创建匿名子类的匿名对象
method1(new Person() {
@Override
public void eat() {
System.out.println("吃东西(匿名子类的匿名对象创建)");
}
@Override
public void breath() {
System.out.println("呼吸(匿名子类的匿名对象创建)");
}
});
}
public static void method(Student s){
s.eat();
}
public static void method1(Person p){
p.eat();
p.breath();
}
}
class worker extends Person {
@Override
public void breath() {
System.out.println("工人带面具呼吸");
}
@Override
public void eat() {
System.out.println("工人吃饭");
}
}
//执行结果:
/*
学生吃饭
********************
工人吃法
工人带面具呼吸
工人吃饭
工人带面具呼吸
********************
吃东西(匿名子类对象创建)
呼吸(匿名子类对象创建)
********************
吃东西(匿名子类的匿名对象创建)
呼吸(匿名子类的匿名对象创建)
*/
上文代码用到的Person类和Student类的展示
class Person{
String name;
int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("人吃饭");
}
public void breath(){
System.out.println("人呼吸");
}
}
class Student extends Person{
public Student() {}
public Student(String name, int age) {
super(name, age);
}
@Override
public void breath() {
System.out.println("学生呼吸");
}
@Override
public void eat() {
System.out.println("学生吃饭");
}
@Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}