java面向对象三大特征之继承和多态(代码片段)

猿力满满 猿力满满     2022-12-25     303

关键词:

目录

前言

一、继承

1.基本概述

2.继承中的成员访问特点

3.方法重写

4.Java 中继承的注意事项

继承代码案例

二、多态

1.多态概述

2.多态中成员访问特点

3.多态的好处和弊端

4.多态中的转型

多态代码案例

总结


前言

    上一篇博客我们介绍了Java面向对象思想以及三大特征之一的封装。本文将介绍面向对象三大特征的剩下两个特征——继承和多态,我个人认为继承和多态是三个特征中比较重要且理解起来稍有难度的两个特征,我将尽可能的用浅显易懂的方式为大家介绍清楚这两个特征。


一、继承

1.基本概述

    1)概念及格式

    概念:继承是面向对象三大特征之一。可以使得子类具有父类属性方法,还可以在子类中重新定义,追加属性和方法。(就像父亲和儿子,儿子继承父亲的一些特征,也拥有自己的一些独有的特征。)

    格式:public class 子类 extends 父类
    范例:public class Zi extends Fu
    父类也被称为基类、超类。子类也被称为派生类。

    子类的特点:子类可以有父类的内容,子类还可以有自己特有的内容。

    代码演示:

package com.itheima_01;

/**
 * 父类
 */
public class Fu 
    public void show() 
        System.out.println("show方法被调用");
    

package com.itheima_01;

/**
 * 子类
 */
public class Zi extends Fu 
    public void method() 
        System.out.println("method方法被调用");
    

package com.itheima_01;
/*
    测试类
 */
public class Demo 
    public static void main(String[] args) 
        //创建对象,调用方法
        Fu f = new Fu();
        f.show();

        Zi z = new Zi();
        z.method();
        z.show();
    

    2)继承的好处和弊端

    好处:

  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

    弊端:继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。

    3)继承的应用场景

    使用继承,需要考虑类与类之间是否存在 is..a 的关系,不能盲目使用继承。
    is..a 的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类。

2.继承中的成员访问特点

    1)继承中变量的访问特点

    在子类方法中访问一个变量,采用的是就近原则

  1. 子类局部范围找
  2. 子类成员范围找
  3. 父类成员范围找
  4. 如果都没有就报错(不考虑父亲的父亲…)

    2)继承中构造方法的访问特点

    子类中所有的构造方法默认都会访问父类中无参的构造方法。
    原因:

  1. 子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
  2. 每一个子类构造方法的第一条语句默认都是:super()

    如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

  • 通过使用 super 关键字去显示的调用父类的带参构造方法
  • 在父类中自己提供一个无参构造方法

    推荐:自己给出无参构造方法

    3)继承中成员方法的访问特点

    通过子类对象访问一个方法

  1. 子类成员范围找
  2. 父类成员范围找
  3. 如果都没有就报错(不考虑父亲的父亲…)

    4)super关键字

    this:代表本类对象的引用

    super:代表父类存储空间的标识(可以理解为父类对象引用)

    this 和 super 的使用区别:

    super内存图:

3.方法重写

    1)方法重写概述

    概念:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)。

    应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

    Override 注解:@Override用来检测当前的方法,是否是重写的方法,起到【校验】的作用。

    代码案例:手机类与新手机类

    需求:定义手机类与新手机类,手机类定义call方法,方法输出【给xxx打电话】 (xxx通过参数获取),新手机继承手机类,重写call方法,在原有功能上加入【开启视频通话】,测试类中创建新手机类,并调用call方法。

package com.itheima_06;

/*
    手机类
 */
public class Phone 
    public void call(String name) 
        System.out.println("给" + name + "打电话");
    

package com.itheima_06;

/*
    新手机
 */
public class NewPhone extends Phone 

    /*
    public void call(String name) 
        System.out.println("开启视频功能");
//        System.out.println("给" + name + "打电话");
        super.call(name);
    
    */

    @Override
    public void call(String name) 
        System.out.println("开启视频功能");
//        System.out.println("给" + name + "打电话");
        super.call(name);
    

package com.itheima_06;
/*
    测试类
 */
public class PhoneDemo 
    public static void main(String[] args) 
        //创建对象,调用方法
        Phone p = new Phone();
        p.call("林青霞");
        System.out.println("--------");

        NewPhone np = new NewPhone();
        np.call("林青霞");
    

    2)方法重写注意事项

  1. 私有方法不能被重写(父类私有成员子类是不能继承的)
  2. 子类方法访问权限不能更低(public > 默认 > 私有)

4.Java 中继承的注意事项

  1.Java 中类只支持单继承,不支持多继承

    错误范例:class A extends B, C

  2.Java 中类支持多层继承

    正确范例:
        class A   
        class B extends A   
        class C extends B

继承代码案例

    需求:定义老师类和学生类,找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试。

    思路:

  1. 定义老师类(姓名,年龄,教书())
  2. 定义学生类(姓名,年龄,学习())
  3. 共性抽取父类,定义人类(姓名,年龄)
  4. 定义老师类,继承人类,并给出自己特有方法:教书()
  5. 定义学生类,继承人类,并给出自己特有方法:学习()
  6. 定义测试类,写代码测试

  代码(子类及测试只演示老师类,学生类同理):

package com.itheima_10;

public class Person 
    private String name;
    private int age;

    public Person() 
    

    public Person(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

package com.itheima_10;

public class Teacher extends Person 

    public Teacher() 

    public Teacher(String name,int age) 
//        this.name = name;
//        this.age = age;
        super(name,age);
    

    public void teach() 
        System.out.println("用爱成就每一位学员");
    


package com.itheima_10;

/*
    测试类
 */
public class PersonDemo 
    public static void main(String[] args) 
        //创建老师类对象并进行测试
        Teacher t1 = new Teacher();
        t1.setName("林青霞");
        t1.setAge(30);
        System.out.println(t1.getName() + "," + t1.getAge());
        t1.teach();


        Teacher t2 = new Teacher("风清扬", 33);
        System.out.println(t2.getName() + "," + t2.getAge());
        t2.teach();
    

二、多态

1.多态概述

  1)什么是多态?
         同一个对象,在不同时刻表现出来的不同形态。

  举例
   
猫 cat = new 猫();
    动物 animal = new 猫();

  2)多态的前提条件有哪些?

  • 要有继承/实现关系
  • 要有方法重写
  • 要有父类/接口引用指向子类/实现类对象

2.多态中成员访问特点

  1)多态中成员变量的访问特点是什么?
       编译看左边、运行看左边

       比如,动物 animal = new 猫(); “编译看左边”的意思是编译时看语句左边的动物类(父类)里有没有这个变量,“运行看左边”的意思是运行时也是获取动物类(父类)里的这个变量
  2)多态中成员方法的访问特点是什么?
       编译看左边、运行看右边

       比如,动物 animal = new 猫(); “编译看左边”的意思是编译时看语句左边的动物类(父类)里有没有这个方法,“运行看右边”的意思是运行时实际执行的是猫类(子类)里的重写的方法

下面是代码案例,大家可以去运行看下结果,这样可以更好的理解多态的成员访问特点。

package com.itheima_02;

public class Animal 

    public int age = 40;

    public void eat() 
        System.out.println("动物吃东西");
    

package com.itheima_02;

public class Cat extends Animal 

    public int age = 20;
    public int weight = 10;

    @Override
    public void eat() 
        System.out.println("猫吃鱼");
    

    public void playGame() 
        System.out.println("猫捉迷藏");
    

package com.itheima_02;

/*
    测试类
 */
public class AnimalDemo 
    public static void main(String[] args) 
        //有父类引用指向子类对象
        Animal a = new Cat();

        System.out.println(a.age);
//        System.out.println(a.weight);

        a.eat();
//        a.playGame();
    

3.多态的好处和弊端

    多态的好处:提高了程序的扩展性
       具体体现:定义方法时,如果将父类型作为参数,在使用方法时,可以传递任意子类对象。

    多态的弊端:不能使用子类特有的成员。

4.多态中的转型

  1)多态中的向上转型
         父类引用指向子类对象其实就是向上转型。例如:
         Animal a = new Dog();

  2)多态中的向下转型
         将父类型的引用转换成具体的子类对象。转换格式:
         子类 对象名 = (子类)父类引用;

  向下转型解决了多态的弊端。

  3)多态转型内存图解

  狗强制转换成猫会出现 ClassCastException(类型转换异常)。

多态代码案例

    需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试。

   

  代码(测试类中只测试了Cat类,Dog类小伙伴们可自行测试):

package com.itheima_06;

public class Animal 
    private String name;
    private int age;

    public Animal() 
    

    public Animal(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public void eat() 
        System.out.println("动物吃东西");
    

package com.itheima_06;

public class Cat extends Animal 

    public Cat() 
    

    public Cat(String name, int age) 
        super(name, age);
    

    @Override
    public void eat() 
        System.out.println("猫吃鱼");
    

package com.itheima_06;

public class Dog extends Animal 

    public Dog() 
    

    public Dog(String name, int age) 
        super(name, age);
    

    @Override
    public void eat() 
        System.out.println("狗吃骨头");
    

package com.itheima_06;

/*
    测试类
 */
public class AnimalDemo 
    public static void main(String[] args) 
        //创建猫类对象进行测试
        Animal a = new Cat();
        a.setName("加菲");
        a.setAge(5);
        System.out.println(a.getName() + "," + a.getAge());
        a.eat();

        a = new Cat("加菲", 5);
        System.out.println(a.getName() + "," + a.getAge());
        a.eat();
    


总结

    关于Java面向对象三大特征中的继承和多态本文就介绍到这里。文章都是博主辛辛苦苦牺牲个人时间写出来的,希望喜欢的朋友能点个赞支持一下,博主感激不尽!文章如有不足的地方请各位小伙伴们多多包涵,有任何问题都可以在评论区指正或私聊我哦!

java面对对象三大特征之继承多态(代码片段)

面对对象三大特征继承、多态继承1.继承的概念:2.继承的实现:3.继承的好处与弊端:4.super5.继承中的成员访问特点以及访问修饰符:JAVA中的访问修饰符6.方法重写以及继承的注意事项:多态1.多态的概念2.多态中成员访问特点3.多态的... 查看详情

java面向对象三大基本特征(代码片段)

...意事项:4.多态4.1多态思想4.2 多态中的转型如何理解面向对象?简单的说就是把事物和操作事物的方法汇集到一起,形成一个相互依赖的整体。下面我们来了解面向对象的基础知识1.类和对象1.1概念 查看详情

面向对象的三大特征之三——多态

...面的内容有过详细的记录,即重复调用的代码块—方法和面向对象的特性之二—继承。二、对象的多态性——引用类型转换。1.向上转型(自动转型)——子类对象自动转换为父类对象。1classFather2{3publicvoidspeak()4{5System.out.println( 查看详情

python入门-6面向对象编程:07面向对象三大特征(封装继承多态)-继承(代码片段)

一:面向对象三大特征介绍  Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。  封装(隐藏)    隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装... 查看详情

java中面向对象三大特性之——多态(代码片段)

多态的概述: 多态是继封装、继承之后,面向对象的第三大特性。生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的... 查看详情

测开之面向对象进阶篇・《多态》(代码片段)

面向对象三大特征面向对象编辑的三大特征:封装、继承、多态。封装:客观的失误封装成类(将数据和方法放在一个类中构成了封装)。继承:python中一个类可以继承于一个类,也可以继承多个类,... 查看详情

面向对象三大特征之继承,多态

//面向对象三大特性//继承//概念:子类可以继承父类的一切//方法重写:在子类里面对父类的方法进行重写//特点:单继承:一个子类只能有一个父类,一个父类可以派生出多个子类//override:重写//overload:重载,编程多态//parent::值... 查看详情

面向对象的三大特征:继承封装多态(代码片段)

面向对象:面向对象专注于由谁来解决这个过程,而调用者无需关注对象实现的细节编程特点:出现了一个个的类,从类中拿到对象,通过对象直接解决问题类:具有一系列相同属性(特征)和方法(行为)的个体的集合称为类   ... 查看详情

面向对象三大特征(代码片段)

面向对象三大特征:封装、继承、多态继承是多态的前提,如果没有继承,就没有多态。封装性在Java当中的体现:方法就是一种封装关键字private也是一种封装(一旦使用了private进行修饰,那么本类当中仍然可以随意访问。但是... 查看详情

java入门二十二面向对象三大特征之多态

面向对象的三大特征:继承、封装、多态,今天学的是多态,看完后有什么不懂的地方可以问小编,也可以评论里问,我们一起解决。多态(polymorphism)在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口。多... 查看详情

java面向对象的三大特征?

面向对象三大特性继承:一般类只能单继承,内部类实现多继承,接口可以多继承封装:访问权限控制public>protected>包>private内部类也是一种封装多态:编译时多态,体现在向上转型和向下转型,通过引用类型判断调用哪... 查看详情

c++面向对象三大特征封装继承和多态知识总结(代码片段)

面向对象三大特征:封装,继承,多态;一、封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现;作用是便于分工和分模块,防止不必要的扩展;二、继承:... 查看详情

java面向对象编程三大特征-多态

Java面向对象编程三大特征-多态本文关键字:Java、面向对象、三大特征、多态多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一。在理解多态之前需要先掌握继承、重写、父类引用指向子类对象的相关概念,... 查看详情

java基础——面向对象三大特征(继承封装多态)(代码片段)

面向对象三大特征(继承、封装、多态)1继承2封装3多态4方法重载1继承classParent 属性; 构造方法; 其它方法;classChildextendsParent 全部继承过来; 可以重写父类的属性与方法; 可以拥有自己独特的属性和方法;继承语法——exten... 查看详情

java面向对象之继承(代码片段)

继承(Java面向对象三大特征之一)目录继承(Java面向对象三大特征之一)1.1、使用继承1.1.1编写父类A1.1.2编写子类B,继承父类A注意1.2继承的特性1.3子类继承父类的什么?不能被继承的父类成员:1.4super和this关键字1.5继承条件下... 查看详情

golang如何体现面向对象三大特征之多态?(代码片段)

...多态数组基本介绍变量(实例)具有多种形态。面向对象的三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。快速入门在前面的Usb接口... 查看详情

golang如何体现面向对象三大特征之封装?(代码片段)

...的好处golang如何体现封装封装的实现基本介绍Golang仍然有面向对象编程的继承、封装和多态的特性,只是实现的方法和其它OOP语言不一样,下面我们来看看Golang是如何实现封装的。封装介绍封装(encapsulation)就是... 查看详情

面向对象的三大特征,封装继承多态的个人理解以及代码分析(代码片段)

面向过程:我们以前使用的是面向过程编程,你需要清除每个实现步骤,每个步骤每行代码都要仔仔细细的编写,     不知道过程就找不到结果,找到实现过程就可以得到实现结果。     例如:我们在外打工租房子... 查看详情