封装、继承与多态学习总结

本文详细介绍了面向对象编程中的封装、继承和多态。封装通过get/set方法保护对象属性,继承使得子类继承父类属性和方法,多态则体现在方法重写和重载上。文章探讨了重写、重载的条件和规则,以及jvm内存分配与访问规则。此外,还讲解了向上转型和向下转型的概念及其调用规则,最后总结了面向对象学习的重要性。

一.封装

在开发过程中,为了避免出现逻辑错误,通常会对所有的属性进行封装并为其提供get/set的方法进行设值和取值的操作。隐藏对象的属性和实现细节,仅对外公开访问方法并且控制访问级别。保护/防止代码被破坏,保护成员属性,不让类以外程序直接访问,通过private修饰的成员变量就是实现了相关的封装。

二.什么是继承

继承与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。

三.继承的特征

1.重写

重写即方法覆盖,如果子类父类中出现重名的成员方法,这个时候的访问是一种特殊情况,叫做方法重写,在子类中通过继承父类的方法或属性,并对其进行重写,用@Override表示;会出现覆盖效果,也称为重写或者覆写,声明不变,重新实现。

重写所必要的条件有:同父类包含继承关系;返回值类型,方法名和参数列表都相同。

2.重载

重载在一个类中存在,方法名相同,参数类型或者个数不同,返回值可以相同。

3.关键字

this:访问当前对象的引用。

super:访问父类中的方法和成员变量。

4.继承中的jvm

jvm大致可分为栈、堆、方法区三个部分。

栈:存放main栈/方法以及对象的引用地址。

堆:用于存放对象的实际地址,对象的引用就指向该地址。

方法区:类中的方法以及常量池。

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        System.out.println(son.name);
        System.out.println(son.age);
        System.out.println(son.hobby);
    }
}
class GrandPa{
    String name = "爷爷";
    String hobby = "麻将";
}
class Father extends GrandPa{
    String name = "爸爸";
    int age = 40;
}
class Son extends Father{
    String name = "儿子";
}

内存分布:

当new一个对象时,会在栈中开辟一个引用地址,而在堆中会开辟一个地址用于对象的指向;在子类的父类中,堆中会为每一个父类开辟一个地址,互相独立,互不影响。

访问规则:

1.当子类访问父类中的属性与方法时,率先从当前类中寻找是否有此属性,如当前子类中没有,则继续向上父类中寻找,直至找到该属性为止。

2.若子类调用父类中的私有属性时,在编译阶段就会报错,不会继续向上寻找,只能通过设置get/set方式进行访问。

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        System.out.println(son.name);
        System.out.println(son.getAge());
        System.out.println(son.hobby);
    }
}
class GrandPa{
    String name = "爷爷";
    String hobby = "麻将";
}
class Father extends GrandPa{
    String name = "爸爸";
    private int age = 40;

    public int getAge() {
        return age;
    }
}
class Son extends Father{
    String name = "儿子";
}

四.多态

1.核心

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

2.对象的多态

父类的引用指向子类的对象,在类中有子类和父类之分,子类就是父类的一种形态,对象多态性就从此而来。

方法的重载与重写也是多态的一种体现(相同方法名多个形态)。
重载:一个类中方法的多态性体现。
重写:子类中方法的多态性体现。

3.多态的具体表现

(1)一个对象的编译类型和运行类型可以不一致。

(2)编译类型在定义对象时就确定了,不能改变。

(3)运行类型是可以改变了。

(4)编译类型看定义时“=”的左边,运行类型看“=”的右边。

(5)instanceof关键字用于判断某个对象是否是指定的实例。

4.向上转型

定义:父类的引用指向子类的对象,即子类实例转变为父类实例。

语法:父类类型 引用名 = new 子类类型()。

调用规则:

(1)可以调用父类中的所有成员(需遵守访问规则,同继承)。

(2)不能调用子类的特有成员,在编译阶段能调用哪些成员是由编译类型决定的。

(3)最终运行效果看子类(运行类型)的具体实现,即调用方法时从子类中开始寻找。

5.向下转型

语法:子类类型 引用名 = (子类类型)父类引用

调用规则:

(1)只能强转父类的引用,不能强转父类的对象。

(2)要求父类的引用必须指向的是当前目标类型的对象。

(3)可以调用子类类型中的所有成员。

6.动态绑定机制

(1)当调用对象方法时,该方法会和对象的内存地址(运行类型)绑定。

(2)当调用对象属性时,没有动态绑定机制,哪里声明,那里使用。

总结

以上则是我所学习面向对象三大特征的基本总结,可能还有所欠缺,但学习面向对象最重要的是思想的转变,理解起来会比较抽象,但打好基础比任何东西都重要。当然面向对象还有很多的内容以及延伸,后期还会务实自己的学习方式,呈现出更好的作品,希望正在观看的你支持一下,一起学习成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值