仅仅是看书笔记,便于复习翻看
一、super
super不是一个对象的引用,不能将super付给另一个对象变量,他只是一个编译器调用超类方法的特殊关键字,使用super调用父类构造器的语句必须是子类的第一句。
用途
- 调用超类的方法
- 调用超类的构造器
注:在子类覆盖一个超类方法的时候,子类方法不能低于超类方法的可见性。特别是超类方法是public的时候,子类一定要声明为public。若遗漏之后,编译器将会把他解释称为更为严格的访问权限。
二、阻止继承
有时候程序设计者不想自己的类被继承,那么就会将自己的类使用final关键字进行修饰
public final class Father{...}
那么这个Father类就不允许其他任何类去继承他
复制代码
若只想类中的有些方法不想让子类对其进行修改覆盖,那么也可以使用final进行修饰
public final String getName(){return name;}
复制代码
三、强制类型转换
子类的引用赋给一个超类变量,编译器是允许的 但是若超类的引用赋给一个子类变量的时候,必须使用类型转换
- 只能在继承层次内进行类型转换
- 在将超类转换成子类之前,应该使用instanceof进行检查
四、抽象类
比继承更具有通用性的,更高一个层次的结构就可以当作一个抽象类,抽象类不会实例化任何东西,只是封装一些通用的属性,通用的方法(抽象方法:不需要有方法的具体内容),也可以有具体的方法
建议将通用的实例域和方法(无论是不是抽象的)放在超类中(无论是不是抽象类)
- 拓展抽象类
- 在抽象类中定义部分抽象类的方法或不定义抽象类方法,这样也就必须把子类定义成抽象类
- 超类中定义全部的超类方法,子类就可以不抽象了
五、访问权限
private:对本类可见 public:对所有类可见 protected:对本包和子类可见(不推荐使用,破坏封装性) 默认:对本包可见
六、equals
equals是判断两个对象是不是有相同的引用
1. 特性
- 自反性:x.equals(x),返回true
- 对称性:y.equals(x)--->x.equals(y)都应该是true
- 传递性:x.equals(y),y.equals(z)----->x.equals(z)都是true
- 一致性:反复调用同一个,结果不应该变
- 任何非空引用x.equals(null),false
七、hashCode方法
散列码(hashCode)是由对象导出的一个整数值。无规律
注意
字符串的散列码是由内容导出的,若字符串内容相同即散列码相同 equals与hashCode的定义必须保持一致
八、toString方法
返回表示对象值得字符串。格式:类名,随后是一对方括号括起来的域值。 Manager[name=...,salary=...,hireDay=...]
建议 :自定义的每一个方法最好都有自己的toString方法,可以使使用这个类的人获得这个类得信息
九、泛型数组列表
Java中允许动态创建数组,即可以在运行时在确定数组的大小。
ArrayList是一个采用类型参数的泛型类,使用一对尖括号<>来指定数组列表保存的元素对象类型,例如:
ArrayList<Employee> staff = new ArrayList<>();
Java7以后后面的<>中可以省略
复制代码
使用add可以添加元素到数组中,若add数组已经被填满,那么它就会自动扩充数组,自动创建一个更大的数组(1.5倍扩容),当使用add添加完成后,可以使用**trimToSize()**进行数组自适应,调整成当前数组内元素数量的大小,垃圾回收器会回收多余的存储空间。(为了减少操作时间,确定不再扩容后使用trimToSize(),再次扩容就会花很多时间移动存储块)
访问数组列表
add添加新元素,set访问已经存在的元素,并进行替换,remove进行删除
十、对象包装器与自动装箱
Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean这六个类派生于Number。对象包装器是不可变的,一但构造了包装器,就不允许更改其内部的值。并且,对象包装器是final,不可以继承的。
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
它会将上一行自动执行成list.add(Integer.valueOf(3));
复制代码
这种变换叫做自动装箱,相反的,Integer--->int ,自动拆箱
装箱和拆箱是编译器认可的,而不是虚拟机
十一、枚举类
public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
复制代码
在比较两个枚举类的时候, 直接使用==进行比较即可
十二、反射
能够分析类能力的程序称为反射,作用:
- 在运行时分析类的能力
- 在运行时查看对象,例如:toString()方法
- 实现通用的数组操作代码
- 利用Method对象
1. Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪者每个对象所属的类。 然而,可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。 虚拟机为每一个类型管理一个Class对象。因此,可以使用 == 运算符实现两个类对象比较的操作,例如:
if(e.getClass() == Rmployee.class)
复制代码
newInstance()
动态创建一个类的实例。newInstance方法调用默认无参构造器,创建一个与调用它具有相同类的类型的实例
2. 利用反射分析类的能力
java.lang.reflect包中有三个类Field、Method和Constructor分别描述类的域、方法和构造器。
getClass(),用来返回项目的名称。
Filed类有一个getType方法,用来返回描述域所属类型的Class对象。
Modifiers类中的isPublic、isPrivate或idFinal判断方法或构造器是否是public、private或final。
Class类中的getFields、getMethods和getConstructors方法将分别返回类提供给的public域、方法和构造数组,其中包括超类的公有成员。getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将分别返回