本文实例讲述了Java匿名内部类原理与用法。分享给大家供大家参考,具体如下:

一 点睛

匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下:

new 父类构造器(实参列表) | 实现接口()

{

//匿名内部类的类体部分

}

从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。

两条规则。

匿名内部类不能是抽象类。

匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。

二 实战

1 点睛

最常用的创建匿名内部类的方式是创建某个接口类型的对象。

2 代码

interface Product

{

public double getPrice();

public String getName();

}

public class AnonymousTest

{

public void test(Product p)

{

System.out.println("购买了一个" + p.getName()

+ ",花掉了" + p.getPrice());

}

public static void main(String[] args)

{

AnonymousTest ta = new AnonymousTest();

// 调用test()方法时,需要传入一个Product参数,

// 此处传入其匿名内部类的实例

ta.test(new Product()

{

public double getPrice()

{

return 567.8;

}

public String getName()

{

return "AGP显卡";

}

});

}

}

3 运行

购买了一个AGP显卡,花掉了567.8

4 说明

定义匿名内部类无须class关键字,而是在定义匿名内部类时直接生成该匿名内部类的对象。

由于匿名内部类不能是抽象类,所以匿名内部类必须实现它的抽象父类或接口里包含的所有抽象方法。

三 实战

1 点睛

当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。

如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。

2 代码

abstract class Device

{

private String name;

public abstract double getPrice();

public Device(){}

public Device(String name)

{

this.name = name;

}

// 此处省略了name的setter和getter方法

public void setName(String name)

{

this.name = name;

}

public String getName()

{

return this.name;

}

}

public class AnonymousInner

{

public void test(Device d)

{

System.out.println("购买了一个" + d.getName()

+ ",花掉了" + d.getPrice());

}

public static void main(String[] args)

{

AnonymousInner ai = new AnonymousInner();

// 调用有参数的构造器创建Device匿名实现类的对象

ai.test(new Device("电子示波器")

{

public double getPrice()

{

return 67.8;

}

});

// 调用无参数的构造器创建Device匿名实现类的对象

Device d = new Device()

{

// 初始化块

{

System.out.println("匿名内部类的初始化块...");

}

// 实现抽象方法

public double getPrice()

{

return 56.2;

}

// 重写父类的实例方法

public String getName()

{

return "键盘";

}

};

ai.test(d);

}

}

3 运行

购买了一个电子示波器,花掉了67.8

匿名内部类的初始化块...

购买了一个键盘,花掉了56.2

当创建以Device为父类的匿名内部类时,既可以传入参数,代表调用父类带参数的构造器;也可以不传入参数,代表调用父类无参数的构造器。

当创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。如果有需要,也可以重写父类中的普通方法。

四 实战

1 点睛

在Java 8之前,Java要求被局部内部类、匿名内部类访问的局部变量必须使用final修饰,从Java 8开始这个限制取消了,Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相对于自动使用了final修饰。

2 代码

interface A

{

void test();

}

public class ATest

{

public static void main(String[] args)

{

int age = 8; // ①

// 下面代码将会导致编译错误

// 由于age局部变量被匿名内部类访问了,因此age相当于被final修饰了

//age = 2;

A a = new A()

{

public void test()

{

// 在Java 8以前下面语句将提示错误:age必须使用final修饰

// 从Java 8开始,匿名内部类、局部内部类允许访问非final的局部变量

System.out.println(age);

}

};

a.test();

}

}

3 结果

8

4 说明

Java 8将这个功能称为“effectively final”,它的意思是对于被匿名内部类访问的局部变量,可以用final修饰,也可以不用final修饰,但必须按照有final修饰的方式来使用——也就是一次赋值后,以后不能重新赋值。

希望本文所述对大家java程序设计有所帮助。

java 匿名内部类 参数_Java匿名内部类原理与用法详解相关推荐

  1. java linkedlist实例_Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...

  2. java 类参数_Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...

  3. java 动态数组_Java动态数组的用法详解

    Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...

  4. java sort方法_Java排序方法sort用法详解

    本文实例为大家分享了java对数组.集合的排序方法,供大家参考,具体内容如下 对数组的排序: //对数组排序 public void arraySort(){ int[] arr = {1,4,6,3 ...

  5. java wrapper作用_java Wrapper类基本用法详解

    在封装中有一种特殊的类,能够把基本的数据类型进行转换来方便实际的使用.我们在之前提到的一些数据类型,最明显的特征是所有字母为小写状态,那么经过wrapper的包装后,首字母就变成了大写.下面我们就这种 ...

  6. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  7. python字符串strip的作用_Python字符串函数strip()原理及用法详解

    Python字符串函数strip()原理及用法详解 strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.s ...

  8. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  9. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  10. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

最新文章

  1. 算法--06谷歌面试:字符串中第一个只出现一次的字符(Java实现)
  2. 批量打印html文档,web页面的单页打印以及批量打印实现方法
  3. 组播 收发_[HCIARoutingamp;Switching]网络篇单播广播和组播
  4. 菲波那契数列(信息学奥赛一本通-T1188)
  5. 【开源软件】windows环境下libcurl编译
  6. struts中获取多选按钮html:checkbox的值
  7. 若依二次开发添加 select 下拉框 变大 和 有空格存在
  8. 数论——同余和费马小定理
  9. Linux 内核 SMP 代码追踪 --- cpumask
  10. Stata+R: 一文读懂中介效应分析
  11. 用vbs脚本实现软件的自动登录
  12. 字典写入excel_Excel中“先出式”出货的问题,以后出库太方便了
  13. DISCUZ论坛管理员密码破解
  14. 微信第三方平台服务器,微信三方平台接入
  15. 【ZZULIOJ】1092: 素数表(函数专题)
  16. 加拿大麦吉尔大学计算机科学学院,加拿大麦吉尔大学专业:加拿大麦吉尔大学的院校介绍以及专业设置...
  17. js正则验证身份证号码是否真实有效
  18. FOCUS projects 5 Pro(照片景深处理软件)官方正式版V5.34.03722 | 景深合成软件下载
  19. 关于ICMP Redirect路由的一个不是bug的bug
  20. Keep It Mac版

热门文章

  1. C#中的枚举类型enum用法
  2. MATLAB 设置legend加标题
  3. linux export 中文,linux export 的做用
  4. 网页中如何让title属性变得可以复制?
  5. 添加JAVA环境变量
  6. 面试常见测试场景-杯子,笔,直播,微信,客户端服务器
  7. 检查计算机更新在哪里,有效解决升级Win10系统后电脑卡在正在检查更新的情况...
  8. 本软件基于云盘万能钥匙API开发
  9. Safari难道是下一个IE?兼容性这么“差”
  10. 【windows系统】360浏览器按F12弹出独立窗口的解决方法(图文)