Skip to content

Java高手训练营第五章第七节:匿名对象

ufofVincent edited this page Jan 8, 2016 · 5 revisions

5.7 匿名对象

5.7.1 匿名对象:访问成员

我们之前如果要访问类中的字段或者方法,必须要实例化这个类的一个对象。无论要访问多少次,都得要实例化。如果我只需要访问一次,可能稍微显得有一些麻烦。

假如说我想要访问Dog类的bark()方法:

class AnonymousObjectDemo{
        public static void main(String[] args){
            Dog dog = new Dog();   //实例化
            dog.bark();                   //访问方法
        }
}

class Dog{
    String name;
    int age;
    int height;

    void lookAfterHouse(){
        System.out.println("看家");
    }
    void eatBone(){
        System.out.println("吃骨头");
    }
    void bark(){
        System.out.println("汪");
    }
}

结果:

仅仅访问一个方法,就得要实例化一个实例。这样的做法实在有一些麻烦。

匿名对象是指,在创建对象的时候不指向任何实例。可以通过这个对象来直接访问方法。但是由于其没有指向任何实例,Java把它视为垃圾。其过一段时间后会被垃圾回收器清除掉。

上面这个例子可以简化为:

class AnonymousObjectDemo{
        public static void main(String[] args){
            new Dog().bark();   //创建匿名对象
        }
}

class Dog{
    String name;
    int age;
    int height;

    void lookAfterHouse(){
        System.out.println("看家");
    }
    void eatBone(){
        System.out.println("吃骨头");
    }
    void bark(){
        System.out.println("汪");
    }
}

结果:

在new Dog()后面直接加上.bark()访问bark方法。这样做不需要创建实例,所以可以节省栈内存中的空间。 如果要访问多个方法,还是得要实例化对象。

注意: 使用匿名对象来对字段进行赋值是没有意义的。比如说:

new Dog().age = 5;

好的,你把他的age字段给改了,但是你以后可以用得上吗?你刚刚new出来的对象因为没有实力已经在内存中找不到了或被垃圾处理器给清除了。所以说对字段进行赋值是没有意义的。

5.7.2 匿名对象:参入参数

如果说一个方法需要一个对象来作为参数的话,一般的做法是先实例化,然后将实例传入。例如:

class AnonymousObjectDemo{
    public static void main(String[] args){
        MyClass mc = new MyClass();                //实例化
        Demo.aMethod(mc);                          //传入实例
    }
}

class Demo{
    public static void aMethod(MyClass mc){        //创建静态方法,参数为MyClass对象
        System.out.println("Method runs");
    }
}

class MyClass{}

结果:

Method runs

可以在调用函数的时候不用传入实例。可以这样简化:

class AnonymousObjectDemo{
    public static void main(String[] args){
        Demo.aMethod(new MyClass());                //传入匿名对象
    }
}

class Demo{
    public static void aMethod(MyClass mc){         //创建静态方法,参数为MyClass对象
        System.out.println("Method runs");
    }
}

class MyClass{}

结果:

Method runs

在主方法中调用aMethod()方法时,传入的是new MyClass(),这样做是将匿名对象传入方法中。这样的做法不需要创建实例,节省了栈内存。

本章小结

  • 匿名对象是指在创建对象的时候不让其指向任何实例
  • 匿名对象可以用于:
    1. 调用方法/字段一次
    2. 作为参数传入方法
Clone this wiki locally