重写(override/overwrite)
1.子类继承父类后,可以对父类中同名同参的方法进行覆盖操作
2.重写以后,当创建子类对象以后,通过子类对象调用子父类中同名同参的方法时,实际调用的是子类重写后的方法
重写的规定:
- 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
- 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
【注】子类不能重写父类中声明为private的方法,因为private太小,根本算不上重写
- 返回值类型
父类的返回值类型是void,子类必须也是void
父类的返回值类型是A类型,子类必须是A或A的子类
父类的返回值类型是基本数据类型,子类必须也是基本数据类型【基本数据类型没有子类】
- 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
子类和父类中的同名同参的方法要么都声明为非static(可以考虑重写),要么都为static(静态方法不能被重写,不能被覆盖)
super关键字的使用
- super理解为:父类的
- super可用来调用:属性、方法、构造器
- super的使用:调用属性的方法
- 在子类的方法或构造器中,通过使用“super.属性/方法” 显式地调用父类中声明的属性或方法,一般可省略“super.”
- 子类和父类中定义了同名的属性后,在子类中调用父类中声明的属性必须显式地使用“super.属性”
- 子类重写了父类中的方法,在子类中调用父类中的方法,必须显式地使用“super.方法”
- super调用构造器
- 可以在子类的构造器中显式地使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
- “super(形参列表)”的使用,必须声明在子类构造器的首行【每个构造器的首行】
- 在类的构造器中,“super(形参列表)”和“this(形参列表)”只能二选一
- 在构造器的首行,没有显式声明“super(形参列表)”和“this(形参列表)”,则默认是“super(形参列表)”,调用父类中的空参构造器
- 在类的多个构造器中,至少有一个类的构造器使用了“super(形参列表)”
子类对象实例化全过程
1.结果上(继承性)
子类继承父类后,就获取了父类中声明的属性或方法
创建子类对象后,在堆空间中,就会加载所有父类中声明的属性
2.过程上
通过子类的构造器创建子类对象时,一定会直接或简介调用其父类的构造器,进而调用父类的父类…直到调用了java.lang.Object类中的空参构造器为止。
多态性
1.可理解为一个事物的多种状态
2.何为多态性:
- 父类的引用指向子类的对象
- 当调用子父类同名同参的方法时,实际执行的是子类重写父类的方法——虚拟方法调用
3.多态的使用:
有了对象的多态性后,编译时只能调用父类中声明的方法;运行时实际执行的是子类重写父类的方法
总结:编译看左边,运行看右边(e.g. Person p = new Man())
4.多态性的使用前提:
1)类的继承关系
2)方法的重写
5.对象的多态性只适用于方法,不适用于属性
【注】不能调用子类所特有的方法和属性;编译时,p是Person类型
有了对象的多态性后,内存中实际是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时只能调用父类中声明的方法
如何使用子类特有的属性和方法?
使用强制类型转换符(但是可能会存在转换不成功,要用instanceof 测试)
e.g. Person p = new Man():
Woman w = (Woman)p;
a instanceof A:判断对象a是否是类A的示例 true/false
如果a instanceof A 为true,a instanceof B也为true
B是A的父类
父类 A = new 子类();
子类 B = (子类)A;【new的类必须是子类才可以强转,如果是new的父类则不能强转为子类】
==:对于引用数据类型,比较的是两个引用数据类型变量的地址值是否相等
==和equals()的区别
==: 1.可以使用在基本数据类型变量和引用数据类型变量中
2. 如果比较的是基本数据类型变量,比较变量保存的数据是否相等
如果比较的是引用数据类型变量,比较两个对象的地址值是否相同
equals():1.只是一个方法
2.只适用于引用数据类型
【注】Object类中定义的equals()和==相同,都是比较地址值
3.String,Date,File、包装类等都重写了Object类中的equals()方法,比较的并不是地址值,而是“实体内容”是否相同
4.通常情况下,自定义类如果使用equals()方法,通常也是比较“实体内容”
Junit单元测试
创建Java类,进行单元测试
要求:①类是public的②此类提供公共的无参构造器
此类中声明单元测试方法
此时的单元测试方法,方法权限是public,无返回值,没有形参
此单元测试方法上需要声明注释:@Test并在单元测试类中导入
Object类中toString()的使用:
- 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
- String,Date,File、包装类等都重写了Object类中的toString()方法
包装类的使用:
基本数据类型->包装类:调用包装类的构造器【有了自动装箱就不用再写了,直接赋值即可】
包装类->基本数据类型:调用包装类Xxx的xxxValue()方法【有了自动拆箱就不用再写了,直接赋值即可】
JDK5.0新特性:自动装箱与自动拆箱
基本数据类型、包装类->String,调用String重载的valueOf(Xxx xxx)
//连接运算
String str1 = num1 + "";
//调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);
String类型->基本数据类型、包装类,调用parseXxx()
错误:使用强转符,必须要有子父类关系才能用