你的位置:首页 > Java教程

[Java教程]黑马程序员——java基础——匿名内部类的三个疑惑


 -----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 

 最近在学习多线程的时候遇到了匿名内部类,老师利用了匿名内部类讲述了多线程的启动。老师的举例程序如下:

class Person {  public static void main(String[]args)throws InterruptedException{    new Thread(){      public void run(){        while(true){          System.out.println(Thread.currentThread().getName()+"继承");        }      }    }.start();  new Thread(new Runnable(){    public void run(){      while(true){        System.out.println(Thread.currentThread().getName()+"实现");      }    }   }).start();  }}

  感觉很开眼界。加之之前自己对于内部类掌握不是很好,所以决定好好复习一下匿名内部类。经过查java核心技术第八版(评注版,电子工业出版社)314页的描述

new SuperType(constuctor parameters){  inner class methods and data}new InterfaceType(){  methods and data}

  注:用匿名匿名内部类能干什么呢?其实就是最终建立了利用父类和接口创建了一个子类对象。知道这个之后,对于大括号之后调用方法就业在不足为奇了。所以是匿名类产生的单独对象存在的情况下需要加分号,而利用其调函数需要在结尾处加分号。从书本中可以出,如果程序中是父类的构造方法,那就是新建了一个子类的对象。如果是接口那就是新建了一个实现接口的对象。

  但是看完书我还是有些疑惑:

  (1):父类的构造方法可以是无参吗?
  (2):父类是抽象还是非抽象的呢?如果时抽象的怎么样?如果时非抽象又会有什么影响的呢?
  (3):内部类的里面都是什么内容?
  对于以上的疑惑,我一一找了程序去测试。
  对于疑惑(1)我将老师的程序new Thread()替换为带有字符串参数的构造函数。

class Person {  public static void main(String[]args)throws InterruptedException{    String s = "abc";    new Thread(s){//构造方法含有参数      public void run(){        while(true){          System.out.println(Thread.currentThread().getName()+"继承");        }      }    }.start();  new Thread(new Runnable(){    public void run(){      while(true){        System.out.println(Thread.currentThread().getName()+"实现");      }    }   }).start();  }}  

  编译通过,运行毫无问题。所以就证明了有参数的构造函数也是可行的。当然这一切都需要父类存在有参数的构造函数。

  对于疑惑(2)Thread 类本身已经是非抽象类,我们重写了其run方法。说明如果是非抽象类可以重写某个方法。那如果是非抽象类,就是一个空括号或者是我另加一个方法可否?

测试代码如下:

class Students{  public void study(){    System.out.println("人在学习");  }}class Person{  public static void main(String[]args){    new Students(){     /*public void play(){不管有无这个方法,都可以编译、运行         System.out.println("我爱玩篮球");       }*/     };  }}                              

  而对于抽象类,需要重写代码如下

abstract class Students{  public void study(){    System.out.println("人在学习");  }  public abstract void eat();}class Person{  public static void main(String[]args){    new Students(){    //如果不重写抽象方法,就会报错      public void eat(){        System.out.println("人在吃东西");      }    };  }}    

  对于疑惑(3)内部类的内容包括实现抽象类,实现接口的抽象方法及添加自定义方法。这个从疑惑2的程序已经能够解答。

  总结:经过提出疑惑,编写代码,最终解答的过程中。我们知道了关于匿名内部类的一些知识。

  (1):匿名内部类的救过就是利用父类和实现的接口创建一个子类对象。

  (2):格式为——new SuperClass(Construction parameters)/Interface(){};

  (3):父类的构造函数可以有参也可以无参。接口只能无参。

  (4)父类可以是抽象类,也可以是非抽象类。

  (5):如果时抽象类和接口那么大括号中就是实现抽象方法当然也可以自己在加入方法;如果是费非抽象类,可以是重写的父类方法,也可是什么都不写,也可以加入特有的方法;