java8--面向对象 下(疯狂java讲义3) 复习笔记

1、如果一个包装类和一个基本类型比较大小,或者是两个基本类型进行比较大小,直接用==就好; 
如果是两个包装类进行比较大小,那么使用equals(),返回值是true,false,或者使用Xxx.compare(),返回值是1,0,-1。(这里的equals()方法,已经被包装类重写过了,不是Object的equals()) 
2、==和equals方法的区别 
当使用==来判断两个变量是否想等时,比较的是栈内存中的值,如果两个变量是基本类型变量,且都是数值类型,那么栈内存中个存放的是基本类型变量的值,所以只要两个基本类型变量的值想等,就会返回true。但对于两个引用类型变量,由于栈内存中存放的是变量的引用,所以只有当这两个引用类型变量指向同一个对象是,==才会返回true。==不可用于比较类型上没有父子关系的两个对象。 
equals()方法是Object类的一个实例方法,但这个方法和==没区别。不过String类和基本类型的包装类重写了这个equals()方法,不再比较引用对象的引用地址,而是比较所引用的值。 
3、类成员 
static 关键字修饰的成员是类成员,有类变量、类方法、静态初始化块三部分,static关键字不能修饰构造器。static修饰的类成员属于整个类。除了这三个,类中还可以包括构造器和内部类(包括接口、枚举),内部类可以用static修饰。 
null对象可以访问它所属类的类成员。 
对static关键字而言:类成员(包括方法、初始化块、内部类和枚举类)不能访问实例成员(包括成员变量、方法、初始化块、内部类和枚举类)。因为类成员的作用域是属于类的,类成员的作用域比实例成员的作用域更大,完全可能出现类成员已经初始化完成,但实例成员还不曾初始化的情况,如果允许类成员访问实例成员,将会引起大量错误。

4、final修饰符 
final修饰的变量获得初始值后不能被重新赋值,因此final修饰成员变量和修饰局部变量时,是有区别的。 
final成员变量: 
与普通成员变量不同的是,final修饰的成员变量必须由程序员显示的初始化,系统不会对final成员进行隐式初始化。 
final修饰的类变量在声明时或静态初始化块中指定初始值。 
final修饰的实例变量,在声明时或非静态初始化块中或构造器中指定初始值;

final局部变量: 
系统不会对局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。如果final 修饰的局部变量在定义时没指定默认值,则可以在后面的代码中对该fianl变量赋初始值,但只能一次,不能重复赋值。

final修饰基本类型变量和修饰引用类型变量的区别: 
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不变,即一直引用同一个对象(使用final修饰的引用类型变量不能被重新赋值),但这个对象完全额可以发生改变(即可以改变引用类型变量所引用对象的内容)。

final方法 
final修饰的方法不可被重写。如果不希望子类重写某个方法,可以使用final修饰该方法。

final类 
final类不可以有子类(不可被继承)。

不可变类 
使用private和final修饰符类修饰该类的成员变量。 
提供带参数构造器 
不提供setter方法 
如果有必要,重写Objcet类的hashCode()和equals()方法。

缓存不可变类的实例 
如果程序经常需要使用相同的不可变类实例,则应该考虑缓存者在不可变类的实例。毕竟重复创建相同的对象没有太大的意义,而且加大系统开销。 
缓存是软件设计中一个非常有用的模式,缓存的实现方式有很多种,不同的实现方式可能存在较大的性能差别。但是,盲目乱用缓存也会导致系统性能下降,缓存的对象会占用系统内存,所以缓存一个重复使用概率不大的实例,就弊大于利。

5、抽象类 
abstract 修饰的方法必须重写才有意义,所以abstract不能和private 或 final一起使用. 
6、接口 
接口里不能保护普通方法,接口里所有的方法都是抽象方法 ;java8对接口进行了改进,允许在接口中定义默认方法,默认方法可以提供方法实现. 
这里写图片描述

接口是从多个相似类中抽象出来的规范,接口不提供任何实现.接口体现的是规范和实现分离的哲学. 
接口通常是定义多一组公用方法. 
接口完全支持多继承,一个接口可以直接继承多个父接口,但接口只能继承接口,不能继承类. 
一个类可以实现多个接口,如果一个类实现了多个接口,那么这个类的对象就可以直接赋值给多个父类变量,这就是Java提供的模拟多继承.

由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义.接口里可以包含成员变量(只能是静态常量),方法(只能是抽象实例方法,类方法(1.8),或默认方法(1.8)),内部类(包括内部接口,枚举)定义. 
系统自动为接口里的成员变量添加public static final修饰符. 
所以接口里定义int MAX = 50;和定义 public static final int MAX = 50;的意义是一样的.

7、内部类

 
 

 

posted @ 2017-05-31 19:31  lakeslove  阅读(299)  评论(0编辑  收藏  举报