1)在子类覆盖超类的方法时,子类方法不能低于超类方法的可见性,这是为了保证父类指针能引用子类的方法;
2)java中,抽象类不能被实例化,但可以定义一个抽象类的对象变量,让它去引用非抽象子类的对象;
3)Java中用于控制可见性的4个访问修饰符:
- 仅对本类可见–private;
- 对所有类可见–public;
- 对本包和所有子类可见–protected;
- 对本包可见–默认,即没有表明任何修饰符的情况,这是一种不太受欢迎的形式;
4)完美equal方法的建议:
- 显示参数命名为otherobject,稍后需要将它转换成另一个叫做other的变量;
- 检测this和other是否引用同一个对象;
if(this == otherObject) return ture;
- 检测otherobject是否为null,如果为null,返回false
if(otherObject == null) return false;
- 比较this与otherObject是否为同一类。如果equal的语义在每一个子类中有所改变,就使用getClass检测:
if(getClass() != otherObjecr.getClass()) return false;
如果所有子类都拥有同一语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false;
- 将otherObject转换为相应的类类型变量:
ClassName other = (ClassName) otherObject;
- 现在开始对所有需要比较的域进行比较了。使用==比较基本类型域;使用equals比较对象域。如果所有的域都匹配,就返回true,否则返回false。
return field1 == other.field1
&& field2.equal(other.field2)
&& ...;
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。
警告: equals要覆盖Object类的equals方法。
4) toString:
- 只要对象与一个字符串通过操作符“+”连接起来,java编译就会自动调用toString方法,一遍获得这个对象的字符串描述 ;
- 数组的toString要通过调用静态方法Array.toString(多维数组调用Array.deepToString)修正以生成字符串。
- 建议为自己定义的每一个类增加一个toString方法。
5) 泛型数组列表 ArrayList:
- void set(int index,T obj) 设置数组列表指定位置的元素值,覆盖原有内容;
- T get(int index) 获得指定位置的元素值;
- void add(int index,T obj) 向后移动元素,以便插入元素;
- T remove(int index) 删除指定位置元素并返回,将后面的元素向前移动;
6) 对象包装器:
- int intValue() 以int的形式返回Integer对象的值;
- static String toString(int i) 以一个新String对象的形式返回给定数值i的十进制表示;
- static String toString(int i,int radix) 返回数值i的基于给定radix参数进制的表示;
- static String toString(String s) 返回字符串s表示的整型数值(十进制);
- static String toString(String s,int radix) 返回字符串s表示的整型数值(radix进制);
- static Integer valueOf(String s) 返回用s表示的整型数值进行初始化后的一个新的Integer对象;
- static Integer valueOf(String s,int radix) 返回用s表示的整型数值进行初始化后的一个新的Integer对象(radix进制)
- Number parse(String s) 返回s表示的数字值;
7) 枚举类:
- static Enum valueOf(Class enumClass,String name) 返回指定名字、给定类的枚举常量;
- String toString() 返回枚举常量名;
- int ordinal() 返回枚举常量在enum声明中的位置,位置从0开始计数;
- int compareTo(E other) 如果枚举变量出现在other之前,则返回一个负值;如果this==other,则返回0;否则,返回正值。枚举变量的出现次序在enum声明中给出。
8) Class类:
- 获得Class类对象的三种方法:
- Class cl=e.getClass();
- Class cl=Class.forName(className);
- Class cl=T.class; //T为任意的java类型,如int、Date和Employee等
- 虚拟机为,每个类型管理一个Class对象。因此可以利用==运算符实现两个类型对象的比较操作,如:
if(e.getClass() == Employee.class) ...
- newInstance():
- **说明:**newInstance方法调用没有参数的构造器,如果没有这样的构造器,则会抛出异常。
e.getClass().newInstance(); //创建了一个与e具有相同类型的实例
Class.forName(str).newInstance() //按名称str的类名创建对象
9) 利用反射分析类:
- java.lang.reflect包中有三个类Field、Method和Constructor分别用于描述类的域、方法和构造器。
- 三个类都有getName()用来返回项目的名称;
- 三个类都有getModifier(),它将返回一个整型数值,用不同的位开关描述public和static这样的修饰符的使用情况。另外还可以使用Modifier类中的toString()、isPublic()、isPrivate()或isFinal()这样的方法分析;
- Constructor和Method类中有一个getParameterTypes方法,以数组的形式返回构造器中参数的类型(Class对象);
- Method类中还有一个getReturnType()方法,以数组的形式返回方法的返回类型(Class对象);
- Class类中有getFields()、getMethod()和getConstructor()方法,分别返回类提供的public域、方法和构造器数组,其中包括超类的公有成员;
- Class类中还有getDeclareFields()、getDeclareMethod()和getDeclareConstructors()方法,返回类中声明的全部域、方法和构造器,其中包括私有和受保护成员,但不包含超类成员;
- Class类中getName()方法返回项目名称(String);
- Class类中还有getType()方法返回项目类型(Class对象);
10) 接口:interface详解(from cdsn)