11.多态

本文详细介绍了Java中的多态性概念,包括多态访问成员变量和方法的特点。通过实例代码展示了多态向上转型和向下转型的用法,以及可能出现的问题和解决方案。在测试类中,展示了如何根据对象的实际类型进行安全的向下转型并调用特定方法。
摘要由CSDN通过智能技术生成

一、多态

1.概念:

一个对象有多种形态,必须是在接口或者继承中实现

语法:父类类名 对象名=new 子类类名()

2.多态访问成员变量特点

编译看左边,运行看左边

3.多态访问成员方法的特点

编译看左边,运行看右边

以以下代码为例,可以看出编译时无法编译xiaoming.numZi和xiaoming.showZi(),子类独有的资源,在运行后打印出来的num=100,show()方法打印出来的是子类中的show()中的语句 

代码-父类

package stu.qf.Demo1;

public class Fu {
    int num=100;
    int numFu=200;
    public void showFu(){
        System.out.println("父类独有方法");
    }
    public void show(){
        System.out.println("这是一个方法");
    }
}

代码-子类

package stu.qf.Demo1;

public class Zi extends Fu {
    int num=400;
    int numZi=300;
    public void showZi(){
        System.out.println("这是子类独有的方法");
    }
    public void show(){
        System.out.println("这是show方法重写之后");
    }
}

代码-测试类

package stu.qf.Demo1;

public class Test {
    public static void main(String[] args) {
        Fu xiaoming=new Zi();
        //访问成员变量:编译看左边,运行看左边
        System.out.println(xiaoming.num);
        System.out.println(xiaoming.numFu);
        //访问方法:编译看左边,运行看右边
        xiaoming.showFu();
        xiaoming.show();
    }
}

4.多态向上转型

语法:父亲的类名 对象名=new 子类的类名()

问题:多态向上转型不能访问到子类的独有资源

5.多态向下转型

语法:子类的类名 对象名=(子类的类名)父类对象的引用

问题:会发生类型转换异常 java.lang.ClassCastException

解决:在转换前判断是可以还原成功

语法:父类对象名 instanceof 子类类名 

代码-父类

package stu.qf.demo3;

public class Pet {
    public void show(){
        System.out.println("这是一个父类方法");
    }
}

代码-子类1

package stu.qf.demo3;

public class Dog extends Pet{
    public void show(){
        System.out.println("这是一个狗类方法");
    }
    public void showInfo(){
        System.out.println("这是一个狗类独有的方法");
    }
}

代码-子类2

package stu.qf.demo3;

public class Cat extends Pet{
    public void show(){
        System.out.println("这是一个cat类对象");
    }
    public void showInfo(){
        System.out.println("这是cat类独有的方法");
    }
}

测试类

package stu.qf.demo3;

public class Test1 {
    public static void main(String[] args) {
        Pet p=new Dog();
        if (p instanceof Dog){
            Dog d=(Dog)p;
            d.showInfo();
            d.show();
        }else if (p instanceof Cat){
            Cat c=(Cat) p;
            c.showInfo();
            c.show();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值