请问JAVA中匿名内部类有啥用,举个例子,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问JAVA中匿名内部类有啥用,举个例子,谢谢相关的知识,希望对你有一定的参考价值。
参考技术A 内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。内部类可以访问外部类的属性和方法。你可以把内部类看作"方法"一样,在使用的时候调用执行。你也可以把内部类看作"属性"一样,在构造内部类对象的时候,也会在堆里为内部类的属性分配存储空间。所以内部类也有类似像修饰属性,方法那样的修饰符,比如:public,private,static 等等。当一个类没有用static 关键字修饰的时候,这个内部类就叫做成员类,类似属性,方法,作为类的成员。 内部类的特点总结:两个或两个以上的类逻辑上紧密相连的时候,我们可以考虑使用内部类。如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。 参考技术B 匿名内部类的特点:
1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不需要知道其实际类型。
3,类名没有意义,也就是不需要使用到。
public class Outer
private static int i = 1;
private int j = 10;
public static void outer_f1()
public void outer_f2()
// 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
static class Inner
static int inner_i = 100;
int inner_j = 200;
static void inner_f1()
System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
void inner_f2()
// System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员
// outer_f2();//包括非静态变量和非静态方法
public void outer_f3()
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
public static void main(String[] args)
new Outer().outer_f3();
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。 参考技术C 没有啥子用,只是省点代理,
Java8新特性lambda表达式有啥用
一:因为lambda 表达式能够使代码看起来更简洁,清爽
匿名内部类的写法
List<String> names = Arrays.asList("jack", "tom", "jerry");Collections.sort(names, new Comparator<String>()
@Override
public int compare(String s1, String s2)
return s2.compareTo(s1);
);
lambda表达式的写法
List<String> names = Arrays.asList("jack", "tom", "jerry");Collections.sort(names, (s1, s2) -> s2.compareTo(s1));
二: 很多编程语言都支持lambda 表达式. java不支持都不好意思了......
三: 通过lambda 表达式 来实现函数是编程. 将来声明式编程语言借鉴函数编程思想,函数编程语言融合声明式编程特性...这几乎是一种必然趋势。
参考技术A 随着编程语言生态系统的气候不断变化以及技术的革新,经历20余年的发展,Java逐渐演变成长为Java8。相比之前只是单纯的面向对象编程语言,Java8增加了很多新特性。Java 8对于程序员的主要好处在于它提供了更多的编程工具和概念,能以更为简洁、更易于维护的方式解决新的或现有的编程问题。在Java 8中有两个著名的改进:一个是Lambda表达式,一个是Stream。
Lambda表达式是什么?
Lambda表达式,也可称为闭包,它允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda表达式可以使代码变的更加简洁紧凑,Lambda表达式的语法格式:
(parameters) -> expression或(parameters) -> statements;
Lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
使用Lambda表达式需要注意以下两点:
Lambda表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
Lambda表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
Stream是什么?
Stream就是一个流,它的主要作用就是对集合数据进行查找过滤等操作。Java 8中的 Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作(bulk data operation)。
对于基本数值型,目前有三种对应的包装类型Stream:IntStream、LongStream、DoubleStream。当然我们也可以用Stream<Integer>、Stream<Long> >、Stream<Double>,但是boxing和 unboxing会很耗时,所以特别为这三种基本数值型提供了对应的Stream。
Java 8中还没有提供其它数值型Stream,因为这将导致扩增的内容较多。而常规的数值型聚合运算可以通过上面三种Stream进行。
Stream上的操作分为两类:中间操作和结束操作。中间操作只是一种标记,只有结束操作才会触发实际计算。
中间操作又可以分为无状态的(Stateless)和有状态的(Stateful),无状态中间操作是指元素的处理不受前面元素的影响,而有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态操作,在读取所有元素之前并不能确定排序结果。
结束操作又可以分为短路操作和非短路操作,短路操作是指不用处理全部元素就可以返回结果,比如找到第一个满足条件的元素。之所以要进行如此精细的划分,是因为底层对每一种情况的处理方式不同。
想要永远处于优势地位,就要不断的完善自身、更新技术。
以上是关于请问JAVA中匿名内部类有啥用,举个例子,谢谢的主要内容,如果未能解决你的问题,请参考以下文章
Java语言中四种内部类(成员内部类,局部内部类,静态内部类,匿名内部类)在实际使用中有啥好处?