Java核心技术——继承和反射

来源:互联网 发布:游族网络待遇怎么样 编辑:程序博客网 时间:2024/06/06 20:50

一、超类和子类

1.通过扩展超类定义子类时,仅需要指出子类与超类的不同之处。超类中放的是通用方法,子类中放的是特殊方法

2.在子类中可以提供一个新的方法来覆盖超类中的方法

3.子类中需要用到超类的私有域时,可以使用特定的关键字super.getXXX来获取

4.在子类中可以增加域、增加方法或者覆盖超类的方法,绝不能删除继承的任何域和方法

5.子类的构造器不能访问超类的私有域,必须利用super调用超类的构造方法对这部分私有域进行初始化,super语句必须是子类构造器的第一条语句

6.使用final修饰符不允许被继承的类,final类中的所有方法自动成为final方法

7.当方法被声明为final时,子类就不能覆盖这个方法

8.包含一个或多个抽象方法的类必须被声明为抽象的,抽象类可以包含具体数据和具体方法

9.可以定义抽象类的对象变量,但不能被实例化

10.抽象类的子类中必须实现抽象类定义的抽象方法


二、Object类

1.Object类是所有类的超类,可以引用任何类型的对象,Java中只有基本类型不是对象

2.Object类的equals方法只有在两个对象变量指向同一个对象时才判断为相等,不能满足我们的要求,更多时候在自己的类中重新定义equals方法判断两个不同的对象是否相等

3.覆盖Object类的equals时,这是一个完美的equals方法建议:

  1)显式参数命名为otherObject

  2)检测this与otherObject是否引用同一对象:if (this == otherObject) return true; 这条语句是一个优化

  3)检测otherObject是否为null,如果为null,则返回false:if (otherObject == null) return false;

  4)比较this与otherObject是否属于同一个类。

    如果equals的语义在每个子类中有所改变,就是用getClass检测:if (getClass() != otherObject.getclass()) return false;

    如果所有的子类都拥有统一的equals语义,就使用instanceof检测:if (!(otherObject instanceof ClassName)) return false;

  5)将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;

  6)根据自己的需求比较相应的域,用==比较基本类型,用equals比较对象域:return field1.equals(other.field1) && ...;

4.如果在子类重新定义equals,就要在其中包含调用super.equals(other)

5.hashCode的返回值可以帮助一些集合类对象更快速地完成查找工作,建议重载一个类的equals方法时,一并重载hashCode方法。如果没有重载hashCode方法,有时候也未必会有问题

6.强烈建议为自定义的每一个类增加toString方法:public String toString() 重载Object的toString方法。(可以利用getClass().getName()得到类名字符串)在调用X.toString()的地方可以用“”+X代替,这条语句将空字符串与X的字符串表示相连接


三、泛型数组列表

1.new ArrayList<Employee>(100)表示数组列表有保存100个元素的潜力,可以保存超过100个元素。而new Employee[100]表示数组只有100个元素的存储空间,直接分配其100个位置。ArrayList不需要指定数组大小

2.ArrayList类使用get和set方法访问或改变数组元素。用add添加新元素,用size()计算元素数目,使用list.toArray(a)将数组列表拷贝到a数组中


四、对象打包器与自动打包

1.所有基本类型都有一个与之对应的类,如Ineger类对应基本类型int,这些类就是包装器:ArrayList<Integer> list = new ArrayList<Integer>();

2.list.add(3);会自动变换成list.add(new Integer(3));这种变换被称为自动打包,同理也会自动拆包


五、枚举类

1.所有的枚举类型都是Enum类的子类,枚举类用enum修饰,可以在其中添加一些构造器、方法和域

2.比较两个枚举类型的值时,直接使用“==”就可以

3.toString方法能返回枚举常量名,每个枚举类型都有一个静态values方法,返回一个包含全部枚举值的数组


六、反射

1.反射机制最重要的内容是检查类的结构,java.lang.reflect包中有三个类Field、Methud和Constructor分别用于描述类的域、方法和构造器

2.java.lang.reflect包中的Array类允许动态地创建数组,可用Arrays的静态方法copyOf扩展数组

3.不要使用Method对象的回调功能,使用接口进行回调

4.常用的是Class的forName方法和newInstance方法


七、继承设计的技巧

1.尽可能把子类共有的方法和域放到超类中

2.除非特殊情况,否则不要使用protected字段,如:需要定义一个只有子类可见的常量,则需要定义protected static final

3.“is-a”是两个类之间是否应该定义为超类和子类关系的一种简单有效的判断方法

4.超类的所有方法对子类都是应该有意义的,如果不能做到这一点,应查看设计是否存在问题

5.子类重载父类方法时,不要随便改变父类方法的用途或意义

6.多考虑使用多态性编写代码

7.不要过多使用反射






0 0
原创粉丝点击