Core Java笔记——第5章

第五章继承

子类不能直接访问父类的私有域。

有人认为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方法的使用


你可能感兴趣的:(java,虚拟机,null,equals,扩展,编译器)