4.方法操作实例变量 对象的行为

4.1 操作对象状态的方法

同一类型的每个对象能够有不同的方法行为,任一类的每个实例都带有相同的方法,但是方法可以根据实例变量的值来表现不同的行为。

play()会播放title值表示的歌曲,调用某个实例的play()可能会播放“Politik”而另一个会播放“Darkstar”,然而方法却是相同的

void play() {

        soundPlayer,playSound(title);

}

Song t2 = new Song();

t2.setArtist("Travis");

t2.SetTitle("Sing");

Song s3 = new Song();

s3.setArtist("Sex Pistols");

s3.setTitle("My Way");

小型犬的叫声与大型犬不同

Dog类中的bark()方法会用size实例变量来决定使用哪一种声音

class Dog {int size;String name;void bark() {if (size > 60) {System.out.println("Woof! Woof!");} else if (size > 14) {System.out.println("Ruff! Ruff!");} else {System.out.println("Yip! Yip!");}}
}
class DogTestDrive {public static void main(String[] args) {Dog one = new Dog();one.size = 70;Dog two = new Dog();two.size = 8;Dog three = new Dog();three.size = 35;one.bark();two.bark();three.bark();}
}

4.2 方法参数与返回类型

可以传值给方法

方法会运用形参(parameter)。调用的一方会传入实参(argument)。
实参是传给方法的值。当它传入方法后就成了形参。参数跟局部(local)变量是一样的。它有类型与名称,可以在方法内运用。
重点是:如果某个方法需要参数,你就一定得传东西给它。那个东西得是适当类型的值。

1.调用Dog上的bark()方法,并传入“3”这个值(作为此方法的参数)

2.以int类型表示的值3会传递给bark()

3.此值会传给numOfBarks这个参数(int类型的变量)

4.把numOfBarks当作一般的变量使用

可以从方法中取返回值

方法可以有返回值。每个方法都声明返回的类型,但目前我们都是把方法设成返回void类型,这代表并没有返回任何东西。
void go() {

}
但我们可以声明一个方法,回传给调用方指定的类型值

int giveSecret() {

        return 42;

}
如果你将一个方法声明有返回值,你就必须返回所
声明类型的值! (或是与声明类型兼容的值)

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

方法可以有多个参数。在声明的时候要用逗号分开,传入的时候也是用逗号分开。最重要的是,如果方法有参数,一定要以正确数量、类型和顺序来传递参数。

4.3 值传递

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

1.声明一个int类型的变量并赋值为7。代表7的字节组合会被放进称为x的变量

2.声明一个有int参数的方法,参数名称为z

3.以x为参数传入go()方法中。x的字节组合会被拷贝并装进z中

4.在方法中改变z的值。此时z的值不会改变,传给z的只是个拷贝

方法无法改变调用方所传入的参数

4.4 Getters与Setters

运用参数与返回类型

Getter与Setter。如果要很正式地讨论,你会称他们为Accessor与Mutator。不过这样只是更饶舌而已,由于Getter与Getter较为符合Java的命名习惯,所以我们接下来都会这么叫它们。
Getter与Setter可让你执行get与set。Getter的目的只有一个,就是返回实例变量的值。毫无意外的,Setter的目的就是要取用一个参数来设定实例变量的值。
 

public class ElectricGuitar {String brand;int numOfPickups;boolean rockStarUsesIt;String getBrand() {return brand;}void setBrand(String aBrand) {brand = aBrand;}int getNumOfPickups() {return numOfPickups;}void setNumOfPickups(int num) {numOfPickups = num;}boolean getRockStarUsesIt() {return rockStarUsesIt;}void setRockStarUsesIt(boolean yesOrNo) {rockStarUsesIt = yesOrNo;}
}

4.5 封装(Encapsulation)

不封装可能会很难堪

在此之前我们已经犯了一个在面向对象界最糟糕的错误
泄露资料!
我们并没有注意到数据会被全世界的人看到,甚至还可以被改动。
你可能经历过暴露出实例变量的不愉快感觉。
暴露的意思是可通过圆点运算符来存取,像是:
tehCat.height = 27;
你可以把这件事情看做是直接通过远程控制修改Cat的实例变量。若远程控制落入不当之人的手上,变量就可能会成为杀伤力强大的武器。因为你无法防止下面的操作:
theCat.height =0; //千万不能让这种事情发生
这一定会很糟糕.

我们需要创建Setter这个方法给所有的实例变量,并寻求某种方法强制其他程序都必须通过Setter来设定变量而不是直接的存取。

数据隐藏

要将程序的实现从不良数据改成可以保护数据且让你还能修改数据的方式是很简单的。所以要如何隐藏数据呢?答案是使用公有与私有这两个存取修饰符(access modifier)。

封装的基本原则:将你的实例变量标记为私有的,并提供公有的getter与setter来控制存取动作。或许在你有了更多的Java设计与编写经验之后会有些许不同的做法,但是目前这种做法可以维持住安全性。

将实例变量标记为private。
将getters与setters标记为public。

封装GoodDog

public class GoodDog {private int size;public int getSize() {return size;}public void setSize(int s) {size = s;}void bark() {if (size > 60) {System.out.println("Woof! Woof!");} else if (size > 14) {System.out.println("Ruff! Ruff!");} else {System.out.println("Yip! Yip!");}}
}
public class GoodDogTestDrive {public static void main(String[] args) {GoodDog one = new GoodDog();one.setSize(70);GoodDog two = new GoodDog();two.setSize(8);System.out.println("Dog one: " + one.getSize());System.out.println("Dog two: " + two.getSize());one.bark();two.bark();}
}

 任何有值可以被运用到的地方,都可用调用方法的方式来取得该类型的值

int x = 3 + 24;

int x = 3 + one.getSize();

数组中的对象就如同其他的对象一样,唯一的差别就
是如何取得而已。换言之,不同处在于你如何取得遥
控器。让我们先来尝试调用数组中的Dog对象。

4.6 数组中的引用

数组中对象的行为

数组中的对象就如同其他的对象一样,唯一的差别就
是如何取得而已。换言之,不同处在于你如何取得遥
控器。让我们先来尝试调用数组中的Dog对象。

1.声明一个装载7个Dog引用的Dog数组

Dog[] pets;

pets = new Dog[7];

2.创建两个Dog对象并赋值为数组的前两项元素

pets[0] = new Dog();

pets[1] = new Dog();

3.调用这两个Dog对象的方法

pets[0].setSize(30);

int x = pets[0].getSize();

pets[1].setSize(8);

声明与初始化实例变量

你已经知道变量的声明至少需要名称与类型:
int size;
String name;
并且你也知道可以同时初始化-(赋值)变量:
int size = 420;
String name ="Donny”;
但如果你没有初始实例变量时,调用getter会发生什么事?也就是说实例变量在初始之前的值是什么?

实例变量永远都会有默认值,若没有明确的赋值给实力并不了,或者没有调用setter,实例变量还是会有值

integers   0

floating points   0.0

booleans   false

reference   null

null代表没有操作对象的远程控制,是个引用而不是对象

实例变量与局部变量之间的差别

1.实例变量是声明在类内而不是方法中

class Horse {

        private double height = 15.2;

        private String bread;

        // more code...

}

2.局部变量是声明在方法中的

class AddThing {

        int a;

        int b = 12;

        public int add() {

                int total = a + b;

                return total;

        }

}

3.局部变量在使用前必须初始化

class Foo {

        public void go() {

                int x;

                int z = x + 3; //无法编译

        }

}

局部变量没有默认值,若在变量被初始化前就要使用的话,编译器会显示错误

变量的比较

有时你需要知道两个primitive主数据类型是否相等。很简单,只要使用==这个运算符就可以。有时你想要知道两个引用变量是否引用到堆上的同一个对象。这也很容易,也是使用==运算符。但有时你会需要知道两个对象是否真的相等。此时你就得使用equals()这个方法。相等的意义要视对象的类型而定。举例来说,如果两个不同的String带有相同的字符,它们在涵义上是相等的。但对Dog来说,你认为尺寸大小或名字一样的Dog是相等的吗?所以说是否被视为相等要看对象类型而定。我们会在后面的章节继续探讨对象相等性的部分,但现在我们要知道的是==只用来比对两个变量的字节组合,实质所表示的意义则不重要。字节组合要么就是相等,要么就是不相等。

使用==来比对primitive主数据类型

这个运算式可以用来比较任何类型的两个变量,它只是比较其中的字节组合

int a = 3;

byte b = 3;

if (a == b) {// true}

使用==来判别两个引用是否都指向同一对象

这只是在比较字节组合的模样。此规则适用于引用与primitive主数据类
型。因此==运算符对参照相同对象的引用变量会返回值。在此情况下我们还是无
法得知字节组合的样式,但可以确定的是所参照的相同的对象。

Foo a = new Foo();

Foo b = new Foo();

Foo c = a;

if (a == b) {// false}

if (a == c) {// true}

if (b == c) {// false}

使用==来比较两个primitive主数据类型,或者判断两个引用是否引用同一个对象。
使用equals()来判断两个对象是否在意义上相等。
(像是两个String对象是否带有相同的字节组合)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

JMeter压测如何分配业务比例?

在进行综合场景压测时,由于不同的请求,要求所占比例不同,那如何实现呢? 有人说将这些请求分别放到单独的线程组下,然后将线程组的线程数按照比例进行配置,这种方法不是很好,想想,不…

百元开放式耳机哪款好一点耐用、百元耳放推荐

在耳机品类中,佩戴无需入耳、可保持耳道舒适的开放式耳机正成为新的潮流,不仅不少消费者趋之若鹜,相对于传统入耳式耳机,开放式耳机具备开放双耳的特性,能敞开耳道,让耳朵随时呼吸,保持干燥透气…

pytorch算力与有效性分析

pytorch Windows中安装深度学习环境参考文档机器环境说明3080机器 Windows11qt_env 满足遥感CS软件分割、目标检测、变化检测的需要gtrs 主要是为了满足遥感监测管理平台(BS)系统使用的,无深度学习环境内容swin_env 与 qt_env 基本一致od 用于…

MySQL查询(基础到高级)

一、单表查询: 1.基本查询: 1.1 查询多个字段: 1.查询所有字段: select * from 表名;2.查询指定字段: select 字段1,字段2 from 表名; 1.2 去除重复记录 select distinct "字段" FROM "表名"; …

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序,允许你在沙箱环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(七)放大镜实战

个人实战文档 本次实战是对自己整个api阶段的总结。 参考效果如下地址: http://erabbit.itheima.net/#/product/3995139 本次实战主要分为以下几个模块。 顶部导航模块 需求: 顶部导航开始不显示等页面滑到主导航栏,这个新顶部导航栏滑…

【C++设计模式之策略模式】分析及示例

描述 策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择算法的行为。该模式将算法的定义封装成一组易于切换和替换的类,使得算法可以独立于其使用者进行变化。 原理 策略模式通过将具体的算法…

WIN10 NPM的安装

引言: 什么是node.js? javaScript是一门脚本语言,通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行,HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行

文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用:发送HTTP请求配置原件-HTTP请求默认值 作用:设置HTTP请求的默认参数配置原件-用户定义的变量 作用:定义…

84.柱状图中最大的矩形

class Solution { public:int largestRectangleArea(vector<int>& heights) {//法一&#xff1a;枚举宽&#xff0c;超时if(0){int nheights.size();int area0;for(int left0;left<n;left){int minHINT_MAX;for(int rightleft;right<n;right){minHmin(minH,hei…

ARM day5

三盏灯流水 .text .global _start _start: 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<4)STR R1,[R0] 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<5)STR R1,[R0] 2.LDR R0,0X50006000LDR R1,[R0]BIC R1,R1,#(0X3<<20)ORR R1,R1,#(0X1<<…

文件扫描模块

文章目录 前言文件扫描模块设计初级扫描方案一实现单线程扫描整合扫描步骤 设计初级扫描方案二周期性扫描 总结 前言 我们这个模块考虑的是数据库里面的内容从哪里获取。 获取完成后&#xff0c;这时候,我们就需要把目录里面文件/子文件都获取出来,并存入数据库。 文件扫描模…

强化学习------DQN算法

简介 DQN&#xff0c;即深度Q网络&#xff08;Deep Q-network&#xff09;&#xff0c;是指基于深度学习的Q-Learing算法。Q-Learing算法维护一个Q-table&#xff0c;使用表格存储每个状态s下采取动作a获得的奖励&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很…

怎么用蜂邮EDM和Outlook批量发送邮件带附件

蜂邮EDM和Outlook批量发送邮件带附件的流程&#xff1f;有哪些邮件批量发送邮件附件的方法&#xff1f; 在现代社会中&#xff0c;电子邮件是一种广泛应用的沟通工具&#xff0c;而批量发送邮件带附件则是许多商业和个人用户的常见需求。本文将介绍如何使用蜂邮EDM和Outlook这…

高通camx开源部分简介

camera整体框架 ISP Pipeline diagram Simple Model Camx and chi_cdk 整体框架 CtsVerifier, Camra Formats Topology of Camera Formats. Topology (USECASE: UsecaseVideo) Nodes List Links between nodes Pipeline PreviewVideo Buffer manager Create Destro…

攻防世界-fakebook

打开题目链接 尝试弱口令登录 失败 随便注册 点击admin后跳转到下面这个页面 显示的是注册用户信息&#xff0c;观察url发现no1&#xff0c;猜测存在注入 用单引号测试一下&#xff0c;报错&#xff0c;确实存在SQL注入 使用order by 判断字段数 ?no1 order by 5 5的时候…

2.2.3 vim操作合集

1 vim VIM 是 Linux 系统上一款文本编辑器,学习 VIM 最好的文档,应该是阅读学习 VIM 的帮助文档,可以使用本地的帮助文件(vim--->:help),或者使用在线帮助文档。同时针对vim的使用,相应的相书籍也很多,如下 2 vim操作模式 命令模式:默认模式,该模式下可以移动光标…

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的pr…

【云备份项目】【Linux】:环境搭建(g++、json库、bundle库、httplib库)

文章目录 1. g 升级到 7.3 版本2. 安装 jsoncpp 库3. 下载 bundle 数据压缩库4. 下载 httplib 库从 Win 传输文件到 Linux解压缩 1. g 升级到 7.3 版本 &#x1f517;链接跳转 2. 安装 jsoncpp 库 &#x1f517;链接跳转 3. 下载 bundle 数据压缩库 安装 git 工具 sudo yum…