java学习接口,lambda表达式与内部类

2020-05-23 11:52:30

1.接口技术,主要用来描述类具有什么功能,而并不给出每个功能的具体实现,一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象

2.如果类遵从某个特定的接口,那么就履行这项服务

3.接口中所有的方法自动的属于public,因此,在接口中声明方法时,不必提供关键字public,但是,在实现接口的时,必须把方法声明为public,否则,编译器将认为这个方法的访问属性使类的默认访问属性

4.接口绝不能含有实例域,在接口中,可以定义一些常量,在javaSE8之前,也不能在接口中实现方法,现在可以实现在接口中提供简单方法了,当然,这些方法不能引用实例域----接口没有实例域

5.为什么一定要使用实现接口的方式来提供一些方法?原因,Java语言是一种强类型语言,在调用方法的时候,编译器会检查这个方法是否存在,为此,如果对象所在的类实现相关接口,就可以确保方法的存在

6.接口不是类,不能使用new运算符实例化一个接口;尽管不能构造接口的对象,但是可以声明接口的变量,接口变量必须引用实现了接口的类的对象

7.可以使用instanceOf()检查一个对象是否实现了某个特定的接口

8.接口可以建立继承关系,也可以被扩展

9.接口不能包含实例域或静态方法,但是可以包含常量;与接口中的方法都自动的设置为public一样,接口中的域将自动的设为public static final

10.任何实现类接口的类将自动继承接口内的常量,并可以在方法中使用

11.为什么已经存在抽象类的概念,还要引入接口?

每个类只能扩展于一个类,不能够扩展多个类;但是可以实现多个接口

12.在JAVA SE8中,允许在接口中增加静态方法;可以为接口方法提供一个默认实现,必须用default修饰符标记这样一个方法,当然,没有太大用处,应为每一个实现接口的方法都会覆盖这个实现

13.默认方法的一个重要用法是接口演化

14.如果先在一个接口中将一个方法定义为默认方法,然后又在超类中或者另一个接口中定义类同样的方法,Java有两个规则来解决这样的二义性

超类优先,如果超类提供了一个具体的方法,同名且有相同参数类型的默认方法会被忽略

接口冲突;如果一个接口提供了一个默认的方法,另一个接口提供了同名且有相同参数类型的默认方法,必须用覆盖这个方法的方式来解决

15.回调是一种常见的程序设计模式,在这种模式中,可以指出某个特定事件发生时应该采取的动作

16.使用不同的比较规则,除了在一些常用类中定义的一些比较方法外,也可在实现Comparator<>接口

17.默认的克隆操作是浅拷贝,只拷贝基本数据类型域,不会克隆对象中引用的其它对象,只会拷贝它的引用

18.标记接口,也称为记号接口,Cloneable和Comparable接口都是标记接口,这些接口的通常用途是确保一个类实现一个或一组特定的方法;标记接口不包含任何方法,它唯一的作用就是在类型查询中使用instanceof

19.lamabda表达式是一个可传递的代码块,可以在以后执行一次或多次

20.对于只有一个抽象方法的接口,需要这种接口对象时,就可以提供一个lambda表达式,这种接口称为函数式接口;在底层,函数式接口某个实现类的对象会被需要这个接口实例参数的方法接收,在这个对象上调用的抽象方法会执行这个lambda表达式的体

21.在Java中,对lambda表达式所能做的也只是能转换为函数式接口,甚至不能把lambda表达式赋给类型为Object的变量,Object不是一个函数式接口

22.想要用lambda表达式做某些处理,还是要谨记表达式的用途,为它建立一个特定的函数式接口

23.有时,可能已经有现成的方法可以完成你想要传递到其它代码的某个动作,方法引用可以转换为lambda表达式,lambda表达式也可以转换为方法引用;有三种不同类型,前两种等价于提供方法参数的lambda表达式,第三种,第一个参数会成为方法的目标

object::instanceMethod

Class:staticMethod

Class::instanceMethod

24.可以在方法引用中使用this参数,this表示为当前对象,使用super也是合法的,以this为目标,会调用给定方法的超类版本

25.构造器引用与方法引用很类似,只不过方法名为new

26.lambda表达式有三个部分

一个代码块

参数

自由变量的值,这里指的是非参数且不再代码中定义的变量

27.在Java中,lambda表达式就是闭包

28.lambda表达式可以捕获外围作用域中变量的值,在Java中,要确保所捕获的值是明确定义的,这里有一个重要的限制,只能引用值不会改变的变量,之所以有这个限制是因为在lambda表达式中改变变量,并发执行多个动作就会不安全;另外,如果在lambd表达式中引用变量,而这个变量可能在外部改变,这也式不合法的,这里有一条规则是,lambda表达式中捕获的变量必须实际上是最终变量,实际上是最终变量是指这个变量初始化之后不会再为它赋新值

29.lambda表达式的体与嵌套块有相同的作用域,这里同样适用于命名冲突和遮蔽的有关规则

30.在一个lambda表达式中使用this关键字时,是指创建这个lambda表达式方法的this参数

31.使用lambda表达式的重点是延迟执行

32.内部类是定义在另一个类中的类,使用内部类的主要原因有三点

内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据

内部类可以对同一个包中的其它类隐藏起来

当想要定义一个回调且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷

33.内部类并不意味着每一个外围类的对象都有一个内部类实例域,内部类对象是由外围类的方法构造的

34.内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域,内部类的对象总有一个隐式引用,它指向了创建它的外部类对象

 35.这个引用在内部类的定义中是不可见的

36.只有内部类可以是私有类,而常规类值可以具有包可见性,或者公有可见性

37.外围类的引用在构造器中设置,编译器修改了所有的内部类的构造器,添加了一个外围类引用的参数 ,因为内部类没有定义构造器,所以编译器为这个类生成了一个默认的构造器

38.内部类中声明的所有静态域都必须是final

39.内部类不能有static方法

40.局部内部类不能够使用public或private访问说明符进行声明,它的作用域被限定在声明这个局部类的块中,局部类有一个优势,即对外部世界完全的隐藏起来,即使块所在的块也不能够访问它

41.与其它内部类相比较,局部类不仅能够访问包含它们的外部类,还可以访问局部变量,不过这些局部变量必须事实上是final

42.匿名内部类,由于构造器的名字必须与类名相同,而匿名类没有类名,所以它没有构造器,取而代之的是,将构造器的参数传递给超类构造器,尤其是在内部类中实现接口的时候,不能够有任何构造参数

43.静态内部类,有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外部类的对象,为此,可以将内部类声明为static,以便取消产生的引用

44.只有内部类可以声明为static,静态内部类的对象除了没有生成对生成它的外围类对象的引用特权外,与其它所有内部类完全一样

45.如果内部类对象是在静态方法中构造的,那么内部类必须是静态的

46.代理,利用代理可以在运行是创建一个实现了一组给定接口的新类,这种功能只有在编译时无法确定需要实现那个类的接口时才有必要使用

 

posted @ 2020-05-23 11:53  gaoboss  阅读(288)  评论(0编辑  收藏  举报