6.2 匿名类

参考书籍:Java面向对象程序设计(第二版)--耿祥义 张跃平编著

 

一:和类有关的匿名类

 Java允许用户直接使用一个类的子类的类体创建一个子类对象

在创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称为匿名类

匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象(不可声明,但可创建)

附加:如一个类A,他的无参数的构造方法是A(){}

 

比如假设A是类,那么下列代码是用A类的一个子类(匿名类)创建对象

new A(){

匿名类的类体

};

尽管匿名类创建的对象没有经过类声明的步骤,但匿名对象的引用可以传递给一个匹配的参数,匿名类的常用方式是向方法的参数传递

如:

A类

package p2;

abstract class A {
    //private abstract void Aa();
    //抽象类不能实例化
    //这相当一个没有用的方法
    public abstract void Aa();
}

 

B类

package p2;

class B {
    void  f(A a){     //这里的a相当于形参
        a.Aa();
    }
}

 

主类

package p2;

public class Lianxi2 {
    public static void main(String args[]){
        A a = new A(){         //匿名类创建对象,然后把对象的引用赋给a,a是一个上转型对象
            public void Aa(){    //重写方法
                System.out.println("我是A");
            }
        };
        a.Aa();            //上转型对象a调用重写的方法

        B b =new B();        //类B实例化new 一个对象b常量
        b.f(new A(){    //b调用方法f,括号里面相当于上面那部分,把对象引用传递给方法f里面的参数a
            public void Aa(){
                System.out.println("我是B");
            }
        });

    }
}

 

 

注意:

  1. 匿名类可以继承或者重写父类的方法
  2. 我们使用匿名类时候,必然是在某个类中直接用匿名类创建对象,因此,匿名类一定是内部类
  3. 匿名类可以访问外嵌类中的成员变量和方法
  4. 匿名类的类体中不可以声明static成员变量和static方法

 

 

:和接口有关的匿名类

假如A是一个接口,那么Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了A接口的类去掉声明后的类体,称为匿名类

下面代码是用实现了A 接口的类(匿名类)创建对象

new A(){

实现接口的匿名类的类体

};

 

如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,但类体必须重写接口中的所有方法

如:void f(A a)

其中的参数a是接口,那么在调用f时,可以向f的参数传递一个匿名对象

如:

f(new A(){

实现接口的匿名类的类体

})

猜你喜欢

转载自blog.csdn.net/weixin_42717928/article/details/81186232
今日推荐