多态--向上/下转型

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原则。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值