关于Java中的匿名内部类
来源:互联网 发布:mac number 下拉菜单 编辑:程序博客网 时间:2024/05/20 23:59
--------------------------------------------------------题记
今天在使用HibernateTemplate的execute方法的时候产生了困惑,即HibernateCallback接口中的doInHibernate方法是如何将Session对象绑定到该线程的Session实例中的,回调函数的原理是什么,匿名内部类的原理是什么?
例如:
List<?> list = getHibernateTemplate().execute(new HibernateCallback(){public List<?> doInHibernate(Session session) {List<?> result = session.createQuery(hql);.setFirstResult(offset).setMaxResults(pageSize).list();return result;}});
下面只对匿名内部类进行了比较详细的测试,回调函数原理也能看明白,没有太多注解。
-------------------------------------------------------代码(附详细注释)
package anonymous;/** * * 写了一大堆,最后发现匿名内部类需要掌握的有以下几点: * * 1.最常用的就是【测试方法6】中使用的方式,与【回调函数】方式结合(已经能看出原理,具体分析略)。 * * 2.在【匿名内部类】里面【内部定义的成员】,只能在其【内部调用】,除了重写的抽象方法。 * * 3.匿名内部类返回的引用除了【抽象方法】是使用【重写的方法】(即在内部类中的东西),其他就只能调用其【所属类】的成员了。 * * 3.使用new运算符后,内部类中【重写的方法】【不能立即地、自动地】执行,需要被调用。 * * @author Administrator * */public class Test {//用于被测试的私有属性private String name = "name";//用于被测试的公共属性public String hello = "hello";//用于被测试中重写的方法private void method() {System.out.println("\n执行【未被重写】的method方法");}//=============================================测试方法1public void testFunction1() {System.out.println("\n\n==========================测试方法1");//打印该匿名内部类返回的引用,并且测试其中的方法是否被执行System.out.println("\n(匿名内部类)返回的对象:"+new Test() {@SuppressWarnings("unused")public void method() {System.out.println("\n执行【重写】的method方法");}});}//=============================================测试方法2public void testFunction2() {System.out.println("\n\n==========================测试方法2");Test test = new Test() {@SuppressWarnings("unused")public void method() {System.out.println("\n执行【重写】的method方法");}};//打印返回的引用System.out.println("\n(匿名内部类)返回的对象:"+test);//调用匿名内部类对象的成员方法test.method();//打印匿名内部类对象的成员变量System.out.println("\n(Test类)的私有属性:"+test.name);System.out.println("\n(Test类)的公共属性:"+test.hello);//调用【非Test类】中的【Test匿名内部类】对象的tempFunction方法TempTest temp = new TempTest();temp.tempFunction();}//=============================================测试方法3public void testFunction3() {System.out.println("\n\n==========================测试方法3");Callback1 callback1 = new Callback1() {public void callbackFunction() {System.out.println("\n执行【重写】后的callbackFunction方法");}};//调用匿名内部类对象的callbackFunction方法callback1.callbackFunction();}//=============================================测试方法4public void testFunction4(Test test) {System.out.println("\n\n==========================测试方法4");System.out.println("\n(匿名内部类)返回的对象:"+test);test.method();}//=============================================测试方法5public void testFunction5(Callback1 callback) {System.out.println("\n\n==========================测试方法5");System.out.println("(匿名内部类)返回的对象:"+callback);callback.callbackFunction();}//=============================================测试方法6public String testFunction6(Callback2 callback) {System.out.println("\n\n==========================测试方法6");System.out.println("\n(匿名内部类)返回的对象:"+callback);//注:该方法无法访问到匿名内部类中的成员,如callback.name、callback.hello、callback.myFunction//只能访问接口中的抽象方法return callback.callbackFunction();}//=============================================main方法public static void main(String[] args) {Test test = new Test();//测试1test.testFunction1();//测试2test.testFunction2();//测试3test.testFunction3();//测试4test.testFunction4(new Test() {@SuppressWarnings("unused")public void method () {System.out.println(this.hello);System.out.println("\n(匿名类)");}});//测试5test.testFunction5(new Callback1() {public void callbackFunction() {//Callback1类中的私有属性无法被访问,如this.nameSystem.out.println("\n在(匿名内部类)中访问(Callback1抽象类)中的公共属性:"+this.hello);System.out.println("\n执行【重写】callback1的callbackFunction方法");}});//测试6String str = test.testFunction6(new Callback2() {private String name = "name";public String hello = "hello";public String callbackFunction() {System.out.println("\n只能在(匿名内部类)中访问(匿名内部类)中的属性:"+this.name+"、"+this.hello+"、"+this.myFunction());return "执行【重写】callback2的callbackFunction方法";}public String myFunction() {return "myFunction";}});System.out.println("\n"+str);}}//用于方便测试的临时类class TempTest {//测试2的附属测试方法public void tempFunction() {Test test = new Test() {};System.out.println("\n(匿名内部类)返回的对象:"+test);//只能调用公共属性System.out.println("\nTest类的公共属性:"+test.hello);}}abstract class Callback1 {@SuppressWarnings("unused")private String name = "name";public String hello = "hello";public abstract void callbackFunction();}interface Callback2 {public abstract String callbackFunction();}//-----------------------------------------------------------大家最喜欢看结论了-----------------------------------------------------------//=============================================结论/* * 测试1: * * 可以new一个匿名内部类,但是里面的方法(如,method方法)是不能直接被执行的。 *//* * 测试2: * * 在Test类中的成员方法可以访问Test类中的所有成员,但是{ 无法访问 }在匿名内部类中{ 重写 }的【非抽象】成员方法。 * * 在Test类外的成员方法不能访问Test类中的私有成员方法。 *//* * 测试3 * * { 可以访问 }在匿名内部类中{ 重写 }的【抽象】成员方法。 *//* * 测试4 * * 使用回调函数,结论同测试2。 *//* * 测试5 * * 使用回调函数,匿名内部类中的方法不能访问所属类的私有成员,结论同测试3。 *//* * 测试6 * * 使用回调函数,在匿名内部类中的成员只能在匿名内部类内部访问(无论public还是private)除开重写的抽象方法。 */
- 关于java中的匿名内部类
- 关于Java中的匿名内部类
- 关于java中的匿名内部类
- JAVA中的内部类--匿名内部类
- Java中的匿名内部类
- java中的匿名内部类
- Java中的匿名内部类
- java中的匿名内部类
- java中的匿名内部类
- Java中的匿名内部类
- java中的匿名内部类
- java中的匿名内部类
- java中的匿名内部类
- java中的匿名内部类
- java 中的匿名内部类
- java中的匿名内部类
- JAVA中的匿名内部类
- java中的匿名内部类
- DCOM/OPC配置
- robotium测试创建java文件和junit文件区别
- OD条件与消息断点的设置方法
- Android 4.3 新特性
- QFtp 协议下载
- 关于Java中的匿名内部类
- Centos 6.3 编译安装Nginx+php+Mysql
- ARC 类型转换:显示转换 id 和 void *
- shell脚本加密
- LaTex中表格固定列宽并且居中的方法
- C#调用REST API
- 这位程序员桌面很干净
- uboot/board/mini2440/conifg.mk 之TEXT_BASE
- 敏捷的价值