关于JAVA匿名内部类的一点讨论

基本理论:

关于JAVA内部类:一个内部类的定义是定义在另一个类内部的类。
   存在它的原因是:
   1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
   2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
   3.匿名内部类可以很方便的定义回调。
   4.使用内部类可以非常方便的编写事件驱动程序。

其实它真正的目的仅仅为了定义回调--进一步就是事件驱动。
接口和回调:编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。

注意事项:

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

public class A {
  int i = 1;
  public A() {
    Thread thread = new Thread() {
      public void run() {
        for(;;) {
          A.this.run();
          try {
            sleep(1000);
          } catch(InterruptedException ie) {
          }
        }
      }
    };
    thread.start();
  }
  public void run() {
    System.out.println("i = " + i);
    i++;
  }
  public static void main(String[] args) throws Exception {
    new A();
  }
}

在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。
这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的
。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。

对于这个例子:

this.test(new Inner(){
             public void method1(){
                 System.out.print("1111");
           }

             public void method2(){
                 System.out.print("22222");
           }
});

这个时候调用test()方法,那Inner类的method1和method2是什么时候被调用的?难道也是this对象向他们发消息(比如传入一个参数)吗?还是直接显式的调用??

对于Inner类,除了this这个类,就是this.test(...那句中的this,它能够调用Inner类的方法,其他地方都不行,然而,这也需要你在类中有个地方保存有对这个内部类实例的引用才可以。再说明一次,内部类是用来在某个时刻调用外面的方法而存在的--这就是回调。
为了说明内部类实例的方法只能在包容类的实例中调用,其他地方无法调用,给个例子如下:
JAVA2实用教程源码:

/** 一个应用程序,用来演示内部类的使用 */
/** 类Outer */
class Outer{
private static int size;
/** 内部类Inner的声明 */
public class Inner{
private int size;
/** 方法doStuff() */
public void doStuff(int size){
size++; //存取局部变量
this.size++; //存取其内部类的成员变量
Outer.this.size++; //存取其外部类的成员变量
System.out.println(size+" "+this.size+" "+Outer.this.size);
}
}//内部类Inner结束
/** 类Outer中定义的实例方法testInner()方法 */
public void testInner(){
Inner i=new Inner();
i.doStuff(5);
}
/** main()方法 */
public static void main(String[] a){
Outer o=new Outer();
o.testInner();
}
}//类Outer结束

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java内部类
, 内部类
, 匿名内部类
, 方法
, this
, java匿名类
, public
, 一个
, INNER
, 内部类实例
, 匿名函数类
, java匿名内部类
, 中的匿名类
内部
java匿名内部类、java匿名内部类详解、java中匿名内部类、java匿名内部类的作用、java多线程匿名内部类,以便于您获取更多的相关知识。

时间: 2024-09-14 05:18:40

关于JAVA匿名内部类的一点讨论的相关文章

java多态问题的讨论 谢谢

问题描述 java多态问题的讨论 谢谢 java多态中 父类的引用指向子类对象 可是如果只是子类的引用指向子类对象 不是也能调用父类.子类的方法吗 为什么要让 父类的引用指向子类对象? 解决方案 你可以搜一下面向抽象编码这个概念,本质上来说,变量定义的类型是父类类型还是子类类型,只要能满足你的功能需求,都是一样的效果的. 但是,如果编程中,遵循这个原则,将引用变量定义为抽象类型(即父类类型的话),那么你的代码就更容易扩展和维护了. 举个例子,比如你定义了一个UserService 接口类型,它的

老生常谈 java匿名内部类_java

匿名内部类: 1.匿名内部类其实就是内部类的简写格式. 2.定义匿名内部类的前提: 内部类必须是继承一个类或者实现接口. 3.匿名内部类的格式:  new 父类或者接口(){定义子类的内容} 4.其实匿名内部类就是一个匿名子类对象.而且这个对象有点胖.    可以理解为带内容的对象. 5.匿名内部类中定义的方法最好不要超过3个. abstract class AbsDemo { abstract void show(); } class Outer { int x = 3; /* class I

关于JAVA匿名类和内部类的一点讨论

 基本理论:-----------------------------------------------------关于JAVA内部类:一个内部类的定义是定义在另一个类内部的类. 存在它的原因是: 1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据.即内部类实例对包含它的哪个类的实例来说,是特权的. 2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它. 3.匿名内部类可以很方便的定义回调. 4.

java匿名内部类实例简析_java

匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们.这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口.它还创建那个类的一个新实例,并把它作为语句的结果而返回.要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体.如果匿名类对另一个类进行扩展,它的主体可以访问类的成员.覆盖它的方法等等,这和其他任何标准的类都是一样

对Java嵌套类的讨论

摘要:与字段和方法类似,Java允许类是其它类的成员.在这里,我们将嵌套类分为4种--嵌套顶级类(nested top-level classes),成员内部类(instance inner classes),本地内部类(local inner classes)和匿名内部类(anonymous inner classes). 在教授Java时,我经常发现学生尝试在方法中声明其它的方法.不过,与Pascal语言不同--Pascal允许嵌套声明过程procedures(与方法类似),而Java是不允

关于java继承的一点思考

关于继承的一点思考 在 java 中, 继承是实现复用的一种方法,虽然很多时候不建议使用继承, 但不可否认,有时候使继承,更容易理解某个设计 我碰到过这样一种情况,一般的操作对象 类 A 实例,但是会间或操作一些类 B 的实例,B 大部的属性 A 都包括,这个时候使用继承,应该没什么问题的(至少我现在的理解是没什么问题,各位多指教),现在把A 和 B的一些实例放到 一个数组中 A[] as 中 ,现在要轮循 as ,并对 B进行一些操作,这个时候,可以用 instanceof 判断是不是 B ,

Java泛型的一点用法(转)

  1.一个优秀的泛型,建议不要这样写public static <K, V> Map<K, V> getMap(String source, String firstSplit, String secondSplit) 建议可以这样写public static <K, V> Map<K, V> getMap(List<K> keys, List<V> values)或类似public class MapItem<K, V>

java socket的一点疑惑

问题描述 今天看了看javasocket,发现了一点疑惑的问题,因为javasocket这块儿接触的比较少,所以求大神来帮忙.1.java在创建一个socketserver的时候可以传入一个ip地址,这个地址如果不是你本机的地址会出现什么情况?2.看代码注释CreatesasocketaddresswheretheIPaddressisthewildcardaddressandtheportnumberaspecifiedvalue.这里面wildcardaddress又是什么意思,中文解释为通

Java函数调用的一点疑惑,求Java大神解答

问题描述 在Java,如果有两个函数如下:voidf(Integeri){}voidf(Floatf){} 如果调用f(1),JVM知道去调用第一个函数但是如果换成是下面两个函数voidf(Integer...args){}voidf(Float...args){} 这时如果调用f(1),javac爆函数歧义但是如果再次换成下面两个函数voidf(Integer...args){}voidf(Object..args){} 这时调用f(1),就可以正常调用第一个函数或者换成下面两个函数voidf