不要编写返回可变对象的访问器方法(P113)

class Employee{ 
 
 
 

        private Date date; 
 
 
 

        public Date getDate(){ 
 
 
 

             ... 
 
 
 

             return date; 
 
 
 

        } 
 
 
 

   }

我们获取Date对象之后就可以修改date域的内容:

//引用了同一个对象

getDate.setTime(xxx);

应用场景:private私有域,可变对象

解决方法:clone出一个对象副本(完全独立),返回副本。

  • final实例域(P115)

final修饰符大都修饰基本类型,或者不可变的类(类中的每个方法都不会改变其对象,如String)。

例如:private final Date hiredate;

对象构造之后(即可以在构造函数中指向一个对象,然后不改变引用(事实上也不能))就不能被改变,而不意味着hiredate对象是个常量。任何方法都可以对 hiredate引用的对象调用 setTime方法。

  • Java方法参数使用(P123)

一个方法不能够修改基本数据类型的参数(数值型和布尔型)

一个方法可以改变对象参数的状态

一个方法不能让对象参数引用一个新的对象

注: 知乎-java到底是值传递还是引用传递(印象笔记也有保存)

  • 重载

overloading 多个方法有相同的名字,不同的参数便产生了重载。

  • 初始化

P131

(1) 所有数据域被初始化为默认值(0,false,null)

(2) 按照在类声明中出现的次序,依次执行域初始化语句和初始化块

(3) 如果构造器第一行调用了第二个构造器,则执行第二个构造主体

(4) 执行这个构造器的主体

注: Java中构造代码块和成员变量初始化的顺序关系(印象笔记也有保存)

P149

父类的静态代码块,静态变量(java虚拟机加载时执行,只执行一次)

子类的静态代码块,静态变量(java虚拟机加载时执行,只执行一次)

父类的属性对象(成员变量),父类的普通代码块(按写的顺序执行 new一次,执行一次)

父类的构造函数(new一次,执行一次 )

子类的属性对象 (成员变量) ,子类的普通代码块 (按写的顺序执行 new一次,执行一次 )

子类的构造函数(new一次,执行一次 )

  • 修饰符

 

当前类

同一个包

子类

其他包

public





protected




 

默认(无修饰符)



 

 

private


 

 

 

  • 多态和动态绑定

多态:一个对象变量可以只是多种实际的数据类型的现象(父类的引用指向子类的对象,调用方法会调用子类的实现,而不是父类的实现;多态与方法覆盖有关,与方法重载无关)

允许不同的类对象对同一个消息做出相应。

三个必要条件:有继承;有重写;父类引用指向子类对象

动态绑定:运行时能够自动地选择调用哪个方法的现象

  • 继承

P153

如果子类的构造器没有显式地调用超类的构造器,则将自动调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中有没有显式地调用超类的其他构造器,则Java编译器将报错。

调用构造器的语句只能作为另一个构造器的第一条语句出现。(无论是super还是this调用)

  • 集合

public interface Collection<E>{ 
 
 
 

        boolean add(E e); 
 
 
 

        Iterator<E> iterator(); 
 
 
 

   }

经典写法:

Collection<String> c =...; 
 
 
 

   Iterator<String> iter = c.iterator(); 
 
 
 

   while(iter.hasNext()){ 
 
 
 

        String element = iter.next(); 
 
 
 

        //do sth with element 
 
 
 

   }

for each 写法

for(String element : c){ 
 
 
 

        //do sth with element 
 
 
 

   }

Map结尾的实现Map接口,其他结尾的实现Collection接口

ArrayList     

动态增长和缩减的索引序列

LinkedList     

插入删除高效的有序序列

ArrayDeque

 

HashSet     

没有重复元素的无序集

TreeSet     

有序集

EnumSet

 

LinkedHashSet

 

priorityQueue

 

HashMap     

存储键值关联的映射表

TreeMap     

键值有序排列的映射表

LinkedHashMap

 

WeakHashMap

 

IdentityHashMap

 

  • Comparator 和 Comparable 比较

Java 中 Comparable 和 Comparator 比较

Comparable 是排序接口

若一个类实现了Comparable接口,就意味着“ 该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

Comparator 是比较器接口。

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。

也就是说,我们可以通过“ 实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。

而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。