匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.
一、由于匿名内部类没有名字,所以它没有构造函数。因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,换言之:匿名内部类完全把创建对象的任务交给了父类去完成。
二、在匿名内部类里创建新的方法没有太大意义,但它可以通过覆盖父类的方法达到神奇效果,如上例所示。这是多态性的体现。
三、因为匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。
new <类或接口> <类的主体>
匿名类
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。
这就要采用另一种形式的new语句,如下所示:
new <类或接口> <类的主体>
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。
如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。
注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。
exp:
return new Contents() {
private int i = 11;
public int value() { return i; }
};
这种奇怪的语法要表达的意思是:“创建从Contents衍生出来的匿名类的一个对象”。由new表达式返回的句柄会自动上溯造型成一个Contents句柄。匿名内部类的语法其实要表达的是:
class MyContents extends Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
若试图定义内部类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象必须是final属性.
public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
}
分享到:
相关推荐
Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类?匿名内部类是没有名字的内部类。不能 extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 final 修饰符(关键字)...
另外,在Java面试中,Anonymous Inner Class(匿名内部类)也是一个重要的知识点。匿名内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 在Java中,还有...
内部类分为几种类型,包括静态成员类(Static member class)、局部内部类(Local inner class)、匿名内部类(Anonymous inner class)以及嵌套接口(Nested interface)。在本讨论中,我们将主要聚焦于静态成员类...
public class AnonymousInnerClass { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("匿名内部类的run方法"); } }; ...
匿名内部类 inner class 马克-to-win java视频的详细介绍
- **Inner Class**:内部类,依赖于外部类的实例存在,通过外部类实例访问。内部类可以访问外部类的所有成员,包括私有成员,但外部类不能直接访问内部类的成员,除非通过内部类的实例。 ### 4. & 和 && 的区别 `&...
本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...
- **Inner Class**:通常称为内部类,它可以访问外部类的所有成员,包括私有成员,并且有一个隐含的引用指向外部类的实例。这使得内部类可以轻松地访问外部类的字段和方法,但这也意味着每个内部类实例都与一个外部...
4. 匿名内部类(Anonymous Inner Class) 匿名内部类没有名字,通常用于简短的、一次性的实现。它们常用于接口回调或简化创建继承自特定类或实现特定接口的新类。匿名内部类可以直接实例化,如 `new Interface() { ...
匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在需要的地方直接定义一个类的实例,而无需声明一个独立的类。这种类没有名字,通常用于实现接口或者继承抽象类,尤其在事件处理、回调函数以及创建一次...
4. 匿名内部类(Anonymous Inner Class) 匿名内部类没有名字,通常用于简洁地实现单个接口或继承单个类,并且往往与事件监听器、回调函数等场景结合使用。它会隐式地继承一个类或实现一个接口,并可以覆盖父类方法...
匿名内部类 inner class 马克-to-win java视频的详细介绍
这里,我们创建了一个匿名内部类来继承`BaseClass`并实现了`print`方法。 4. **局部变量和final关键字** 匿名内部类可以访问其所在的作用域内的局部变量,但必须注意,对于非final的局部变量,匿名内部类只能引用...
当编译器遇到匿名内部类时,会生成这种属性。在某些情况下,如使用ProGuard或混淆代码时,如果处理不当,可能会出现忽略这个属性的警告。 最初,开发者可能会误以为这是由于第三方库的jar包问题,于是尝试替换对应...
在标签"AnonymousInner"提示下,我们可以创建一个匿名内部类来实现某个接口: ```java interface MyInterface { void doSomething(); } public class Main { public static void main(String[] args) { ...
- **匿名内部类(Anonymous Inner Class)**:没有名字的内部类,通常用于实现接口或抽象类的简洁方式,常用于事件监听器等场景。 - **静态内部类(Static Nested Class)**:静态内部类不持有对外部类的引用,...
System.out.println("This is an anonymous inner class."); } }; mi.myMethod(); } } ``` #### 四、总结 通过上述介绍,我们可以看出内部类为Java程序设计提供了一种非常强大的机制,可以用来组织代码,...
内部类可以访问外部类的成员变量和方法,而匿名内部类则是内部类的一种特殊形式,下面我们将详细介绍Java内部类和匿名内部类的用法说明。 一、内部类 内部类是指在一个类中定义的另一个类,它可以访问外部类的成员...
根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...
4. **匿名内部类**(Anonymous Inner Class) 这些内部类之间存在一些共性: - **编译后的文件格式**:内部类最终会被编译成独立的`.class`文件,文件名通常为外部类名称加上`$`符号和内部类名称。 - **访问控制**...