匿名方法内部类中不能定义构造方法:因为构造方法是需要类名的,但是匿名意味着没有类名。

当想通过匿名子类对象来访问,子类特有的方法时,应该如何做?

java 匿名调用 java匿名方法_外部类

当我们创建好,子类对象引用时,直接用引用对象a.访问只能访问子类重写父类test方法,因为我们直接在new A().来访问子类方法

java 匿名调用 java匿名方法_类对象_02


却发现如上错误,这是怎么回事呢?

分析:现在使用匿名子类对象来访问子类方法,所以可以访问子类对象方法,访问到test1()方法,最后进行赋值,将一个void的对象赋值给A类型,但是test1方法返回类型为void,因此会报require A类型,find的是void。

这整个过程其实如下:

public class Test {
    public static void main(String[] args) {
        A b=new B();
        b.test();
    }
}
class A{
    void test(){
        System.out.println("B.test");
    }
}
class B extends A{
    void test(){
        System.out.println("C.test");
    }
    void test1(){
        System.out.println("子类B对象方法");
    }
}

java 匿名调用 java匿名方法_类对象_03


这是因为多态的原因:子类对象可以访问的方法是由父类引用决定的。

java 匿名调用 java匿名方法_类对象_04


这就是为什么会报错的原因。

java 匿名调用 java匿名方法_匿名内部类_05


在使用匿名内部类时,要记住以下几个原则:

 · 匿名内部类不能有构造方法。 (因为匿名内部类是没有类名的)

 · 匿名内部类不能定义任何静态成员、方法和类。

 · 匿名内部类不能是抽象类。(因为在创建匿名内部类的时候,会立即创建匿名内部类的对象。从而也可知匿名内部类必须实现它的抽象父类或者接口里包含的所有抽象方法)

 · 匿名内部类不能是public,protected,private,static。

 · 只能创建匿名内部类的一个实例。

· 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

 · 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

· 内部类只能访问外部类的静态变量或静态方法。

匿名类和内部类中的中的this :

有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。

关于内部类的作用:

一个内部类对象可以访问创建它的外部类对象的内容, 甚至包括私有变量!Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。

如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用:

外部类名.this

Java中的静态内部类是没有了指向外部的引用,类似C++中的嵌套类。Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内(记住:匿名内部类就是局部内部类的形式之一)。在java的事件处理的匿名适配器中,匿名内部类被大量的使用。

如果是在一个方法中的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。即如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量,否则系统将报错。