Java开发——11.面向对象的特点(三):多态

简介: 面向对象的特点:封装、继承和多态。

面向对象的特点:封装、继承和多态


多态:同一行为,通过不同的事物,可以体现出来的不同的形态;同一个对象在不同的时刻表现出来的形态是不同的。

子类可以重写和实现父接口中的方法,最后调用实现的方法是子类重写后的方法。


多态的前提:

要有继承或实现关系

要有方法的重写

要由父类引用指向子类对象  


多态的格式:

  • 普通类多态的格式

父类 对象 = new 子类();

  • 抽象类多态的格式

抽象类 对象名 = new 抽象类子类();

  • 接口多态的格式

接口 对象名 = new 接口实现类();


多态中的成员访问特点:

1.成员变量

编译看左边(父类),运行看左边(父类)

2.成员方法

编译看左边(父类),运行看右边(子类)


代码演示:


publicclassAnimal {
publicintage=40;
publicvoideat() {
System.out.println("动物吃东西");
    }
}



publicclassCatextendsAnimal {
publicintage=20;
publicintweight=10;
//子类要重写父类中的方法@Overridepublicvoideat() {
System.out.println("猫吃鱼");
    }
publicvoidplayGame() {
System.out.println("猫捉迷藏");
    }
}



publicclassAnimalDemo {
publicstaticvoidmain(String[] args) {
//有父类引用指向子类对象Animala=newCat();
//成员变量//编译看左边(父类),运行看左边(父类)System.out.println(a.age);
// System.out.println(a.weight);//成员方法//编译看左边(父类),运行看右边(子类)a.eat();
// a.playGame();    }
}


多态的好处和弊端:

1.多态的好处:

提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

2.多态的弊端:

不能使用子类的特有成员

多态中的转型:

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法;所以,想要调用子类特有的方法,必须做向下转型


向上转型:

多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。


父类类型  变量名 = new 子类类型();如:Animal a = new Cat();


向下转型:

父类类型转换为子类类型,这个过程是强制的;“子类调用自身定义的方法,就是向下转型!”

一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。


//子类类型 变量名 = (子类类型) 父类变量名;
Cat c =(Cat) a;


abstractclassAnimal {  
abstractvoideat();  
}  
classCatextendsAnimal {  
publicvoideat() {  
System.out.println("吃鱼");  
    }  
publicvoidcatchMouse() {  
System.out.println("抓老鼠");      
    }  
}  
classDogextendsAnimal {  
publicvoideat() {  
System.out.println("吃骨头");     
    }  
publicvoidwatchHouse() {  
System.out.println("看家");  
    }  
}



publicclassTest {
publicstaticvoidmain(String[] args) {
// 向上转型     fu f = new zi()Animala=newCat();  
a.eat();                // 调用的是 Cat 的 eat// 向下转型    zi z = (zi)fu; Catc= (Cat)a;       
c.catchMouse();         // 调用的是 Cat 的 catchMouse         }
}  


转型异常:


publicclassTest {
publicstaticvoidmain(String[] args) {
// 向上转型  Animala=newCat();  
a.eat();        // 调用的是 Cat 的 eat// 向下转型 Catc= (Cat)a;
c.catchMouse();//调用自己的方法System.out.println("================");
// 向下转型  Dogd= (Dog)a;       //引用的父类,是多态cat类,并不是dogd.watchHouse();        // 调用的是 Dog 的 watchHouse 【运行报错】        }  
}


这段代码可以通过编译,但是运行时,却报出了ClassCastException类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。

为了避免ClassCastException的发生,Java提供了instanceof关键字,给引用变量做类型的校验,格式如下:

instanceof使用格式

变量名 instanceof 数据类型

   如果变量属于该数据类型,返回true。

   如果变量不属于该数据类型,返回false。


代码展示:


publicclassTest {
publicstaticvoidmain(String[] args) {
// 向上转型  Animala=newCat();  
a.eat();               // 调用的是 Cat 的 eat// 向下转型  if (ainstanceofCat){
Catc= (Cat)a;       
c.catchMouse();        // 调用的是 Cat 的 catchMouse                } elseif (ainstanceofDog){
Dogd= (Dog)a;       
d.watchHouse();       // 调用的是 Dog 的 watchHouse        }
    }  
}


相关文章
|
3天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
8天前
|
前端开发 Oracle Java
【前端学java】java开发的依赖安装与环境配置(1)
【8月更文挑战第8天】java开发的依赖安装与环境配置
26 1
【前端学java】java开发的依赖安装与环境配置(1)
|
6天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
6天前
|
Java
Java 新手入门:Java 封装、继承、多态详解
Java 新手入门:Java 封装、继承、多态详解
16 1
|
6天前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
11天前
|
Java 数据安全/隐私保护
09 Java面向对象三大特征(概述)
09 Java面向对象三大特征(概述)
31 4
|
11天前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
33 4
|
23天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
58 4
|
26天前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
28 2
|
5天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。