美文网首页
8 面向对象,类

8 面向对象,类

作者: ca8519be679b | 来源:发表于2020-02-05 10:52 被阅读0次

    面向对象思想

    是针对面向过程,面向过程是对功能具体描述,面向过程其实是对相似对象的抽象化,简单来说就是偷懒

    我们常常使用现成的类,直接调用方法实现功能,这个类可能是已有的库,也可能是自己编写的

    如我们想打印数组元素,要写出如下代码

    1

    而我们使用现成库就很简单

    2

    面向对象的特点:封装,继承,多态1


    定义,肯定是现有图纸,才有手机,所以我们就定义类来作为实例的描述,类有属性和行为

    这里java叫做成员变量和成员方法

    通常我们想创建实例需要几步,导包(import 包名.类名),创建实例,调用方法属性,如果类就在本文件夹内定义不用导包

    3

    如上我们定义了Student类,我们在同文件夹使用Demo来引用,因为同文件夹,所以并不用导入,可以直接实例化,我们使用其方法,如下

    4

    对象引用内存图如下

    5

    其中我们定义了2个类,于是方法区塞进2个class,Phone和Demo01PhoneOne,这里谁有main谁进栈,进入到栈的最底端,于是Demo01PhoneOne的main在最底,然后按main逐行执行,开始创建了实例,就会参照方法区Phone在堆内开辟相同空间,其中成员变量开始未赋值为默认值,字符串null,浮点0.0,成员方法存的是方法区的地址接口。然后给one实例存的是堆空间地址,然后给one的几个属性赋值,就会一次访问堆对应空间,修改内容,最后调用方法,调用方法,先找到堆内方法地址,然后找到方法区方法,将其压栈,方法运行完从栈内清空,最后main运行完,也从栈的空间清空

    6

    上图又进行了2个实例的内存分析,创建了实例two,此时会另外在堆内开辟空间,他们的方法区指向都是一样的,其他就没什么可说的了,这里可以去记一个快捷键,我们赋值One的代码,然后ctrl+v到下面,然后选中one,用shift+F6可以把后面所有的One全选,然后一起修改

    7

    我们可以把实例当做参数传给函数,如上图,实际是传入了内存的堆地址,然后我们就可以安装对应的地址和类结构解析属性


    成员变量和局部变量的区别

    1位置:局部变量在方法内部,成员变量在方法外类内部

    2作用域:局部变量方法内使用,成员变量类内都能使用

    3默认值:局部变量如果没有赋值,不能使用,成员变量如果没有赋值会有个初始值

    4内存位置:局部变量运行位与栈内存,成员变量位于堆内存

    5生命周期:局部变量随进栈而诞生,随出栈而销毁,成员变量随实例创建而在堆空间创建,当引用消失后,被垃圾回收机制回收(java程序员通常无法控制)


    类三大特性之封装

    封装体现在方法的封装,还有关键字private,封装的本质就是将一些细节信息隐藏起来,我们只需要知道输入输出和实现的功能即可

    private关键字是私有化的意思,针对于public公有

    8

    比如,我们如上图引用Person类,然后在Demo03Person里尝试实例化对象,因为年龄可以随便修改,我们就有可能设置出来个负值,所以就有需求对我们不合理的设置进行限制

    9

    我们给age定义前加个private,这样age就变成了私有化,age在类内部还是随便访问的,但是在类外是无法使用的

    10

    如上,之前的设置年龄的语句就被IDE提示了红色,都是文件也被波浪号标识,鼠标移上去可以看见有提示是私有变量,但是这样我们设置正数也无法访问了,这样我们就得考虑创建类方法来使用私有变量

    11

    我们定义2个方法,注意这个方法是公有的,否则实例无法调用,一个是setAge,一个是getAge,其中setAge是需要传参的,而getAge不需要,只需要返回值,所以间接使用成员变量就是定义一对儿getter和setter方法

    12

    在initialJ中,对于getter,和setter有快速创建,如输入pv,就会提示创建setter,输入ps就会提示String的getter


    this关键字

    this可以指代实例对象,和python的self类似,这样赋值时就可以重名问题

    13

    构造方法

    public 类名(参数){构造体}   类名必须和使用类名完全一致,而且构造方法不要写返回类型,连void都不要写,这个方法的调用是new时调用

    14 15

    如上,我们定义构造方法,只打印,这里可以看到我们new实例对象会调用构造方法。如果没有写构造方法,编译器会默认执行无参数什么都不做的构造方法,一旦编写构造方法,那编译器就不默认创造构造方法

    16

    构造方法也是可以重载的,只要参数列表不同即可,这样我们可以使用默认值和指定值初始化实例,如上


    编写一个标准类的几步

    1所有成员变量都用private修饰

    2给每个成员变量定义一个getter和setter方法

    3编写一个无参数的构造方法

    4编写一个有参数的构造方法

    这样的标准类也叫做java bean

    17

    我们IDE initialJ有自动生成getter和setter的方法,我们可以点击code->generate或者alt+Insert

    18

    点击getter和setter,默认只选择一项,可以ctrl多项选择,按OK,就自动添加

    19

    自动添加玩的效果如下

    20

    同理,我们在刚才生成的位置还看见了constructor,这就是构造方法,

    21

    点击selectnone,就创造了无参的构造方法,点击变量(ctrl多项选择)即实现有参的构造方法,结果如下

    22

    一般类内顺序是成员变量,无参构造,有参构造,getter,setter,我们使用IDE会节省很多代码构造时间

    相关文章

      网友评论

          本文标题:8 面向对象,类

          本文链接:https://www.haomeiwen.com/subject/seolxhtx.html