继承:基于已经存在的类一个新类,复用这些类的方法和域。用extends表示。实现代码的复用性。

继承层次:由一个公共超类派生出来的所有类的集合。继承链:继承层次中从某个特定的类到其祖先的路径。通常一个祖先类可以有多个子孙继承链。

反射:在程序运行期间发现更多的类及其属性的能力。

域(field):是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。

多态:一个对象变量可以指示多种实际类型的现象。实现代码的灵活性。

动态绑定:在运行时能自动选择调用哪个方法。调用的方法依赖于隐式参数的实际类型。是默认的处理方式。

静态绑定:private方法、static方法、final方法或者构造器,编译器可以准确知道调用哪个方法。 

一.类、超类和子类

1.extends表明:正在构造的新类派生于一个已存在的类。如:class Manager extends Employee{ }

2.超类/父类/基类:已存在的类。      子类/派生类:新类。

一般将通用方法放在超类中,有特殊用途的方法放在子类中。子类的功能比超类更加丰富,子类继承超类的方法,同时还有属于自己的新方法。

3.super:A.调用超类的方法。当超类中的有些方法对子类不适用时,需要在子类中重新定义一个新的方法来覆盖超类中这个方法。但是子类的方法不能直接访问超类的私有域,可以使用关键字super.来调用超类中的方法。如:super.getSalary()

B.调用超类的构造器。此时必须是子类构造器的第一条语句。构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器。

4.this:A.引用隐式参数。B.调用该类其他的构造器。

5.继承关系规则-置换法则:出现超类的地方都可以用子类对象置换。

6.可以直接将子类的引用赋值给超类的变量;但不能直接将超类引用赋值给子类变量,必须进行类型转换。

只能在继承层次内进行类型转换。在将超类转换成子类之前,应该使用instanceof进行检查。一般尽量少用类型转换和instanceof运算符。

7.final:被声明为final的类不允许被扩展,类的方法也会自动成为final,域不会。被声明为final的域,构造对象之后就不允许再改变值了。

  A.final既可用在静态变量又可用在非静态变量。

  B.final的值一旦被赋值就不能更改。是常数,常数的名称要都是大写的。

  C.final的method不能被覆盖过。

  D.final的类不能被继承过,即不能创建它的子类。

8.抽象类不能被实例化。包含一个或多个抽象方法的类必须被声明为抽象的;即使不含抽象方法的类也可以声明为抽象的。

9.控制可见性的4个访问修饰符:

(1)private —— 仅对本类可见

(2)public —— 对所有类可见

(3)protected —— 对本包和所有子类可见

(4)默认 —— 对本包可见

 

二.所有类的超类:Object

1.如果没有明确指出超类,Object就被认为是这个类的超类。所以要熟悉这个类的服务。

2.equals方法:检测一个对象是否等于另外一个对象,判断两个对象是否有相同的引用。

  对于数组类型的域,可以使用静态的Arrays.equals方法来检测相应数组元素是否相等。

3.hashCode方法,不同对象的散列码(hash code)基本不会相同。

4.toString方法:返回对象的字符串。   比较常见,因为只要对象与一个字符串通过操作符“+”连接起来,Java编译就会自动调用toString方法来获得该对象的字符串描述。

 

三.泛型数组列表

1.ArrayList类:可自动调节数组容量。 ArrayList是一个采用参数类型的泛型类,尖括号< >。

如:声明和构造一个保存Employee对象的数组列表。 ArrayList<Employee> staff = new ArrayList<>();

2.一些方法:set,get,add,remove

(1)不必指出数组大小;(2)使用add添加元素;(3)使用size()替代length计算元素数组;(4)使用a.get(i)替代a[i]访问元素。

 

四.对象包装器与自动装箱

所有的基本类型都有一个与之对应的类,通常这些类称为包装器。

list.add(3); 自动转换成 list.add(Integer.valueOf(3)); 这种变换称为自动装箱。

装箱和拆箱是编译器认可的,而不是虚拟机。

 

五.参数数量可变方法

现在的版本提供了可以用可变的参数变量调用的方法。

允许将一个数组传递给可变参数方法的最后一个参数。

 

六.枚举类

在比较两个枚举类型的值时,直接用==就可以了,而不需要调用equals。

所有枚举类型都是Enum类的子类。toString方法能返回枚举常量名,其逆方法是静态方法valueOf。

 

七.反射

1.反射库提供了丰富且精心设计的工具集,以便编写能够动态操纵代码的程序。

2.反射:能够分析类能力的程序。

  反射是一种功能强大且复杂的机制。使用它的一般是工具构造者,而不是应用程序者。

3.反射的功能:(1)在运行中分析类的能力;(2)在运行时查看对象f.get(obj);(3)实现通用的数组操作代码;(4)利用Method对象调用任意方法。

4.一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。如:int不是类,但int.class是一个Class类型的对象。

5.在运行时使用反射检查类的结构:

6.在运行时使用反射分析对象:查看对象域的关键方法是Field类中的get方法。f.get(obj)将返回一个对象,其值为obj域的当前值。

7.使用反射编写泛型数组代码:

8.调用任意方法:Method类中有一个invoke方法,允许调用包装在当前Method对象中的方法。 Object invoke(Object obj,Object... args)

八.继承设计的技巧

(1)将公共操作和域放在超类;

(2)不要使用受保护的域;

(3)使用继承实现“is-a”关系;

(4)除非所有继承的方法都有意义,否则不要使用继承。

(5)在覆盖方法时,不要改变预期的行为;

(6)使用多态,而非类型信息;

(7)不要过多的使用反射。