继承

1.1Java中所有的继承都是公有继承,没有C++中的私有继承和保护继承。
1.2使用super调用超类构造器的语句必须是子类构造器的第一条语句(若没有显示调用则调用超类默认构造器)。
1.3多态:一个对象变量可以引用多种实际类型的现象;
动态绑定:在运行时(虚拟机)能够自动的选择调用哪个方法的现象。
1.4动态绑定
对于private、static、final方法或构造器,编译器可以准确知道应该调用哪个方法,这种调用方式称为静态绑定。除此之外的方法,将采用动态绑定
1.5阻止继承:final类和方法
final类中的所有方法自动称为final方法(不包括域);类中的方法可以被声明为final方法,此时,子类不能覆盖这个方法。构造对象之后就不能更改final域值。
1.6抽象类不能被实例化
1.7访问修饰符
private:仅对本类可见;
public:对所有类可见;
protected:对本包和所有子类可见;
无修饰符:默认对本包可见。
1.8Java中,只有基本类型不是对象。
1.9hashCode()方法
字符串(String)的散列码是由内容导出的。Object类的默认hashCode()方法返回值为对象的存储地址。
两个相等的对象要求返回相等的散列码。x.equals(y)
1.10ArrayList<Employee> staff = new ArrayList<Employee>(100)
确认数组列表不会添加任何元素时,调用trimToSize,将存储区域的大小调整为当前元素数量所需要的存储空间数目,垃圾回收器将回收多余的存储空间。
1.11所有的基本类型都有一个与之对应的类,称为包装器(final类)。
Integer、Long、Short、Float、Double、Byte、Character、Void、Boolean(前6个类派生于公共的超类Number)。一旦构造了包装器,就不允许更改包装在其中的值。
!!自动打包规范要求boolean、byte、char<=127,介于-128~127间的short和int被包装到固定的对象中。
打包和拆包是编译器认可的,而不是虚拟机。
2.反射
2.1设f是一个Field类型的对象(通过Class对象调用getDeclaredFields得到的对象),obj是某个包含f域的类的对象,f.get(obj)将返回一个对象,值为obj域的当前值。
反射机制的默认行为受限于Java的访问控制

  Employee harry = new Employee("Xixi",10000,10,1,1990);
  Class c1 = harry.getClass();
  Field f = c1.getDeclaredField("name");
  //Object o = f.get(harry);//name为私有域,get()方法抛出IllegalAccessException
  //调用Field、Method、Constructor对象的setAccessible方法将域设置为可访问的。
  //将所有域设置为可访问:AccessibleObject.setAccessible(fields,true);
  f.setAccessible(true);
  Object o = f.get(harry);
  //f.set(harry,"Xuedi");//设置新值

2.2使用反射编写泛型数组代码
Array类中的静态方法newInstance能够构造新数组:
Object newArray = Array.newInstance(componentType,newLength);

  static Object ArrayGrow(Object a){
     Class c1 = a.getClass();
     if(!c1.isArray()){
         return null;}
     int length = Array.getLength(a);
     int newLength = length*11/10+10;
     Class componentType = c1.getComponentType();
     Object newArray = Array.newInstance(componentType,newLength);
     System.arrayCopy(a,0,newArray,0,length);
     return newArray;
  }
  //ArrayGrow(Object a)可以扩展任意类型的数组
  int[] a = {1,2,3,4,5};
  a = (int[])ArrayGrow(a);
  /*
  static void ArrayCopy(Object from,int fromIndex,Object to,int toIndex,int count)
  from:任意类型的数组
  fromIndex:原始数组待拷贝元素的起始下标;
  to:与from同类型的数组;
  toIndex:目标数组放置拷贝元素的起始下标;
  count:拷贝的元素数量
  */

2.3方法指针
(类似Field类的get方法查看对象域的过程)
Method类中有一个invoke方法:
Object invoke(Object obj,Object…args)
:第一个参数”obj”是隐式参数(静态方法可将其设置为null),其余对象提供显示参数。

  //m1为Employee类的getName方法
  String n = (String)m1.invoke(harry);
  //m2为Employee类的getSalary方法
  double s = (Double)m2.invoke(harry);

getMethod方法:
Method getMethod(String name,Class…parameterTypes)

Method m1 = Employee.class.getMethod("getName");
Method m2 = Employee.class.getMethod("getSalary",double.class);

!! invoke的参数和返回值都必须是Object类型,会使得进行多次类型转换,使编译器错过检查代码的机会。
最好不要使用Method对象的回调功能,而最好使用接口和内部类(会使得代码执行速度更快,更易于维护)
3.继承设计的技巧
3.1将公共操作和域放在超类
3.2不使用受保护的域(破坏了封装性)
3.3使用继承实现”is-a”关系
3.4使用多态,而非类型信息
3.5不要过多使用反射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值