
为避免浪费你的宝贵时间,请先浏览本文章目录:
1、内部类
2、实战-利用匿名内部类实现回调
3、Lamda
01
—
内部类
内部类顾名思义,在一个已有类的内部的一个类,一般在实际项目中常用三种方式。
表现形式一:
非static,依赖于外部类,只能访问外部类中的非静态变量,且在内部类中不能出现static的声明。
Integer id;public InnerClass(Integer id){this.id = id;}public void getUserName(String name){System.out.println(id + " : " + name);}public static void main(String[] args) {InnerClass ic = new InnerClass(1);User u = ic.new User(); //注意这里u.selectById();}class User{public void selectById(){if(id == 1){getUserName("zs");}else{getUserName("none");}}}
表现形式二:
static模式,又称为嵌入式类,由于是static ,因此不依赖于外部类,但是又是隐藏在外部类中,又可以使用外部类的静态成员变量。
public static String PID = "123";public static void main(String[] args) {User user = new InnerClass.User(); //注意这里}static class User{// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)public void selectById(){if(PID.equals("123")){System.out.println("我只能访问外部类的静态成员");}}}
表现形式三:
匿名内部类,顾名思义是一种没有名字的类。不明白,还记得下面的代码吗?
new Thread(new Runnable() {public void run() {//此处省略一万字}}).start();
new Thread 接受的就是一个匿名内部类,因为Runnable是一个接口,而不是一个类。所以匿名内部类就是一个父类的继承类或者是一个接口的实现类,他没有自己的类名。
02
—
实战-利用匿名内部类实现回调
public class InnerClassCallback {private Integer userId;private String uName;public static void main(String[] args) {new InnerClassCallback(1).clientEvent();}public InnerClassCallback(Integer userId){this.userId = userId;}//触发事件,并将返回的结果更新到外部类public void clientEvent(){Worker wk = new Worker();//将实现Event接口的匿名内部类传递给Workerwk.worker(userId , new Event() {public void clickEvent(String userName) {uName = userName;System.out.println("查询结果:" + uName);};});}}//在workder执行实际的操作class Worker{public void worker(Integer userId , Event event){if(userId == 1){event.clickEvent("zs");}}}//匿名内部类需要实现的接口interface Event{void clickEvent(String name);}
当然实现回调的方法有多种,例如将InnerClassCallback这个类传递给worker,直接利用woker来更新成员变量,调用成员方法;但是无疑使用内部类的方式不管是从逻辑上,还是代码可读性上都更胜一筹。在Android中,Java GUI中都大量运用了匿名内部类完成回调的工作。
02
—
Lamda
同样代码,在JDK1.8中,我们可以使用Lamda的方式来进行替换。将InnerClassCallback中的clientEvent方法替换为下面的方法,将会使代码更加简洁。
//使用lamda表达式public void clientEvent(){Worker wk = new Worker();wk.worker(userId , (c)-> {this.uName=c ; System.out.println("lamda: "+c);});}
文中所有代码均可以在线下载:
https://gitee.com/wsyjiamian/JavaDiary.git
文章转载自程序员的日记本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




