深入理解Java封装、继承、多态

时间:2021-10-02 21:54:32

转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830957.html

 

一:封装

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,常见的实现方式就是:getter、setter。

    封装遵循了“开闭原则”,禁止外部直接访问和修改类的信息。

 

    1、类变量、成员变量和局部变量

    类变量(静态变量):用static修饰的变量称为静态变量,其内容被该类的所有对象共享,所有对象中这个类变量的值都指向相同的一处内存,随便一个对象修改了此处内存的值都会影响其他对象。

    成员变量:在类定义时声明的变量,随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

    局部变量:在函数中声明的变量,只定义在局部范围内,只在所属的区域有效。存在于栈内存中,作用的范围结束,栈帧释放,变量就消失。

 

    2、成员变量以及方法作用域(可见性)——default、private、protected、public

     我们在定义成员变量和方法时,前面都会加上作用域修饰符(如果不加,默认为default)。

     不同修饰符作用下,该成员变量或方法的作用域是不同的:

    深入理解Java封装、继承、多态 

 

    3、构造函数与默认构造函数

    构造函数是用来初始化对象的,一个类可以重载多个构造函数。

    需要注意的是:默认情况下,一个类会有一个默认的构造函数,这个构造函数没有内容也没有返回值,一般都略去不写。

    但是,如果一个类定义了一个有参数有方法体的构造函数,这时编译器就不会再给它默认加上一个无参且方法体为空的构造函数,可以理解为无参的构造函数被覆盖,此时需要手动定义一个无参构造函数。

    在函数的继承里,子类必须使用super来实现对父类的非默认构造函数的调用.在创建对象时,先调用父类默认构造函数,然后调用子类自身自己定义的构造函数。

 

二:继承

    继承是类与类的一种关系,子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用。

    继承与实现的区别

    1)概念不同

       继承:子类与父类的继承。如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类。

       实现:接口的实现。如果多个类都有一个行为,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让各个类分别实现这个接口,各自实现自己具体的处理方法。

    2)关键词不同

       继承:extends,实现:implements

    3)数量不同

       单继承,多实现。

    4)属性不同

       在接口中只能定义全局常量(static final),和空的方法体;而在继承中可以定义属性方法,变量,常量等...

    5)限制不同

       某个接口被类实现时,在类中一定要实现接口中的抽象方法;而继承则无需。

    

 

三:多态

    Java中的多态主要指引用多态和方法多态。

    引用多态是指:父类引用可以指向本类对象,也可指向子类对象。引用多态的强大主要体现在调用属性、方法时,可以根据引用具体指向的对象去调用,例如:子类中重写了父类方法。

    方法多态:子类中可以重写父类的方法,在调用方法时根据引用指向的子类对象决定调用哪个具体的方法。方法多态的强大主要体现在可以根据调用时参数的不同,而自主匹配调用的方法,例如:重载。

 

    方法重写与重载的区别:

    重写:一般发生在有继承关系的子类中,子类中定义了一个方法,其 方法名、返回值类型、参数列表 与父类中某个方法一样,此时就是子类中重写(覆盖)了父类的同名方法。

             父类引用调用方法时,根据引用指向的对象决定调用父类定义的方法还是子类定义的方法,这体现了多态。

    重载:发生在同一个类中,存在 多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。

             调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这也体现了多态。