这篇文章主要介绍了Java面向对象之多态,文章以什么是多态、多态的实现条件、多态的访问特点、多态的优点和缺点的相关资料展开文章内容,需要的小伙伴可以参考一下
目录
一、前言
二、什么是多态?
三、多态的实现条件
四、多态的访问特点
1.我们建一个service包放Animal类
2.再servic包下建一个impl包,包下放Cat类
3.我们在建一个controller包,在里面建一个动物测试类
4.弄完之后我们程序一运行
五、多态的优点和缺点?
六、为什么要分开建包
一、前言 前面我们了解和学习了继承的使用,现在我们来学习三大面向对象之一的多态。
多态使java面向对象丰富起来,所以学好多态十分重要。
二、什么是多态? 这个问题其实是显然的,从字面上看,也是多种状态,其实没错,多态就是在
不同情况表现出来的不同状况,叫多态。
比方说我们可以说,是水果,也可以说,是 ((华强买)
是动物,也可以说,(有人可能会问这是什么)
这里西瓜和牛有两种不同状态,这个就是多态。
三、多态的实现条件 ①有(继承/实现)关系
②有方法重写
③有(父类/接口)引用指向(子类/实现)对象
解读 :①有(继承/实现)关系(说明这里有子类父类或者接口的实现)
② 有方法的重写(重写抽象方法,或者重写父类中的方法)
③有(父类/接口)引用指向(子类/实现)对象(说明有父类/接口 对象名= new 子类/实现 )
四、多态的访问特点
成员方法: 编译看左边,执行看右边
成员变量: 编译看左边,执行看左边
解读:①所谓编译看左边,就是在语法问题上,看new的左边(父类或者接口)
有没有此方法或者变量, 如果有则编译通过,反之则不通过
② 执行就是最终结果看,比如,在方法中执行时看右边就是看new的右边,
就是说 对象调用的时候,子类和父类都有此方法时,以子类中的方法为结果。
接口我们这篇未涉及到,所以这次我们用继承的方式类实现多态。
1.我们建一个service包放Animal类 package service;
public class Animal {
public String name="动物";
public void eat(){
System.out.println("动物吃东西");
}
public void sleep(){
System.out.println("动物要");
}
}
2.再servic包下建一个impl包,包下放Cat类 因为我们要继承Animal类,而Animal在与之不再 同一个包所以需要导包(导包就是
告诉程序我要用的这个在哪里)
package service.impl;
import service.Animal;//导包
public class Cat extends Animal {
public String name="猫";
@Override
public void eat() {//重写父类的方法
System.out.println("吃");
}
public void play(){
System.out.println("玩毛球");
}
}
3.我们在建一个controller包,在里面建一个动物测试类 import service.Animal;//导包
import service.impl.Cat;
public class AnimalController {
public static void main(String[] args) {
//多态创建对象
Animal a=new Cat();//父类引用指子类对象
a.eat();
a.sleep();
System.out.println("名字:"+a.name);
}
}
4.弄完之后我们程序一运行
如图:
看结果,可以知道,方法的编译看做左边,执行看右边,成员的编译看做左边,
执行看左边也就是,在方法中,以子类方法为主,在变量上,以父类的变量为主。
当父类有该方法,而子类没有该方法时,此时,结果时父类的方法。
4.1为什么两个有区别呢? 其实主要的原因时方法有重写,而成员变量则没重写(变量不能重写)
五、多态的优点和缺点? 多态的优点:是提高了扩展性,子类可以在父类的基础上进行扩展。
多态的缺点:就是不能访问子类的中的成员变量和成员方法。
解决方法: 后期涉及其实只要通过继承,实现时,子类所含有的方法是最多的,此时我们通过子类
创建对象,就可以访问所有成员(非子类的私有成员除外)
如图:
import service.Animal;
import service.impl.Cat;
public class AnimalController {
public static void main(String[] args) {
Cat c=new Cat();//通过子类创建对象
c.eat();
c.sleep();
c.play();
System.out.println("名字:"+c.name);
}
}
六、为什么要分开建包 有人不解,在同一个包下建就不用导包了,就没那么麻烦了,确实这话一点问题
都没有,但是我们要养成这种开建包的好习惯,以便于在代码很多的时候,便于
排查错误。因为写代码向来都是写时一时爽,找bug时满脸苦。为了防止这种情况
我们要养成分开建包的好习惯。
到此这篇关于Java面向对象之多态的文章就介绍到这了,更多相关Java面向对象 多态内容请搜索CodeAE代码之家 以前的文章或继续浏览下面的相关文章希望大家以后多多支持CodeAE代码之家!
原文链接:https://blog.csdn.net/weixin_60719453/article/details/120904183?spm=1001.2014.3001.5501