内部类有如下特征:
- 内部类被编译成名为OuterClassName$InnerClassName.class的类。
- 内部类可以引用定义在它嵌套的外部类中的数据和方法,所以不需要将外部类对象的引用传递给内部类的构造方法,因此,内部类可以拿程序简单和简洁。
- 声明用可见性修饰符声明内部类,遵从应用于一般类成员的可见性规则。
- 可以将内部类声明为static。一个static内部类可以使用外部类的名字访问。一个static类是不能访问外部类的非静态成员的。
- 内部类的对象经常在外部类中创建。但是也可以从另一个类中创建一个内部类的对象。如果该内部是非静态的,就必须先创建一个外部类的实例,然后用下面的语法创建一个内部类的对象:
Java代码
- OuterClass.InnerClass innerObject = OutObject.new Innerclass()
OuterClass.InnerClass innerObject = OutObject.new Innerclass()
.如果内部类是静态的,那么使用下面的语法为它创建一个对象:Java代码- OuterClass.InnerClass innerObject = new OutObject.Innerclass()
OuterClass.InnerClass innerObject = new OutObject.Innerclass()
匿名内部类是一种特殊的内部类,所以有很多方面都应把它当作内部类对待。除此之外,它还不以下特征。
- 匿名内部类必须是扩展父类或实现接口的。但是它不能有明确的extends或implements语句。
- 匿名内部类必须实现父类或接口中所有的抽象方法。
- 匿名内部类总是使用父类的无参数构造方法来创建实例。如果匿名内部类实现了接口,构造方法就是Object().
- 匿名内部类编译为名为OuterClassName$n.class的类。如,如果外部类Test有两个匿名类,那么它们就编译成Test$1.class和Test$2.class。
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。
java 代码
- interface pr
- {
- void print1();
- }
- public class noNameClass
- {
- public pr dest()
- {
- return new pr(){
- public void print1()
- {
- System.out.println("Hello world!!");
- }
- };
- }
- public static void main(String args[])
- {
- noNameClass c=new noNameClass();
- pr hw=c.dest();
- hw.print1();
- }
- }
pr也可以是一个类但是你外部调用的方法必须在你的这个类或接口中声明外部不能调用匿名类内部的方法
Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。
如下:
- import java.awt.*;
- import java.awt.event.*;
- public class QFrame extends Frame {
- public QFrame() {
- this.setTitle(\"my application\");
- addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- dispose();
- System.exit(0);
- }
- });
- this.setBounds(10,10,200,200);
- }
- }
内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
}
new 是建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。
这个用法的作用是:创建一个对象的实例,并且 override 它的一个函数。打开 WindowAdapter 的代码可以发现。它是一个抽象类。它是对 WindowListener 接口的一个实现。Frame.addWindowListner(); 的参数是一个 WindowListner ,而实现上是传一个从WindowAdapter 派生出的一个匿名类。
1.怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。
先看段伪代码
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... } //这里就是有个匿名内部类
}
一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。
但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
其实拆分上面的匿名内部类可为
class SonOne extends Father{
... //这里的代码和上面匿名内部类,大括号中的代码是一样的
}
public class Test{
Father f1 = new SonOne() ;
}
2.匿名内部类的注意事项
注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
·静态内部类只能访问外部类的静态变量或静态方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名
3.匿名内部类的作用
Java的内部类和C++中的嵌套类有本质的不同:C++的嵌套类没有指向包装类的句柄。仅仅表达一个封装的概念;但是Java的内部类不同,它可以访问包装类的成员(这表示它拥有指向包装类的句柄)。
匿名内部类是内部类的一种简化写法:return new Wrapper {
...
};
等价于:Wrapped extends Wrapper {
...
}
return new Wrapped();
难道匿名内部类就只这一点作用吗?
考虑一下这样的case:
interface ICount {
int count();
}
class Parent {
int i = 0;
int count() {
return i++;
}
}
有一个类Child,它既想继承Parent的count()方法,又想实现ICount接口中的count方法,这个时候怎么办呢?内部类就可以大显身手了:
class Child extends Parent {
ICount getCount() {
return new ICount {
int i = 0;
int count() {
return (i *= 2);
}
}
}
}
相关推荐
java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类
java 匿名内部类的使用规范 java 匿名内部类的使用规范 java 匿名内部类的使用规范
主要讲述了JAVA中内部类和匿名内部类的相关问题。
16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
本文介绍内部类和匿名类在Java代码中是如何具体工作的,如何正确使用它们,以及如何避免一些常见的错误。 下面来看看这些特性具体是如何工作的? 1、非静态内部类 如果内部类没有指定static修饰符,拥有对...
Java 匿名内部类的学习demo
- 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...
Java中的内部类和匿名类!
java中的匿名内部类总结
掌握java四中匿名内部类
主要介绍了Java内部类和匿名内部类的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
详细介绍JAVA内部类的用法,用途,基本语法,及匿名类用法
面向对象程序设计中,可以将一个类的定义 ...匿名内部类就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
Java 1.1通过对Java语言规范进行...在那些修改中,最引人注目的就是内部类和匿名类。如运用得当,它们可使程序更易理解和维护。本文来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误。
1.接口-简介 2.接口-作用 3.接口-定义方式 4.接口-实现 5.接口-与抽象类之区别 6.接口-应用示例(设计模式) 7....内部类-匿名内部类 13.内部类-静态内部类 14.综述
使用swift匿名内部类,实现jave匿名内部类功能,java中的匿名内部类,可以做到的是,就是想要重写一个类中的方法,并且执行,但是不想重新定义一个类,因为只调用一次,或者调用多次,但是每次调用的实现过程都不同,这时候就...
Java语言中的内部类根据定义的位置和访问权限可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类是定义在类的内部且与类的实例相关联的类;局部内部类是定义在方法或作用域内的类;匿名内部...
Java特别篇--匿名对象与匿名内部类
对于Java内部类的使用进行总结,根据语法,特征,注意事项等创建出的关于内部类的思维导图,欢迎下载使用!编辑软件freemind