关闭

Java匿名类

标签: java匿名类Anonymous inner clas
1105人阅读 评论(0) 收藏 举报
分类:

匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的。

下面是一个关于匿名类的简单例子:

public class Client {

	public static void main(String[] args) throws InterruptedException {
		Thread t=new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("hello,dusk!");
				
			}
		});
		t.start();
	}

}

Java语言规范上是这么描述匿名类的:

匿名类的声明:

匿名类的声明是由java编译器自动派生自一个类实例创建表达式

匿名类永远不能是抽象的。

匿名类总是隐式的final。

匿名类总是一个内部类;并且不能是static的。

匿名构造函数:

匿名类不能有显式声明的构造函数。相反的,Java编译器必须为这个匿名类自动提供一个匿名构造函数。匿名类C继承于父类S那么匿名构造函数是下面的形式:

  • 如果S不是一个内部类或者S是一个静态上下文中的局部类,那么这个匿名构造函数有一个形参为每一个在C的类实例创建表达式中的实际参数。
类的实例创建表达式的实际参数用来确定S的一个构造函数cs,使用方法调用相同的规则。

每一个匿名构造函数的形参必须和cs中的相关形参一致。

这个构造函数中显式的包括super(...)构造函数调用,这个实际参数是构造函数的形参,按它们声明的顺序。

  • 否则,C的构造函数第一个形参描述了这个值,直接包围实例i相对于S。参数的类型是S的class类型。
构造函数有一个额外的形参为每一个类实例创建语句声明在匿名类中的实际参数。第n个形参和第n-1个实际参数相关。

类的实例创建表达式的实际参数用来确定S的一个构造函数cs,使用方法调用相同的规则。

每一个匿名构造函数的形参必须和cs中的相关形参一致。

这个构造函数中显式的包括super(...)构造函数调用,这个实际参数是构造函数的形参,按它们声明的顺序。

在所有的情况下,匿名构造函数的throws语句必须列出所有的检查异常,包括父类构造函数显式调用语句抛出的和匿名类的实例初始化或者变量初始化抛出的异常。

注意:匿名构造函数的签名涉及到了一个不可达类型是可能的(例如,出现在父类构造函数中的类型),这不会导致任何编译时和运行时错误。


实际使用中我们只需注意这几点儿:

      1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
      2、匿名内部类中是不能定义构造函数的。
      3、匿名内部类中不能存在任何的静态成员变量和静态方法。
      4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
      5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

编译时的命名规则:

  • 内部类的class文件命名是:主类+$+内部类名
  • 匿名类的class文件命名是:主类+$+(1,2,3....)
定义一个场景:

package com.dusk.anonymous;

public class AnonymousClassTest {
	private Runnable r1=new Runnable() {
		
		@Override
		public void run() {
			System.out.println(1);
		}
	};
	public void method1(){
		Runnable r2=new Runnable() {
			
			@Override
			public void run() {
				System.out.println(2);
			}
		};
	}
	public static void main(String[] args) {
			Runnable r3=new Runnable() {
				
				@Override
				public void run() {
					System.out.println(3);
				}
			};
	}
}
从代码中我们可以看出定义了三个匿名类:

我们反编译出来:

package com.dusk.anonymous;

import java.io.PrintStream;

class AnonymousClassTest$1
  implements Runnable
{
  AnonymousClassTest$1(AnonymousClassTest paramAnonymousClassTest) {}
  
  public void run()
  {
    System.out.println(1);
  }
}
package com.dusk.anonymous;

import java.io.PrintStream;

class AnonymousClassTest$2
  implements Runnable
{
  AnonymousClassTest$2(AnonymousClassTest paramAnonymousClassTest) {}
  
  public void run()
  {
    System.out.println(2);
  }
}
package com.dusk.anonymous;

import java.io.PrintStream;

class AnonymousClassTest$3
  implements Runnable
{
  public void run()
  {
    System.out.println(3);
  }
}
我们可以看出匿名类的名字中的数字和他们在代码中出现的位置一模一样。










0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java 匿名类(不能被忽略 (new+接口)是定义匿名类的一个形式)

匿名内部类 ( 明白了匿名类就理解了函数回调,(此处与线程无关))有位老兄说:(匿名一是为了简化代码,而是告诉GC我这个对象只用一次,用完给我回收了) 关于JAVA内部类:一个内部类的定义是定义在...
  • Listron
  • Listron
  • 2014-01-21 16:42
  • 1680

java提高篇(九)-----详解匿名内部类

在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客。在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始...
  • chenssy
  • chenssy
  • 2013-10-27 15:05
  • 49410

为什么匿名内部类参数必须为final类型

1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自...
  • A1023824314
  • A1023824314
  • 2016-07-31 00:19
  • 2573

java:使用匿名类直接new接口

java:使用匿名类直接new接口 java中的匿名类有一个倍儿神奇的用法,见下面代码示例: 1 package contract; 2 3 public interface...
  • grdgrdgrd
  • grdgrdgrd
  • 2016-03-31 11:01
  • 280

java中匿名类的解释使用

java中匿名类的解释 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一...
  • PiCheeng
  • PiCheeng
  • 2015-01-18 01:53
  • 424

Java SE TreeSet(实现Comparable接口和Comparator匿名类)根据属性排序示例

ava SE TreeSet(Comparable和Comparator)属性排序示例 package day15; import java.text.SimpleDateFormat; ...
  • fang2liang
  • fang2liang
  • 2016-11-09 17:00
  • 159

对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

工厂模式的意图:定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。结构图:场景:这里制造两个手机product:Nokia、Motorol...
  • yanghua_kobe
  • yanghua_kobe
  • 2011-07-09 22:02
  • 1300

Java中匿名类的两种实现方式

使用匿名内部类课使代码更加简洁、紧凑,模块化程度更高。内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式...
  • tuolaji8
  • tuolaji8
  • 2015-10-14 13:55
  • 613

JAVA基础_09 接口 匿名类

一. 接口 a.接口:当一些具体的事物具有特殊的功能,而这些特殊的功能又不能写在类中,JAVA提供了接口实现,关键字是interface b.接口定义的格式: interface接口名{ } c.接口...
  • java123rookie
  • java123rookie
  • 2017-07-17 13:10
  • 57

java例程练习(匿名类用法)

//用匿名类实现关闭窗口功能 import java.awt.*; import java.awt.event.*; public class TestAnony { Frame f = new F...
  • haifengzhilian
  • haifengzhilian
  • 2012-05-06 22:34
  • 1087
    个人资料
    • 访问:170556次
    • 积分:2311
    • 等级:
    • 排名:第18721名
    • 原创:74篇
    • 转载:9篇
    • 译文:6篇
    • 评论:46条
    博客专栏
    最新评论