多态与类型转换
子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同 方法体不同
多态的优势和应用场合 多态:同一个引用类型,使用不同的实例而执行不同的操作 实现多态的两种形式 1.使用父类作为方法形参实现多态 2.使用父类作为方法返回值实现多态
形式1.1:父类做形参 子类做实参 形式1.2:父类做类型 子类实例化 (数据类型中的自动类型转换) 形式2.1:父类作为方法的返回值 子类实例化,类型自动转换
生活中的多态: 打印机 结论: 同一事物,由于条件不同,产生的结果也不同
多态实现思路: 编写父类 编写子类,子类重写父类方法 运行时,使用父类的类型,子类的对象(自动类型转换)
优势:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。 举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。 比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。 使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。 简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。
多态的终极目标:为了实现统一调用
■多态可以减少类中代码量 ·可以提高代码的可扩展性和可维护性 ■向上转型一子类转换为父类, ·自动进行类型转换 ■向下转型一父类转换为子类, ·结合instanceof运算符进行强制类型转换
注:方法重载也是多态的一种体现
栗子:
/**
*
*/
package bdqn.javademos;
/**
*
* @author: 房上的猫
*
* @time: 下午3:51:59
*
* 博客地址: https://www.cnblogs.com/lsy131479/
*
*/
/**
* @author xjz
*父类 宠物类
*/
public class Pet {
public void eat(){
System.out.println("pet正在吃");
}
}
/**
*
*/
package bdqn.javademos;
/**
*
* @author: 房上的猫
*
* @time: 下午3:51:59
*
* 博客地址: https://www.cnblogs.com/lsy131479/
*
*/
/**
* @author xjz
*
*/
public class Cat extends Pet {
public void eat(){
System.out.println("猫吃猫粮");
}
public void ball(){
System.out.println("猫玩球");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*子类:狗狗类
*/
public class Dog extends Pet{
public void eat(){
System.out.println("狗狗吃狗粮");
}
public void catchFlyDisk(){
System.out.println("狗狗玩飞盘");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*企鹅类
*/
public class Penguin extends Pet{
public void eat(){
System.out.println("企鹅吃鱼");
}
public void swiming(){
System.out.println("企鹅游泳");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*主人类
*/
public class Master {
public void feed(Pet pet){
pet.eat();
}
//领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换
public Pet getPet(int typeid){
Pet pet=null;
if(typeid==1){
pet=new Dog();
}
else if(typeid==2){
pet=new Penguin();
}
else if(typeid==3)
{
pet=new Cat();
}
return pet;
}
}
package bdqn.javademos;
import java.util.Scanner;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//多态的形式1
Dog dog=new Dog();
Penguin peng=new Penguin();
Cat cat=new Cat();
Master ms=new Master();
ms.feed(dog);
ms.feed(peng);
ms.feed(cat);
//多态的形式2:父类做类型,子类实例化
Pet pet=new Dog();//自动转换
pet.eat();
//调用领养宠物 形式3:父类作为方法的返回类型
System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) ");
Scanner input=new Scanner(System.in);
int xz=input.nextInt();
Master dx=new Master();
Pet pets=dx.getPet(xz);
pets.eat();
}
}
instanceof运算符的使用
作用:用来判断一个对象是否属于一个类或者实现一个接口
类型转换比较 1. 子类转换父类 向上转型 自动转换 2. 父类转换子类 向下转型 使用isntanceof用作比较判定 子类 对象名 = (子类)父类; 使用子类对象
栗子:
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*父类 宠物类
*/
public class Pet {
public void eat(){
System.out.println("pet正在吃");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*
*/
public class Cat extends Pet {
public void eat(){
System.out.println("猫吃猫粮");
}
public void ball(){
System.out.println("猫玩球");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*子类:狗狗类
*/
public class Dog extends Pet{
public void eat(){
System.out.println("狗狗吃狗粮");
}
public void catchFlyDisk(){
System.out.println("狗狗玩飞盘");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*企鹅类
*/
public class Penguin extends Pet{
public void eat(){
System.out.println("企鹅吃鱼");
}
public void swiming(){
System.out.println("企鹅游泳");
}
}
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*主人类
*/
public class Master {
public void feed(Pet pet){
pet.eat();
}
//领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换
public Pet getPet(int typeid){
Pet pet=null;
if(typeid==1){
pet=new Dog();
}
else if(typeid==2){
pet=new Penguin();
}
else if(typeid==3)
{
pet=new Cat();
}
return pet;
}
//主人和宠物玩耍的行为
public void play(Pet pet){
if (pet instanceof Dog) {
Dog dog=(Dog)pet;//向下转型
dog.catchFlyDisk();
}else if(pet instanceof Penguin){
Penguin peng=(Penguin)pet;
peng.swiming();
}else if(pet instanceof Cat){
Cat cat=(Cat)pet;
cat.ball();
}
}
}
package bdqn.javademos;
import java.util.Scanner;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//多态的形式1
Dog dog=new Dog();
Penguin peng=new Penguin();
Cat cat=new Cat();
Master ms=new Master();
ms.feed(dog);
ms.feed(peng);
ms.feed(cat);
//多态的形式2:父类做类型,子类实例化
Pet pet=new Dog();//自动转换
pet.eat();
//调用领养宠物 形式3:父类作为方法的返回类型
System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) ");
Scanner input=new Scanner(System.in);
int xz=input.nextInt();
Master dx=new Master();
Pet pets=dx.getPet(xz);
pets.eat();
dx.play(dog);
}
}
(C) 房上的猫 。 保留所有权利。 https://www.cnblogs.com/lsy131479/
如需转载,请注明出处!!!