Java面向对象之继承与多态详解(超详细)

本文详细介绍了Java中的继承机制,包括概念、语法、继承的要求、内容、内存影响以及多态性。通过实例演示了如何创建父类和子类,展示了继承中成员变量和方法的访问规则,以及多态在实际应用中的优势和局限性。
摘要由CSDN通过智能技术生成

Java是一门面向对象的高级语言,在学习Java的过程中要深入理解和体会其面向对象的思想本质,而今天要讲的就是面向对象三大特征中的继承与多态。

继承

一、概述

继承可以把子类中重复的代码抽取到父类中,减少代码冗余。继承后子类可以得到父类的属性和行为,也可在其基础上新增其他功能而变得更强大

格式:public class 子类 extends 父类 {}

 形象化理解:例如我们要创建一个猫类和一个狗类,这两个类中都有年龄、颜色等成员变量,也有吃饭,玩耍等方法,那么我们就可以把这些重复的代码抽取到同一个父类中,也就是创建一个父类动物类,其中包含年龄、颜色等成员变量和吃饭,玩耍等方法,然后让猫类和狗类继承动物类这个父类即可。

父类动物类的创建

public class Animal {
    private int age;
    private String color;

    public Animal() {
    }

    public Animal(int age, String color) {
        this.age = age;
        this.color = color;
    }
    
    public int getAge() {
        return this.age;
    }

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

    public  String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    public void eat(String something){
        System.out.println("动物在吃"+something);
    }
    public void play(String something){System.out.println("动物在玩"+something);}
}

猫类和狗类作为子类继承动物类这个父类

public class Dog extends Animal{
    public Dog() {
    }

    public Dog(int age, String color) {
        super(age, color);
    }

    @Override
    public void eat(String something) {
        System.out.println("狗在吃狗粮");
    }
    @Override
    public void play(String something){
        System.out.println("狗在玩飞盘");
    }
}
public class Cat extends Animal{
    public Cat() {
    }

    public Cat(int age, String color) {
        super(age, color);
    }

    @Override
    public void eat(String something) {
        System.out.println("猫在吃猫粮");
    }

    @Override
    public void play(String something) {
        System.out.println("猫在玩毛线球");
    }
}

 初次看到这一堆代码难免有些心慌,但是不要紧,下面我们边讲边演示

二、继承的要求

1、Java只能单继承(一个子类继承一个父类),不能多继承但可以多层继承(可以继承父类后再被其他子类继承)

2、Java中所有类都直接或间接继承Object类

3、子类只能访问父类中非私有的成员(私有成员可以通过父类中的getter和setter间接访问)

例子中私有化成员变量都提供相应的setter和getter方法

        public int getAge() {
            return this.age;
        }

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

        public  String getColor() {
            return color;
        }

        public void setColor(String color) {
            this.color = color;
        }

三、继承的内容

1、父类的构造方法都不能被继承,所以子类要重写其自身的构造方法

例子中猫类和狗类中都写了其对应的空参构造和有参构造 

public Dog() {
    }

    public Dog(int age, String color) {
        super(age, color);
    }
public Cat() {
    }

    public Cat(int age, String color) {
        super(age, color);
    }

2、父类虚方法表(非private,static,final)中的成员方法可以被子类继承

例子中的这些方法在虚方法表中,可以被子类继承

        public void eat(String something){
            System.out.println("动物在吃"+something);
        }
        public void play(String something){System.out.println("动物在玩"+something);}

四、内存的角度理解继承

1、方法区会加载父类的字节码文件

2、创建子类对象时堆中会有一部分空间存储父类成员变量(子类的成员变量与父类一致,但存储的内容可能各不相同)

五、继承的特点

1、成员变量的访问特点

就近原则:先在局部位置找,找不到再去本类成员位置找,还找不到再去父类成员位置找

this关键字:去本类成员位置找(找不到再逐级往上找)

super关键字:去父类成员位置找(找不到再逐级往上找)

2、成员方法的访问特点

方法的重写:子类继承父类虚方法表中的方法后可以重写方法,重写后的方法会覆盖掉继承过来的虚方法表中对应的方法,也就是子类对应的方法改变,父类对应的方法不变

重写建议:尽量和父类保持一致(名称,形参列表,访问权限,返回值等)

3、this,super关键字总结

1686df197fad42ae910b40ab9cfddff2.png多态

多态就是同类型的对象,表现出的不同形态

格式:父类类型 对象名称 = 子类对象;

要求:1、有继承关系

           2、有父类引用指向子类对象

           3、有方法重写

 我们可以在测试类中利用多态创建一个对象

public class test {
    Animal animal=new Cat(11,"white");
}

特点

1、变量调用:编译看左边,运行也看左边

编译看左边:javac编译代码时会看左边父类中有没有这个变量,如果有则编译成功,没有则失败

 运行看右边:java运行代码的时候实际获取的是左边父类中成员变量的值

如图所示,实际获取的是 animal中的变量信息

public class test {
    public static void main(String[] args) {
        Animal animal=new Animal(11,"white");
        Animal a=new Cat(14,"red");
        
        System.out.println(a.getAge());//11
        System.out.println(a.getColor());//white
    }
}

2、方法调用:编译看左边,运行看右边

 编译看左边:同上

运行看右边:java运行代码时实际上运行的是子类中的方法

如图所示,实际运行的是cat类中的方法

public class test {
    public static void main(String[] args) {
        Animal animal=new Animal(11,"white");
        Animal a=new Cat(14,"red");

        System.out.println(a.getAge());//11
        System.out.println(a.getColor());//white

        a.play("毛线球");//猫在玩毛线球
    }
}

优势与弊端分析

优势:1、在多态的形式下,右边对象可以实现解耦合,便于扩展和维护。

           2、定义方法时,父类对象作为参数可以接收所有子类对象,体现便利

弊端: 不能调用子类的特有功能(调用成员方法时,编译看左边,如果左边父类没有这个方法则会直接报错)

解决方法:变回子类类型

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值