子类不能直接访问父类的私有域。
有人认为super和this一样,但super并不是一个对象的引用,不能将super赋值给一个对象变量。他只是一个指示编译器调用父类方法的特有关键词而已。
This的作用:
1 调用本类的构造函数——需要在构造函数中的第一句调用。
2 隐式参数--指向该对象。可以调用该对象的属性和方法。
Super的作用
1 调用父类的构造函数——需要在构造函数中的第一句调用
2 调用父类的方法。
子类构造函数中如果没有显示调用父类的构造函数,则会调用父类的默认构造函数。 Parent(){ } 如果在父类中没有定义无参的构造函数,而子类构造函数又没有显示地调用父类的其他构造函数,那么将会报错。
如果类中没有定义任何构造器,那么系统会生成一个无参的构造器。如果自己定义了,系统就不会生成了。
Is a的另一种表达方式就是置换法则,意思是任何父类对象的地方都可以用子类替代。
法则:编译时看左边,运行时看右边。
意思是编译时根据左边声明的类型去执行,要看声明的类型有无这个方法,如果没有,编译失败。而只要编译通过,就会执行动态绑定(如果有的话)。
数组自动记录初始定义的类型。即使指向了子类,也不能调用父类中没有而子类中有的方法。
方法名和参数列表称为方法签名,但是返回值类型却不包括在内。现在允许子类将覆盖方法的返回值定义为父类返回类型的子类。
在覆盖一个方法的时候,子类方法的可见性不能低于父类方法,但是可以高于。
如果有private、 static、 final类型的参数,或者构造器,称为静态绑定。
Public的方法执行动态绑定。
虚拟机为每个类都定义了方法列表,执行动态绑定时,查找之。
动态绑定的特点:方便类的扩展,只要对象实际指向一个新类,则会动态调用新类的同名方法。
类声明为final,只有类型的方法自动成为final,域则不是。
用a instanceof B判断对象a属于B类,然后强制类型转换 B b = (B)a;
若出错,则抛出ClassCastException
类即使不含抽象方法也可以被声明为抽象类。抽象类中既可有抽象方法,也可有非抽象方法。
抽象类不能被实例化。
类的控制符:
Public所有类可见
Protected本包及子类可见
Default默认即没有任何标记的,本包可见
Private本类可见
Equals方法
1判断同一对象。即 == return true
2 为空 return false
3判断getClass不等 return false
4 强转后判断其中内容一致
如果在子类中重新定义equals方法,一定要先
if(!super.equals(obj))return false; 然后再强转,并判断子类多出来的属性是否相等。
Equals的特点
1 自反性 x.equals(x) true
2 对称性 若x.equals(y),则y.equals(x)
3 传递性 xy yz 则 xz
4 一致性 多次运行同一表达式返回结果一致
5x.equals(null) 返回false
Hashcode本是由对象地址导出的一个整数值。
重写Equals必须与重写hashcode,如果两个对象相同equals,那么hascode结果要一致,如果不equals,那么hascode不要求一定不相同。但是为不同的对象生成不同的hascode能够提高hash表的性能。
把对象放入hash表时,会根据hashcode找到要放的位置,然后再用equals判断是否有重复值了。hash表是个数组,每个值对应一个链表。这应该就是为什么hashcode要保证和equals相等时结果一致的原因。
强烈建议为每一个类定义一个toString方法。
toString格式 类名[name=abc, age=12]
打印多维数组,Arrays.toDeepString
ArrayList<T>是采用类型参数的泛型类(genericclass)
如果能估算出需要使用的长度,就可以在填充元素之前调用a.ensureCapacity(30).
而如果确认不再需要添加元素之后,可以调用a.trimToSize(). 这个方法将list的大小调整为需要的大小,垃圾回收器将回收多余的空间。
对象包装器类是不可变的,一旦构造了包装器,就不能更改其中的值。而且还是final的,不能定义子类。
自动装箱拆箱(自动打包拆包)
list.add(3) ; 会自动变成 list.add(new Integer(3));
int n = list.get(i); 会自动转变成 int n =list.get(i).intValue();
但是注意对比包装类是否相等时,需要使用equals,而不能使用==。(曾经见到过这类错误,要谨记)
NumberFormat.parse(String s) 将String类型的number转换为number类型。
参数数量可变的方法
f(String s, Object … args)
该方法等同于 f(String s, Object[] args)
这里的…是java代码的一部分,他表示可以接受任意数量的参数,相当于数组。
你甚至完全可以将main方法写成 main(String … args)
枚举类 这个类定义要自己写写才明白
int ordinal() 方法返回enum中声明的位置,从0开始计数。
int compareTo(E other) 比较声明中的先后顺序,返回一个位置的差值
反射获取类的方法,三种:
对象.getClass()
T.class T代表的是一种类型,但未必是一种类,例如 int.class
Class.forName(包名.类名)
虚拟机为每个类管理一个Class对象,因此可以用==来判断所属的类是否相同。
e.getClass()== Employee.class
创建对象 Class.forName(包名.类名).newInstance()
newInstance调用默认构造函数创建一个对象,如果没有默认的构造函数,将会报错。
利用反射分析类的能力
class.getFields() getMethods() getConstructors() 获得类的所有public域、方法、构造器,其中包括父类的public。
clsass.getDeclaredFields() getDeclaredMethods()getDeclaredConstructors()则获取类的(不包括父类)所有域、方法和构造器,既有public的,也有其他类型的。
利用反射对类进行的一些行为需要考虑类的访问控制权限。如果java程序没有受到安全管理器的控制,那么可以覆盖类的访问控制。
f.setAccessible(true)
这个方法是AccessibleObject类中的方法,他是Field Method Constructor的公共父类。
invoke方法的使用