第四章:方法操作实例变量-对象的行为

2023-11-09

该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!

第四章:方法操作实例变量-对象的行为

 
状态影响行为,行为影响状态;
对象有状态和行为两种属性,对应实例变量和方法;类的每个实例可以维持自己的实例变量;
面向对象的重点之一就是 行为会依据状态来决定
    换句话说,就是方法会使用到实例变量的值;
    比如,大狗叫声的大,小狗叫声小,声音数实例变量,叫是方法;

类所描述的是对象知道什么和执行什么

    编写类时,是在描述JVM应该如何制作该类型的对象;
    任一类的每个实例都带有相同方法,但是方法可以依据实例变量的值来表现不同的行为;
    比如歌曲song是一个类,具体的音乐就是实例,播放音乐时只会播放当前名字的音乐,虽然播放方法都是相同的;
    song.play(title);

方法的参数:你可以传值给方法

    比如你可以告诉狗叫几声:dog.bark(3);
    可能会用到形参(parameter)或实参(argument)来调用传给方法的参数;

关于形式参数和实际参数,可以这样区分

    方法会运用形参,调用一方会传入实参;
    实参是传给方法的值,传入后就成了形参;
    参数跟局部(local)变量是一样的;有类型和名称,可在方法内运用;
    

如果方法需要参数,就必须传给他适当类型的值

    void bark(int numOfBarks){numOfBarks = numOfBarks - 1}
    这里调用必须传以int类型表示的值,在方法中numOfBarks可作为一般的变量使用;

你可以从方法中取返回值

    方法可以有返回值,每个方法都声明返回值类型;
    void类型,代表并没有任何返回类型;
    也可以声明一个方法,回传给调用方法指定的返回值;int giveSecret(){return 0;}
    如果你将一个方法声明有返回值,你就必须返回所声明类型的值(或声明类型兼容的值);(后续多态章节会讨论更多细节)

你可以向一个方法中传递一个以上的参数

    方法可以有多个参数,声明时以逗号分开,传入时也是;
    且方法的参数一定要以正确数量、类型和顺序来传递参数;

Java是通过值传递的,也就是说通过copy传递

    int x = 7;
    void go(int z){}
    以x为参数传入go()这个方法中,x的字节组合会被拷贝并装进z中;
    在方法中改变z的值,并不影响x的值,它只是一个copy;即方法无法改变调用方法所传入的参数;
方法只能有一个返回值,多个返回值时可以把返回类型说明为int的数组,将值装进数组中返回;如果是混合类型的多值返回,后续的ArrayList时会再讨论;
知识小问答:
如果传入的参数是对象而不是primitive主数据类型会怎样?
    在java中传递的所用东西都是值,但此值是变量所携带的值;引用对象的变量所携带的是远程控制而不是对象本身;
    若你对方法传入参数,实际上传入的是远程控制的拷贝;
一定要返回所声明的类型吗?
    可以返回会被隐含转换成声明类型的其他类型值;但若声明的类型容器小于想要返回的类型时,必须做明确转换;
    返回值也可以被忽略,Java并未要求一定要处理返回值;这代表你要的是方法的行为而不是返回值;

要点

类定义对象的所知所为;
对象所知是实例变量;
对象所为者是方法;
方法可依据实例变量来展现不同的行为;
方法可使用参数,单参或多参;
传入方法的参数必须符合声明时的数量、顺序和类型;
传入与传出方法的值类型可以隐含的方法或明确的缩小;
方法必须声明返回值;

运用参数与返回类型

Getter和Setter(正式的应该叫Accessor与Mutator):
    可以然你执行get和set;
    Getter返回实例变量的值;
    Setter取用一个参数来设定实例变量的值;
示例:
    String brand;
    String getBrand(){return brand;}
    void setBrand(String aBrand){brand = aBrand;}    
    

封装(Encapsulation)

不封装可能会很难看;
    比如通过圆点运算符来存取,就好比使用遥控器直接控制某对象的实例变量,但如果控制器落在坏人手里就糟了;
    所以我们要创建Setter方法给所有的实例变量,并寻找某种方法强制其他程序都必须通过Setter来设定变量而不是直接存取;
    这样,就可以在Setter方法中检查,确保实例变量被设定为合理的值;
    如:public void setHeight(int ht){if(ht > 0){height = ht;}}//设置身高大于0;
数据隐藏:
    从不良数据改成可以保护数据且让你还能修改数据的方式如下:
    ——使用共有与私有这两个存取修饰符(access modifier);

封装的基本原则

    将你的实例变量标记为私有的,并提供公有的getter与setter来控制存取动作;
    (当有了更多的Java设计与编写经验之后,会有许多不同做法);
        将实例变量标记为private;
        将getter与setter标记为public;
采访一个即将被封装的对象引用:
    封装会对我的实例变量加上绝对领域,因此没有人能够恶搞我的变量;(比如身高就不能是负数)
    强迫其他程序一定经过setter,如此就能检查参数并判断是否可以执行;
    setter也许可以退回不合理的值,或是抛出Exception、或者自己进行取小数点的动作;
    重点是setter中可以执行任何动作;
实例变量应该要标记为private,并通过getter与setter来存取,如此才能有机会确保实例变量值会落在合法的范围内;
示例(Code-GoodDogTestDrive.java GoodDog.java)
class GoodDogTestDrive{
    
    public static void main(String[] args){
        GoodDog one = new GoodDog();
        GoodDog two = new GoodDog();

        one.setSize(50);
        two.setSize(10);

        System.out.println(one.getSize());
        System.out.println(two.getSize());
        
        one.bark();
        two.bark();

    }
}
class GoodDog{
    
    private int size;

    public int getSize(){
        return size;
    }
    
    public void setSize(int aSize){
        size = aSize;
    }
    
    public void bark(){
        if(size > 60){
            System.out.println("big");
        }else if(size > 20){
            System.out.println("middle");
        }else{
            System.out.println("small");
        }
    }
}

log:
bogon:180131-第四章 huaqiang$ javac *.java
bogon:180131-第四章 huaqiang$ java GoodDogTestDrive
50
10
middle
small

数组中对象的行为:(已封装的对象

    数组中的对象就如同其他的对象一样,区别在于如何存取;
    pets[0].setSize(30);
    pets[0].getSize();
声明与初始化实例变量:
    变量的声明至少需要名称与类型;声明的同时也可以初始化(赋值)变量;
    但如果你没有初始实例变量时,调用getter会发生什么事?

实例变量永远都会有默认值

    integers——0
    floating points——0.0
    boolean——false
    reference——null
数字的primitive(包括char)的预设为0,boolean的预设为false,对象引用则为null;
注意null代表没有操作对象的远程控制,远程控制它是个引用而不是对象;
    

实例变量与局部变量

    实例变量是声明在类内而不是方法中;
    局部变量是声明在方法中的;
    局部变量在使用前必须初始化;(否则通不过编译)
对于方法的参数,局部变量的规则也同样适用:
    他们在方法中声明(方法的参数列表中);
    方法调用但没传参数,编译器会报错,所以方法的参数一定会被初始化,编译器会确保方法被调用时会有与声明所相符的参数;

变量的比较:(primitive主数据类型或引用)

    两个primitive主数据类型的变量比较,使用“==”;
    两个引用变量是否引用到堆上的同一对象,实用“==”;
    需要知道两个对象是否真正相等(意义上的相等),需要使用equals()方法;
这里==只用阿里比对两个变量的字节组合,实质所表示的意义则不重要;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第四章:方法操作实例变量-对象的行为 的相关文章

随机推荐

  • 解决Android 8.1 获取不到wifi名称

    在安卓8 1版本中 用 WifiInfo getSSID 可能出现 unknown ssid 或者什么也没读出来 解决方案 用ConnectivityManager 这个类解决 代码如下 获取SSID param return WIFI 的
  • 前端传JSON嵌套类,且属性名首字母大写时后端接收的一些坑

    因为开发腾讯云业务 要写一个回调函数 规范文档上说会传一个json传给我 EventType ComposeMediaComplete ComposeMediaCompleteEvent TaskId 1256768367 ComposeM
  • stm32局部变量过大,导致栈溢出

    在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变 刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域 重新赋了值 自己忘记了 后来查找了好久都没有其他地方使用这个结构体变量 于是开始单步
  • 配置文件及其解析

    配置文件 properties xml 配置文件可以解决我们在编程中遇到的硬编码问题 那么什么是硬编码呢 硬编码 将一些经常调用修改的数据代码直接写死在了java源代码程序中 就会产生硬编码问题 一般情况下 通过配置文件来解决硬编码问题 在
  • 在vue3中使用codemirror

    文章目录 前言 引入 在vue3中使用 基本配置 更改编辑框的外部样式 高度 宽度 获取和修改内容 添加删除事件 实现markdown过程中遇到的bug 前言 最近为了完成学校的大作业 需要制作markdown编辑器 为了用户输入方便 使用
  • MyBatis 配置 typeAliases 详解

    0x00 前言参考 之前的 MyBatis 中 SqlMapConfig 配置文件详解 记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景 这篇文章细说一下配置文件中 typeAliases 标签的详细使用 0x01 标签介
  • FOXBORO FBM233 电源模块

    FOXBORO FBM233 是一种电源模块 通常用于工业自动化和控制系统中 为其他设备和模块提供所需的电源供应 以下是可能与这种电源模块相关的一些常见功能 电压输出 FBM233 电源模块通常提供稳定的电压输出 以供其他设备和模块使用 这
  • 把握机器人教育朝AI智能化发展的趋势

    一般机器人是指不具有智能 只具有一般编程能力和操作功能的机器人 到目前为止 在世界范围内还没有一个统一的智能机器人定义 大多数专家认为智能机器人至少要具备以下三个要素 一是感觉要素 用来认识周围环境状态 二是运 动要素 对外界做出反应性动作
  • 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法

    问题 今天在PC端扫描登录百度网盘时 二维码无法加载出来 具体情况如图 解决方法 1 打开IE浏览器 2 打开工具 3 打开Internet选项 4 打开高级选项 重置IE设置 5 点击确定 打开百度网盘 重新扫描登录 写在后面 好了 现在
  • 基于机器学习之模型树短期负荷预测(Matlab代码实现)

    欢迎来到本博客 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就是给予我最大的支持 本文目录如下 目录 1 概述 2 数学模
  • 家庭记账本小程序之删(java web基础版四)

    实现删除消费账单 1 main left jsp中该部分 调用Servlet中delete方法 2 Servlet中delete方法 调用Dao层list方法 跳转到del jsp页面 3 Dao层list方法 4 del jsp 调用Se
  • Unity动画状态机Animator使用解析

    Unity可以用两种方式控制动画 1 Animations 这种方式简单 直接 Play Idle 或者 CorssFade Idle 就可以播放动画 2 Animator 5 x之后推荐使用这种方式 因为里面可以加上混合动画 让动画切换更
  • mysql 添加用户、修改权限,修改登陆权限ip

    MySQL 赋予用户权限命令的简单格式可归纳为 数据库 grant 权限 on 数据库对象 to 用户 1 grant 普通数据用户 查询 插入 更新 删除 数据库中全部表数据的权利 apache grant select on testd
  • SpringBoot(审计) 统计接口调用次数及成功率

    介绍 很多时候会需要提供一些统计记录的 比如某个服务一个月的被调用量 接口的调用次数 成功调用次数等等 优点 使用AOP Hendler对业务逻辑代码无侵入 完全解耦 通过spring boot自带的健康检查接口 health 方便 安全
  • 吐血整理!内部包含3980大数据、机器学习、推荐系统实战课程,仅分享一次

    在最近几年 大数据 Dig Data 机器学习 Machine Learning 逐渐流行开来 容易让人误以为机器学习并不难 机器学习的流行原因很简单 在一个消费者 以及广告主 需要更多个性化 而计算机系统正被四面八方飞速增长的数据包围的年
  • B树及其变种

    B 树 B 树 B树
  • L6050U compile erro

    L6050U The code size of this image exceeds the maximum allowed for this version of the linker 原因 是 用的 是 EVb版本 需要 正版 才没有
  • (二一)SQL优化

    insert优化 批量插入 insert into tb name values col 1 col n 手动提交事务 start transaction insert into tb name values commit 主键顺序插入 主
  • 一个含有抄底提示的副图指标程序

    下面是一个示例的通达信软件副图指标 其中包含一个简单的抄底信号提示 include stdio h include stdlib h 定义副图指标的数据结构 typedef struct int data int length Indica
  • 第四章:方法操作实例变量-对象的行为

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第四章 方法操作实例变量 对象的行为 状态影响行为 行为影响状态 对象有状态和行为两种属性 对应实例变量和方法 类的每个实例可以维持自己的实例变量 面向对象的重点之一