继承
当程序中写入了多个类时,通常会发现类中有很多重复、相似的代码,所以可以考虑将这些类中重复的、相似的代码单独拿出来存放到一个类(这个类称为父类)中,由其他的类(这种类称为是子类)用extends关键字遗传父类中的属性和行为方法,就像人的基因遗传一样,子类中单独写父类中没有的特性,这个过程称为是继承。
好处:减少代码冗余,提高代码复用性,便于功能的扩展
继承的格式:class A extends B{ } 如果在类声明中未使用extends关键字指明父类,则默认为java.lang.Object类
A:子类,派生类,subclass
B:父类,超类,基类,superclass
注意:
子类一旦继承了父类,就获取了父类中声明的所有方法和属性,包括父类中声明为private的属性方法,只是因为封装性的影响是子类不能直接调用父类的结构。
一个类可以被多个类继承,一个类只能继承一个类。
子父类是相对概念,直接继承的父类称为直接父类,间接继承的父类称为间接父类。
子类继承父类之后,就获取了直接父类以及所有间接父类中声明的属性和方法。
所有java类(除了java.lang.Object类之外)都直接或间接继承于Object类。
Person类
继承Person的Student类
测试
Debug调试
1.加System.out.println语句
2.设置断点
方法重写
子类继承父类后,可以对父类中同名同参数的方法进行覆盖。
注意:
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。
子类不能重写父类中被声明为private的方法。
父类被重写的方法的返回值类型为void,则子类中重写的方法的返回值也只能是void;
父类被重写的方法的返回值为A类,则子类中重写的方法的返回值可以是A类或A的子类
父类被重写的方法的返回值是基本数据类型,则子类重写的返回值与之相同。
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
子类和父类中的同名同参数的方法要么都声明为static,要么都为非static。(考虑重写)
父类中的speak方法
子类中重写的speak方法
调用speak方法
结果
super关键字
子类中出现与父类同名的属性,用super.属性名来调用父类中的属性;
调用父类中被重写的方法;
super调用构造器
必须声明在子类构造器的首行,子类构造器如果没有显式的使用super(参数列表)或者this(参数列表)会默认调用父类的无参构造器。
多态性
可以理解为一个事物的多种形态
何为多态性
对象的多态性:父类的引用指向子类的对象
多态的使用:虚拟方法调用 (不适用于属性)
有了对象的多态性以后,我们在编译器,只能调用父类中声明的方法,但在执行期,我们实际执行的是子类重写父类的方法。 编译看左边,执行到右边
多态的使用前提:1.类的继承关系 2.方法的重写
例子
使用子类特有的方法
向下转型:
Person GYQ=new Student();
Student stu=(Student)GYQ; //强制类型转换,可能会报异常
instanceof关键字
a instanceof A 判断对象是否是类A的实例
获取父类的方法:类.getClass().getSuperclass()
重载和重写的区别
Object类
clone():克隆并返回一个实例对象
equals():只能引用数据类型调用,Object类中的equals方法比较的是地址值。在String,Date,File,包装类等都重写了equals方法其比较的是两个对象的实体内容是否相同。
运算符 == :基本数据类型比较值,引用数据类型比较地址
toString():返回对象的内存地址
结果:
单元测试
选中项目 > 右键 > build path > 选中Libraries class path > add library
创建一个java类进行单元测试
要求:类是public的,提供一个公共的无参的构造器
声明单元测试方法
要求:方法权限是public,没有返回值,没有形参,方法上
需要声明注解:@Test 导入:import org.junit.Test;
双击单元测试方法名,run as Junit Test
如果执行结果没有异常,绿条。否则为红条。
包装类
基础数据类型,包装类,String类型的转换
基本数据类型转换成包装类
调用包装类的构造器
写的不是标准的true都认为false。↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
包装类转基本数据类型
调用包装类的xxxValue( )
自动装箱,自动拆箱
j
基本数据类型,包装类转String类型
String类型转基本数据类型,包装类
tips:三元运算符两个类型要统一
否则会自动类型提升