🌈Java从入门到入坟✨学习笔记✨(五)小白必备之面向对象-多态性详解
Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈
欢迎各位小伙伴们关注我的公众号:JavaCodes,名称虽带Java但涉及范围可不止Java领域噢😁,期待您的关注❤
Java更新目录详情链接😁
🌈Java从入门到入坟⭐学习笔记⭐(一)String常用方法总结😊(小白必备知识点!!!)
🌈Java从入门到入坟⭐学习笔记⭐(二)final、static关键字总结😊(小白必备知识点!!!)
🌈Java从入门到入坟⭐学习笔记⭐(三)封装性及四种权限修饰符详解😊(小白必备知识点!)
多态概述
什么是多态性?
对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用)
多态的使用
有了对象的多态性以后,我们再编译期,只能调用父类声明的方法,但在运行期,我们实际执行的是子类重写父类的方法;
总结:编译看左边,运行看右边
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
多态的使用
多态定义格式:父类 变量名 = new 子类();
public class Main {
public void fun(Person person) {
person.study();
person.sleep();
}
public static void main(String[] args) {
Main main = new Main();
main.fun(new Student());
System.out.println("---------");
main.fun(new Teacher());
}
}
class Person{
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
}
class Student extends Person{
public void study(){
System.out.println("学生学习");
}
public void sleep(){
System.out.println("学生睡觉");
}
}
class Teacher extends Person{
public void study(){
System.out.println("老师学习");
}
public void sleep(){
System.out.println("老师睡觉");
}
}
多态不适用情况
我们在Person、Studen、Teacher中都定义id值
public class Main {
public void fun(Person person) {
person.study();
person.sleep();
}
public static void main(String[] args) {
Person student = new Student();
System.out.println(student.id);
Person teacher = new Teacher();
System.out.println(teacher.id);
}
}
class Person{
int id = 200;
}
class Student extends Person{
int id = 50;
}
class Teacher extends Person{
int id = 100;
}
==结论==:多态只适用于方法,不适用于属性(==编译和运行都看左边==)
instanceof关键字的使用
a instanceof A :判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
public static void main(String[] args) {
Person student = new Student();
Person teacher = new Teacher();
System.out.println(student instanceof Person);
System.out.println(teacher instanceof Person);
System.out.println(student instanceof Teacher);
}
使用强转
System.out.println((Teacher)student instanceof Teacher);
结论:为了避免在向下转型时出现==ClassCastException==异常,我们在向下转型之前,先进行==instance==的判断,一旦返回==true==,就进行向下转型。如果返回==false==,就不进行向下转型。
还有在==instanceof==多重继承的情况下也是成立的
例:a继承A,A又继承B,这为多重继承,所以==a instanceof A返回为true,a instanceof B返回也是true==
多态转型
==向上转型==
- 当子类对象赋值给一个父类引用时,即向上转型(多态本身就是向上转型的过程)
- 格式:父类类型 变量名 = new 子类类型();
==向下转型==
- 通过强制类型转换格式,将父类引用转为子类格式
- 格式:子类类型 变量名 = (子类类型)父类类型的变量;
public class Main {
public static void main(String[] args) {
Person person = new Student();
Student student = new Student(); //向上转型
Student student1 = (Student)person; //向下转型
student.sleep();
student1.sleep();
}
}
class Person{
public void sleep() {
System.out.println("睡觉");
}
}
class Student extends Person{
public void sleep() {
System.out.println("学生睡觉");
}
}
==向下转型注意事项(注意)==
-
向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)
-
向下转型只能转型为本类对象。
多态的优缺点
优点:
缺点:
- 无法使用子类特有的功能(如要使用就要使用向下转型强制类型转换)
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~~~
- 提高了代码的维护性(由继承保证)
- 提高代码复用性(由继承保证)
- 提高了代码的扩展性:新增加的子类不影响已存在类的多态性、继承性以及其他特性
- 安全性:向上转型将子类类型隐藏了起来
- 点赞
- 收藏
- 关注作者
评论(0)