1.向上转型
对象的创建以及使用方式:
当前类名称 引用=new 当前类( ); --->eg: Person per =new Person();
父类名称 父类引用=new 子类实例( ); --->eg: Animal animal=new Cat();----> 对象天然的向上转型,从右向左读这句话--->Cat is an Animal.
Dog和Cat都是Animal的子类,这两个类都在Animal的范围之内,因此,dog 亦或是 cat实例都属于共同父类Animal的引用。
animal.eat();调用的是谁?-->向上转型不看前面的父类,就看new在哪里。
若调用方法有被子类重写,则调用的一定是子类重写后的方法
PS:对象的向上转型类似于基本数据类型的小类型转为大类型,自动提升。向上转型,new子类实例,子类实例天然就是父类的包含范围之内,满足天然的is a原则。
PS:向上转型是天然发生的,子类对象被父类引用接收,小类型的对象转换为大类型的对象。父类引用方法名称到底调用的是父类方法还是子类方法,就看new在哪里.
PS:父类名称 父类引用=new 子类实例();
--> 通过 父类引用. 操作的属性和方法,要看父类中是否有这些属性和方法。
--> 若存在,判断当前调用的这个方法是否被子类所重写,若重写,则调用的是子类重写后的方法。
--------->能不能”.“访问方法或者属性要看’前面‘父类中有没有,至于”.“之后到底调用的是父类方法还是子类方法,要看’后面‘new的子类是否重写了该方法。
向上转型的优点:
1)参数统一化
2)可以方便进行子类拓展
eg:
对象向上转型发生在以下三个位置:
1)直接赋值:父类名称 父类引用=new 子类实例(); --> Animal animal=new Cat();
2)方法传参:
3)方法的返回值:
2.向下转型
1》向下转型,就是将大类型的引用赋值为小类型的引用,需要强转。
Animal animal=new Dog(); // animal这个引用之内范围父类中优点属性和方法,若此时要访问子类Dog中独有的属性和方法,就需要发生向下转型。
--->向下转型:
PS:向下转型的两点说明:
要想发生向下转型,表现首先进行向上转型。
类型强转有风险,不能将毫无关系的两个类直接进行强转。
2》使用关键字instanceof来协助进行向下转型,只有能进行向下转型的引用,instance关键字才会返回true。
只有先通过向上转型建立父类引用和子类实例的联系之后,才能向下转型将父类引用还原为子类实例。向下转型有风险,判断能否向下转型,可以使用instanceof关键字来辅助处理。
3.方法重写(pverride):发生在有继承关系的类之间,子类定义了和父类处理权限不同(子类权限>=父类权限),返回值可以为向上转型类的返回值外,参数列表、方法名完全相同的方法就称之为方法重写。
1》权限问题
PS:父类是private权限,子类是public权限时,能否重写?---> 不能,私有方法不能被重写
PS:当一个方法比final修饰,说明该方法不能被重写。
PS:static修饰的静态方法能否被重写?--->不能,这里的重写方法都是和父类于子类对象相关的,静态方法压根就没有对象。静态方法不存在方法重写。
PS:构造方法能否被子类重写?--->不能,构造方法是为了产生对象,无法在子类中修改父类对象。
PS:关于方法重写的返回值,必须相同(除了向上转型的返回值之外 )。其它返回值,只有不相同都不能重写。
可以使用注解 @Override检查是否重写成功。--->当编译不出错,说明编写成功。
-->
4.final:终结器,到此为止。
1》final修饰属性
final修饰的属性-->之无法修改,使用关键字final来定义常量。
1> final修饰基本数据类型,值不能改,数值在定义后无法修改。eg:final a=10; // a就是一个常量,定义值后无法修改,只能保存10
2> final 修饰引用数据类型,直值不能修改,这个值指的是引用保存的地址不能改,地址中包含的内容时可以修改的。
在类中定义常量时,一般搭配static一起使用(不强制,一般来说,定义类中的常量,都是静态全局常量)。因此一般将类中常量定义为静态常量,和类绑定,所有对象共享此常量。
常量命名规则:常量使用全大写命名,多个单词使用_分隔,常量必须在定义时赋值。不存在默认值。
eg:final int AGE=18; final String STUDENT_NAME="ming";
2》被final修饰的方法不能重写(不允许子类覆盖)
3》被final修饰的类不能被继承,final修饰的类没有子类。--->JDK中String类就是一个典型的final类。
PS:为什么String类要用final修饰?-->保证JDK的使用者,大家用到的String类完全一样,没有任何别的版本。
关于组合和继承(类和类之间的关系):
学生类和人类就是典型的继承关系,Student is a Person,继承满足is a原则。继承关系的类之间是个树状结构。
学生类和学校类就是典型的组合关系,School has a Student,组合满足 has a原则。