【Head First Java 读书笔记】(四)对象的行为
状态影响行为,行为影响状态
对象有状态和行为
类所描述的是对象知道什么和执行什么。
同一类型的每个对象能够有不同的方法行为吗?
任一类的每个实例都带有相同的方法,但是方法可以根据实例变量的值来表现不同的行为。
比如Song类有title实例变量,不同的实例都可以调用play()方法,但会根据title播放不同的歌曲。
方法的参数,你可以传值给方法
方法会运用形参,调用的一方会传入实参。
实参是传给方法的值,当它传入方法后就成了形参。参数跟局部变量一样,它有类型与名称,可以在方法内运行。
从方法中取返回值
方法可以有返回值,每个方法都声明返回的类型。
如果一个方法声明有返回值,就必须返回所声明类型的值。
Java是通过值传递的,也就是说通过拷贝传递
方法无法改变调用方所传入的参数
Q&A:
如果想要传入的参数是对象而不是primitive主数据类型会怎样?
在Java中所传递的所有东西都是指,但此值是变量所携带的值。还有,引用对象的变量所携带的是远程控制而不是对象本身。若你对方法传入参数,实际上传入的是远程控制的拷贝。
方法可以声明多个返回值吗?有没有别的方法可以返回多个值?
方法只能声明单一的返回值。可以利用数组来返回多个值
要点:
- 类定义对象所知及所为。
- 对象所知者为实例变量。
- 对象所为者是方法。
- 方法可以根据实例变量来展现不同的行为
- 方法可使用参数,这代表你可以传入一个或多个值给方法
- 传给方法的参数必须符合声明时的数量、顺序和类型。
- 传入与传出方法的值类型可以隐含地方法或者明确地缩小。
- 方法必须声明返回类型。使用void类型代表方法不返回任何东西。
- 如果方法声明了非void的返回类型,那就一定要返回与声明对象类型相同的值。
运用参数与返回类型
Getter与Setter(Accessor与Mutator),Getter与Setter可让你执行get与set。Getter的目的只有一个,就是返回实例变量的值,Setter的目的就是要取用一个参数来设定实例变量的值。
封装(Encapsulation)
暴露的意思是可通过圆点运算符来存取,像是:
tehCat.height = 27;
直接通过远程控制修改Cat的实例变量。
数据隐藏
使用公有与私有这两个存取修饰符(access modifier)
以下就是封装的基本原则:将你的实例变量标记为私有的,并提供公有的getter与setter来控制存取动作。
将实例变量标记为private
将getter与setter标记为public
封装GoodDog
public class GoodDog {
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
void bark() {
if (size > 60) {
System.out.println("Wooof!Wooof!");
} else if (size > 14) {
System.out.println("Ruff!Ruff!");
} else {
System.out.println("Yip!Yip!");
}
}
}
public class GoodDogTestDriver {
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();
}
}
结果:
Dog one:70
Dog two:8
Wooof!Wooof!
Yip!Yip!
声明与初始化实例变量
变量声明至少需要名称和类型,同时也可以初始化(赋值)变量,但如果你没有初始实例变量时,调用getter会发生什么事?也就是说实例变量在初始化之前的值是多少?
public class PoorDog {
private int size;
private String name;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class PoorDogTestDrive {
public static void main(String[] args) {
PoorDog one = new PoorDog();
System.out.println("Dog size is" + one.getSize());
System.out.println("Dog size is" + one.getName());
}
}
运行结果:
Dog size is0
Dog size isnull
实例变量永远都会有默认值,就算没有明确的赋值给实例变量,或者没有调用setter方法,实例变量还是会有值
integer 0;
floating points 0.0
booleans false
references null
实例变量与局部变量之间的差别
1.实例变量是声明在类内而不是方法中
2.局部变量是声明在方法中的。
3.局部变量在使用前必须初始化(局部变量没有默认值!如果变量被初始化之前就使用的话,编译期就会显示错误)
Q&A
那方法的参数呢?局部变量的规则也适用于它们身上么?
方法的参数基本与局部变量是相同的,他们都是在方法中声明的。而参数并没有未声明的问题,所以编译器也不可能对这种事情显示出错误。如果调用方法而没有赋值参数时编译器就会显示错误。所以说参数一定会被初始化,编译器会确保方法被调用时会有与声明所相符的参数,且参数会自动地被赋值进去。
变量的比较(primitive主数据类型或引用)
使用==来比较两个primitive主数据类型,或者判断两个引用是否引用同一个对象。
使用equals()来判断两个对象是否在意义上相等。
【Head First Java 读书笔记】(四)对象的行为的更多相关文章
- Java 读书笔记 (二) 对象和类
Java 作为一种面向对象语言,支持以下基本概念: 多态 继承 封闭 抽象 类 对象 实例 方法 重载 对象: 是类的一个实例,有状态和行为.以人为例,黄种人.白种人.黑种人为类,每一个具体的人为类的 ...
- Java 读书笔记 (四) 常量
常量在程序运行时不能被修改. 在Java中使用final 关键字来修饰常量 ,声明方式和变量类似: final double PI=3.1415927 常量名也可以用小写,但为了便于识别,通常使用大写 ...
- Thinking In Java读书笔记--对象导论
Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...
- head first java读书笔记
head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...
- think in java 读书笔记 2 —— 套接字
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...
- think in java 读书笔记 3 —— 数据报
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...
- think in java 读书笔记 1 ——移位
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
1. Set - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...
- 【Head First Java 读书笔记】(二)类与对象
前篇当中,代码都放在main()里面,那根本不是面向对象的做法. 椅子大战(对象如何改变你的一生) 程序规格: 在图形接口画出四方形,圆形和三角形,当用户点选图形时,图形需要顺时针转360度并依据形状 ...
随机推荐
- php 日期时间运算比较
$sql= "select * from t_datestudy where id='4750' and agreemode='2' and school_agree !='1'" ...
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- 找到最大或最小的N个元素
问题: 想在某个集合中找到最大或最小的N个元素 解决方案: heapq 模块中有两个函数 nlargest() 和 nsmallest() 它们正是我们需要的.例如: import heapq n ...
- WS-* 协议
Web服务作为实现SOA中服务的最主要手段.跟Web Service相关的标准,它们大多以“WS-”作为名字的前缀,所以统称WS-*. Web服务最基本的协议包括UDDI,WSDL和SOAP,通过它们 ...
- erlang 应用获取系统参数
很多时候,我们的程序需要一些预定义的参数,比如上次说的tcp_server的例子 一般参数有几种途径,具体参考这里http://blog.yufeng.info/archives/2852 app里面 ...
- emqtt 1 (初初初初稿)
第一篇,先简单分析一下整个emqtt 的大致结构,包括两个部分: 1.message packet 类型 2.message 流向 message packet 类型 P1:mqtt_packet 的 ...
- maven环境配置详解,及maven项目的搭建及maven项目聚合
首先:Maven 3.2.1:不同版本中仓库中文件是不一样的,Maven运行,先找用户配置,再找全局配置 1. Maven全局配置:全局统一的配置文件,在maven的安装目录中 2. Maven用户配 ...
- .Net上传文件超过了最大请求长度
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 修改web.config文件可以改变这个默认值为 <configuration&g ...
- Mycat主从模式下的读写分离与自动切换
1. 机器环境 192.168.2.136 mycat1 192.168.2.134 mydb1 192.168.2.135 mydb2 2在mysql1.mysql2上安装mysql 更改root用 ...
- scss基本用法总结
工作的时候天天用,面试的时候却没了思路,这就是懒得下场.多总结,多整理,才是成长得王道啊.最近换工作,把以前该整理得工作梳理一遍. 一.定义变量与引用 $color: #f00; $a-color: ...