首页 > 编程语言 >Java面向对象(四)

Java面向对象(四)

时间:2023-11-09 21:24:34浏览次数:44  
标签:Java 子类 void 多态 public 面向对象 父类 class

多态

什么是多态

多态:理解为一个事物的多种形态

比如在现实生活中每个人都会扮演着不同的身份,比如张三可以是学生身份,可以是一个孩子身份,可以是教师身份,可以是父亲的身份。

Java中多态的体现

子类对象多态性:父类的引用指向子类的对象(或者子类的对象赋给父类引用

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //通过多态的形式,将父类引用指向子类的对象
 4         Person person=new Student();
 5     }
 6 }
 7 
 8 class Person{
 9 
10 }
11 class Student extends Person{
12 
13 }

在多态场景下,调用方法时分为编译时和执行时两种。

  ①编译时,认为声明的对象是一个父类的对象(实际上生成的是子类对象),看父类中有什么属性成员和方法成员(即被重写的方法)。

  ②执行时,实际上执行的方法是子类重写父类的方法。

如果出现子类没有重写相对应的方法时,才会去执行父类的方法。

简称:编译看左边,运行看右边

举个例子:

父类:

1 class Person {
2     public void eat() {
3         System.out.println("父亲吃饭");
4     }
5     public void show(){
6         System.out.println("这是一个show方法");
7     }
8 }

子类:

1 class Student extends Person {
2     @Override
3     public void eat() {
4         System.out.println("儿子吃饭");
5     }
6 }

测试类:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //通过多态的形式,将父类引用指向子类的对象
 4         Person person=new Student();
 5         //子类重写了eat方法
 6         person.eat();
 7         //子类没有重写eat方法
 8         person.show();
 9     }
10 }

效果展示:

 执行时会先执行子类重写父类的方法,如果没有重写方法,才调用父类的方法。

多态的缺点

①在使用多态时,子类的特有方法是会被屏蔽掉的,因为编译的时候父类并没有子类的方法所以是没办法调用的。

②创建子类对象的特有属性和特有方法也会加载到内存中,从而导致内存的浪费。

举个例子:

父类:

1 class Person {
2     public void eat() {
3         System.out.println("父亲吃饭");
4     }
5     public void show(){
6         System.out.println("这是一个show方法");
7     }
8 }

子类:

1 class Student extends Person {
2     @Override
3     public void eat() {
4         System.out.println("儿子吃饭");
5     }
6     public void play(){
7         System.out.println("儿子打游戏");
8     }
9 }

测试类:

1 public class Test {
2     public static void main(String[] args) {
3         //通过多态的形式,将父类引用指向子类的对象
4         Person person=new Student();
5         //儿子中独特的play()方法
6         //person.play() 由于父类并没有这个play()方法,所以编译时无法调用play()方法
7     }
8 }

由于父类并没有这个方法,无法调用play()方法。

多态的优点

①提高代码的维护性,比如一个饲养员有一个饲养的方法,不可能每有一种动态就写一个饲养方法这样不合理,而多态的实现只需要写一个方法里面调用不同对象的方法,代码维护性提高。

②提高代码的扩展性,只需要改变每个对象的方法即可,不需要修改饲养员的饲养方法。

多态的前提

多态的两个前提条件是:

  ①存在继承关系:多态是基于继承关系建立的,即一个类可以派生出另一个类。在多态中,存在一个父类和多个子类,子类继承了父类的属性和方法。

  ②存在重写关系:多态要求子类能够重写父类的方法。子类在重写方法时可以根据自己的需求对方法进行不同的实现,从而实现实现多态的效果。

向上转型和向下转型

举个图例:

向上转型

多态就是向上转型:将子类的对象赋值给父类(程序是自动实现的,缺点是失去子类的特有的属性和方法)

语法:

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

向下转型

把父类的对象转为子类的对象(需要强制转换)

语法:

子类类型  对象名  =  (子类类型)  父类引用

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //向上转型
 4         Animal animal=new Cat();
 5         //向下转型,需要强制转换
 6         Cat cat = (Cat) animal;
 7         cat.eat();
 8     }
 9 }
10 
11 class Animal{
12 
13 }
14 class Cat extends Animal {
15     public void eat(){
16         System.out.println("小猫吃鱼");
17     }
18 }
19 class Dog extends Animal{
20     public void  eat(){
21         System.out.println("小狗吃骨头");
22     }
23 }

效果展示:

代码上是没有任何问题的,但是当两者之间没有继承关系时是没办法强转的,否则会ClassCastException类型转换异常。

 

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //向上转型
 4         Animal animal=new Cat();
 5         Animal animal1=new Dog();
 6         //向下转型,需要强制转换
 7         Dog dog=(Dog) animal;//发现现在编译是没出错哦
 8     }
 9 }
10 
11 class Animal{
12 
13 }
14 class Cat extends Animal {
15     public void eat(){
16         System.out.println("小猫吃鱼");
17     }
18 }
19 class Dog extends Animal{
20     public void  eat(){
21         System.out.println("小狗吃骨头");
22     }
23 }

发现编译时并没有任何问题,但是效果展示:

就是因为上面代码中,animal是猫的对象它能变成小狗对象吗?很明显,小猫怎么可能变成小狗对吧。

所以运行时会出现类型转换异常。

instanceof关键字

正因为上面向下转型可能会出现异常,所以这里用到instanceof关键字来判断左边的对象是否为右边的类。

语法:

a instanceof A :判断对象a是否为A类的实例
当对象a是类A的实例:返回true
当对象a不是类A的实例: 返回false

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //向上转型
 4         Animal animal=new Cat();
 5         Animal animal1=new Dog();
 6         //向下转型,需要强制转换
 7         if(animal instanceof  Dog){
 8             Dog dog=(Dog) animal;//发现现在编译是没出错哦
 9         }else{
10             System.out.println("animal不是Dog类的实例");
11         }
12     }
13 }
14 
15 class Animal{
16 
17 }
18 class Cat extends Animal {
19     public void eat(){
20         System.out.println("小猫吃鱼");
21     }
22 }
23 class Dog extends Animal{
24     public void  eat(){
25         System.out.println("小狗吃骨头");
26     }
27 }

效果展示:

判断出来animal并不是Dog类的实例所以不会执行

这句代码:Dog dog=(Dog) animal直接输出"animal不是Dog类的实例"

标签:Java,子类,void,多态,public,面向对象,父类,class
From: https://www.cnblogs.com/gzyhrc/p/17818257.html

相关文章

  • Java 基础篇day08
    抽象抽象方法用abstract抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类类中该有的成员(成员变量,方法,构造器),抽象类都可以有抽象类最主要的特点式抽象类不能创建对象,仅作为一种特殊的父亲,让子类继承并且实现Aa=newA()//抽象类不能创建对象一个类继承抽象类,必须重写......
  • Java 解压缩.zip文件
    代码:publicclasstest{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(test.class);//压缩文件解压缩publicstaticvoidmain(String[]args){StringzipPath="";StringtargetPath="";by......
  • 十、Java多线程
    一、多线程概述1、进程:正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。2、线程:是进程中的单个顺序控制流,是一条执行路径一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行路径,则称为多线程程序。3......
  • Java中的IO流(一)
    Java中的IO流(一)一、前言学习这部分内容的时候,跟着敲代码难免有些乱,这里先放一张图:二、实现对文件和文件夹的操作:案例一:packagefile.bytestream;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.IOException;publicclassFileDemo1{......
  • Java中的多态
    向上转型后的再向下转回去才行注意:向下转型时,有可能编译阶段不报错,但是程序运行时会报错,类型转换异常。......
  • Java中的抽象类
    注意:抽象类中也是有默认的无参构造函数的eg:抽象类中的构造方法父类publicabstractclass_168AbstractParent{privateintage=300;privatefinalintcode_200=200;public_168AbstractParent(){System.out.println("我是Parent的无参构造方法......
  • 每天5道Java面试题(第6天)
    1. 接口和抽象类有什么区别?默认方法实现:抽象类可以有默认的方法实现;接口不能有默认的方法实现。实现:抽象类的子类使用构造函数:抽象类可以有构造函数,接口不能有。main方法:抽象类可以有main方法,并且我们能运行它;接口不能有main方法。实现数量:类可以实现很多个接口;但是只能继承......
  • Java登陆第二天——SQL之DML
    SQL语句SQL概括起来可以分为以下四组。(都是SQL,因为功能的不同,为了更好学习划分了类别)DDL——数据定义语言。用于定义数据的结构。指的是增,删,改数据库DML——数据操作语言。用于检索或修改数据。指的是增,删,改数据DQL——数据查询语言。用于查询各种形式的数据。指的是查询......
  • 商城系统 “牵手” 淘宝 API 接口 php java sdk
    随着互联网的快速发展,网络购物已成为人们日常生活中不可或缺的一部分。淘宝作为中国最大的电商平台之一,其商城系统中详情页面的重要性日益凸显。本文将阐述淘宝详情在商城系统中的重要性,从用户角度、商家角度和商城运营角度进行分析,并探讨如何优化详情页面,提升用户转化率和购物体验......
  • 【Java Web】从配置修改静态变量
    对象@ConfigurationProperties(prefix="system-upload-prefix")@Configuration@RefreshScope@DatapublicclassSystemUploadPrefix{privateStringupload;}修改常量@ComponentpublicclassConstants{@AutowiredSystemUploadPrefixsystemU......