Java学习 java -- 多态

本文介绍了面向对象编程中的多态概念,包括其实现的前提条件、如何在不同情况下调用方法及成员变量,以及多态带来的好处与限制。同时,通过具体示例展示了父类引用指向子类对象时的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态:一种事物的多种形态

多态的规则(前提):
1.类与类之间要建立关系,建立继承的关系
2.必须要有方法的重写
3.父类的指针(引用) 指向子类的对象(空间)

public static void main(string[] args){
Cat cat = new Cat();
cat.eat();

Animal a = new Cat();
a.eat();

Animal aDog = new Dog();
aDog.eat();
}
class Animal{
public void eat(){
system.out.println("吃饭");
}
}
class Cat extends Animal{
public void eat(){
system.out.println("猫吃鱼");
}
}
class Dog extends Animal{
public void eat(){
system.out.println("狗吃肉");
}
}

猫是一只动物 而不是动物是一只猫 这样逻辑是不通的 在这里动物是父类 猫狗是子类 猫狗是一只动物就相当于父类指向了子类的对象

多态时如何调用成员变量
多态时 当父类引用调用成员变量时
编译 需要看父类中有没有这个成员变量,没有编译不通过
运行 访问就是父类中的这个成员变量
结论:
多态时 访问成员变量 访问父类 访问成员变量 编译 和 运行 (看父类)

多态调用成员变量时
编译看父类 运行看子类

public static void main(string[] args){
Father f = new Son();
f.speak();
system.out.println(f.num);

}
class Father{
int num = 10;
public void speak(){
system.out.println("Father 说");
}
}
class Son{
int num = 20;
public void speak(){
system.out.println("Son 说");
}
}

打印结果
这里写图片描述
多态时父类指向子类的对象在内存中的表现

这里写图片描述

那 现在在main函数中加上

    Son s = new Son();
    s.speak();
    System.out.println(s.num);

打印结果是son说 20; 这个在内存中的表现
这里写图片描述

多态的好处
1.怎抢了代码的可维护性(建立在继承上)
2.增强方法的可扩展性(核心)

多态的弊端:
不能直接调用子类的特殊(不是重写父类的)方法
如果调用子类的特殊方法,需要将父类强转位子类的对象,然后对象点方法 调用子类的特殊方法

public static void main(string[] args){
Person p = new Cheat();
p.speak();

Cheat ct = (Cheat)p;// 强制转换成子类
}
class Person{
pubic void speak(){
system.out.println("聊天");
}
}
class Cheat extends Person{
public void speak(){
system.out.println("洗脑");
}
public void puch(){
system.out.println("打人")
}
}

在多态时 子类非常多的情况下 父类调用子类的方法时 可以封装一个方法 参数是父类的对象 在传参的时候匿名创建new Dao 相当于 WuQi w = new Dao();——父类指向子类的对象 进行调用 我们想调用子类的特殊方法 这里需要用一个 instanceof 关键字 这个关键字 是判断 前面的对象是否属于 后面的 实例

public static void main(string[] args){
fun(new Jian());
fun(new Dao());
}
public static void fun(WuQi w){
w.puch();

if(w instanceof Dao){
Dao dao = (Dao)w;
dao.liangdao();
}else if(w instanceof Jian){
Jian jian = (Jian)w
jian.liangjian();
}
}
class WuQi{
public void puch(){
system.out.println("打人");
}
}
class Jian extends WuQi{
pubilc void puch(){
system.out.println("砍人");
}
public void liangjian(){
system.out.println("独孤九剑");
}
}
class Dao extends WuQi{
public void puch(){
system.out.println("刺人");
}
public void liangdao(){
system.out.println("独霸天下");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值