1.什么是多态,什么是向上转型
java的多态:允许将子类变量赋值给父类对象(参考百度百科)
向上转型:父类对象引用了子类变量(和多态一个意思的)
2.不知道我在说什么?请看以下代码
father f=new son(); (father指的是父类 son指的是子类)
3.作用是啥?
父类可以调用子类中覆盖父类的方法.
4.听不懂我在说什么?
看代码!
一.
package try1;
父类
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void caharacter() {
System.out.println("勤劳刻苦");
}
}
子类
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override//这个是一个mark annotation类型,用作标注方法.说明了被他标注的方法是已经重载了父类中的方法,(重载仅限于方法当中,属性不存在重载),并起到断言作用.当我们视图覆盖父类方法时却又写错了方法名,此时由于@override的存在,方法名会报错.
public void money() {
System.out.println("儿子身家100元");
}
public void bycar() {
System.out.println("儿子有汽车");
}
}
测试类
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//我给出两组(以money为例:因为money是被子类覆盖掉的):
//第一组没有采用向上转型
father f=new father();
f.money();
//第二组采用了向上转型
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果图
第一组没有采用多态:连子类的构造函数都没有输出来
第二组:采用了多态:首先父类的构造和子类的构造都输出来了,而且父类方法变成了被子类覆盖掉的方法.
二.接下来:我只是初始化son类和父类,也没有使用多态看效果!
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//接下来:我只是初始化son类和父类,也没有使用多态看效果!
//第一组没有采用向上转型
System.out.println("第一组结果:");
son s=new son();
s.money();
System.out.println("----------分割线------------");
//第二组采用了向上转型
System.out.println("第二组结果:");
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果是和使用了多态一样的效果.但是单纯使用子类实例化比使用多态的功能更多:比如子类本身拥有的单独方法和属性
三,另外还有人这么使用多态
将拥有返回值的静态方法中放入父类对象,在输出的时候放入子类对象,结果也是一个多态表现
看一下代码: 我为上述例子爸爸类添加了身高,妻子;但设定儿子有身高方法,没有妻子(即没有妻子方法)------>子类中覆盖了父类方法和没有覆盖父类方法的区别
package try1
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void character() {
System.out.println("勤劳刻苦");
}
public void hight() {
System.out.println("老爸身高1.75m");
}
public void wife() {
System.out.println("老爸有个漂亮的老妈");
}
}
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override
public void money() {
System.out.println("儿子身家100元");
}
@Override
public void character() {
System.out.println("勤劳刻苦+聪明能干");
}
@Override
public void hight() {
System.out.println("儿子身高1.8m");
}
public void nowife() {
System.out.println("还是条单身狗");
}
}
运行类
public class one{
public static void money(father f1) {//此处用静态方法引入父类对象
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);//此处用子类变量替代父类对象,以达到多态效果
}
}
结果图:
结果确实达到了多态方法效果,如果你还没有看明白,我再给你一次对比效果:使用一次显示多态和这个静态方法引用多态做一个对比
测试类
public class one{
public static void money(father f1) {
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);
System.out.println("--------分割线---------");
//使用一次显示的多态
father f1=new son();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
}
结果图
你看:参数中引用父类对象,实际应用中放入子类变量却也是一种多态.
四.总结:总之记住一句话:父类变量引用子类对象就是一种多态. (引用百度百科的原话:简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针)
今天的多态学习到此!
本文深入浅出地介绍了Java中的多态概念,通过具体代码示例解释了向上转型、方法覆盖等核心知识点,并展示了多态在不同场景下的应用。
1万+

被折叠的 条评论
为什么被折叠?



