父类变量与子类对象之谈

前言

class Outer{
public void show(){}
}
class Inner extends Outer{
public void show(){}
}

Outer out = new Inner();大家都懂 这肯定是合法的,因为 Inner 类 是 Outer的子类嘛。所以Outer 的引用变量可以指向 子类Inner对象的地址嘛。为什么要这样做呢?有什么意义?

引入

接下来再看一段代码

class Outer1{
void method(){}
}
class Demo{
public static void main(String[] args){
new Outer1(){
public void method1(){}
}.method();//编译通过;子类对象自定义了一个自己的方法并运行。
Inter Outer1= new Outer1(){
public void method1(){}
}
inter.method();//编译失败,因为父类引用指向子类对象,只能调用子类中通过覆写的方法

}
}

向下转型

如果我们想要子继承父类,又要拓展自己的东西,还要使用父类引用那我们(后面我们会说为什么要使用父类引用)该怎么办?
上一段代码我们使用的是匿名内部类(为什么叫内部呢,是因为类的描述在类里)
如果是使用匿名内部类 将无法为对象向下转型。

class Outer{
}
class Inner extends Outer{
public void method1(){}
}
class Demo{
public void static main(String[] args){
Outer outer = new Inner();//其实这段和上面那段匿名内部类作用相同
Inner inner = (Inner)outer;//强转
inner.method();//这样讲编译通过。
}
}

封装性的问题

abstract class ball {
int r ;
int color’
public abstract void show();
}
class Outer{
private class Basketball extends ball{
public void show (){
System.out.println(“Basketball “);
}
}
//因为封装性,所以都 private
public Basketball newBasketball (){
return new Basketball ();
}
}
class DemoMain{
public static void main(String [] args){
Outer outer = new Outer();
//Basketball basket = outer.newBasketball();
//因为封装性。所以导致我们无法进行调用Basketball
ball basket = outer.newBasketball();

}
}

<think>嗯,用户问的是关于多态存在的三个必要条件的理解,我需要先回忆一下多态的基本概念。多态是面向对象编程中的一个重要特性,允许不同类的对象对同一消息做出响应,也就是同一个方法调用可以根据对象的不同而表现出不同的行为。 用户提到的三个条件是:要有继承、要有重写、父类变量引用子类对象。首先,我得确认这三个条件是否正确,以及如何具体解释它们。 第一个条件是要有继承。多态通常发生在继承关系中,子类继承父类,这样它们才能共享相同的方法签名。如果没有继承,子类无法覆盖父类的方法,自然无法实现多态。比如,动物类作为父类,猫和狗作为子类,继承了动物类的方法,比如“叫”。 第二个条件是要有重写。子类需要重写父类的方法,这样当父类引用指向子类对象时,调用该方法会执行子类重写后的版本。例如,猫类重写“叫”方法为“喵喵”,而狗类重写为“汪汪”。这样,通过父类变量调用时,实际执行的是子类的方法,这就是多态的体现。 第三个条件是父类变量引用子类对象。也就是说,在代码中,我们使用父类的类型来声明变量,但实际存储的是子类的实例。例如,Animal animal = new Cat(); 这里animal虽然是Animal类型,但实际指向的是Cat的实例。当调用animal.makeSound()时,会根据实际对象类型调用Cat的方法,而不是Animal的默认实现(如果有的话)。 接下来,我需要考虑用户可能的疑问点。比如,为什么必须要有继承?如果不用继承,用接口实现多态是否也算?不过用户的问题明确提到了继承,可能是在传统类继承的上下文中。另外,重写是否是必须的?如果子类没有重写父类方法,那么多态还能发生吗?这时候可能调用的是父类的方法,但严格来说,多态的效果可能不明显,所以重写是必要的条件之一。 用户可能还会混淆重载和重写,但这里的问题是关于多态的条件,所以需要明确是方法重写(Override),而不是重载(Overload)。此外,父类变量引用子类对象这一点,可能涉及到向上转型的概念,这也是实现多态的关键步骤。 可能还需要举例说明,比如使用动物类的例子,说明当父类引用指向不同子类对象时,调用相同方法会有不同行为。这有助于用户更直观地理解这三个条件如何共同作用实现多态。 最后,要确保回答清晰,分点解释每个条件,并举例说明,同时指出这三个条件缺一不可。如果有任何一个条件不满足,多态就无法实现。例如,没有继承就无法共享方法结构;没有重写则无法改变行为;没有父类变量引用子类对象,就无法通过统一接口调用不同实现。 总结起来,回答需要结构清晰,先总述多态的定义,再分点解释三个条件,每个条件结合例子说明,最后总结三者缺一不可。同时,在相关问题部分,可以引导用户思考更多应用场景或相关概念,如接口实现多态、动态绑定等,以帮助用户深化理解。 </think> 多态存在的三个必要条件可以这样理解: 1. **要有继承** 多态必须基于类的继承关系。子类继承父类后,才能共享父类的方法或属性,这是实现多态的结构基础。例如:`Animal` 是父类,`Cat` 和 `Dog` 是子类。 2. **要有重写** 子类必须重写(Override)父类的方法,提供不同的实现。例如:`Cat` 类重写 `makeSound()` 方法为“喵喵”,`Dog` 类重写为“汪汪”。 3. **父类变量引用子类对象** 通过父类类型的变量指向子类对象,实现“向上转型”。例如: ```java Animal animal = new Cat(); // 父类变量引用子类对象 animal.makeSound(); // 实际调用的是 Cat 的 makeSound() ``` **三者关系**: - 继承提供结构,重写提供不同行为,父类变量提供统一接口。 - 当调用父类变量指向的方法时,实际执行的是子类重写后的方法,从而实现“同一操作,不同效果”。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值