《 Java 编程思想》CH02 一切都是对象
用引用操纵对象
尽管Java中一切都看作为对象,但是操纵的标识符实际上对象的一个“引用”。
String s; // 这里只是创建了一个引用,而不是一个对象
String s = new String("abcd"); // 使用`new`操作符来创建一个对象,并将其与一个引用相关联
String s = "abcd"; // 字符串可以直接用带引号的文本初始化
必须由你创建所有对象
使用new操作符创建一个对象
存储到什么位置
由五个地方可以存储数据:
- 寄存器:由于寄存器数量有限,所有无法直接控制
- 堆栈(栈):RAM中,存储在栈中的数据必须明确知道其生命周期,通常局部存放对象引用和局部基本类型的变量。
- 堆:存放所有的对象
- 常量存储:通常直接存放在代码内部,其永远不会改变
- 非RAM存储:数据存放在程序之外,不受程序的控制,如流对象(System.out)和持久化对象(存放在磁盘的文件)。
特例:基本类型
一些比较小的,简单的类型,如果放在堆中往往效率不高,所以这些类型不需要使用new来创建,而是创建一个“自动”变量来直接存储“值”,并置于栈中。
Java 中所有基本类型所占据存储空间的大小都是明确的.

- 所有数值类型都有正负号
boolean类型所占存储空间的大小没有明确,仅定义为能够去字面值true或false- 基本类型和其对应的包装类之间可以自动装包、自动解包
- Java 提供了两个用于高精度计算的类:
BigInteger和BigDecimal
Java 中的数组
- Java 确保数组会被初始化,且会进行范围检查
- 当创建一个数组对象时实际就是创建一个引用数组,并且每个引用都会被自动初始化为一个特定值
null - 也可以创建用来存放基本数据类型的数组,此时的初始化则是置零
永远不需要销毁对象
作用域
- 作用域决定了在其内定义的变量的可见性和生命周期
- 在作用域里定义的变量只可用于作用域结束前
- Java 中不允许“覆盖”变量的可见性
{
int x = 12;
// x available
{
int q = 96;
// Both x & q available
int x = 96 // Illegal
}
// only x available
}
对象的作用域
- Java 对象不具备和基本类型一样的生命周期,由
new创建的对象,只要你需要,其会一直保留下去。 - Java 使用垃圾回收器来监视
new创建的对象,辨别并释放那些不会再被引用的对象
创建新的数据类型:类
使用class来创建一个新的类型:
class ATypeName { }
字段和方法
一旦定义了一个类,就可以在类中设置两种元素:字段(数据成员)和方法(成员函数)。字段可以是任何类型的对象或基础类型。每个对象都有存储其字段的空间,即普通字段不在对象间共享。
引用一个对象的成员的方式:objectReference.member
基本数据类型的变量只有是类的成员时,才确保其获得一个默认值,否则的话,与C++一样,该变量可能是任意值(其实就是在堆还是栈的问题嘛),不过这种情况下Java会报编译错误。
方法、参数和返回值
方法的基本组成部分包括:名称、参数、返回值和方法体:
ReturnType methodName ( /* Argument list */) {
/* Method body */
}
方法名和参数列表唯一地标识某个方法(合起来称为“方法签名”)注意:方法签名不包含返回值。
Java 中的方法只能作为类的一部分来创建,方法通常只有通过对象才能调用,且这个对象必须有这个方法。
参数列表
方法的参数列表指定要传递给方法什么样的信息,这里采用的都是对象的类型,即包含指定的类型和名字,这里传递的实际上是引用,传递基础类型则通过自动包装来实现。
构建一个 Java 程序
名字可见性
为了防止不同类库中使用了相同的类名,Java 将反过来的域名作为唯一标识符(即包名),如我的域名为codeand.fun,则我的类库则使用fun.codeand.utils的形式。
包名使用小写
运用其他构件
使用import导入想要的包:
import java.util.ArrayList;
import java.util.*; // 导入java.util下所有的类
java.lang默认导入到每一个Java文件中。
static 关键字
当声明一个事物为static时,就意味着这个域或方法不会与包含它的类的任何对象实例关联在一起,可以理解为类数据和类方法。
class StaticTest {
static int i = 47;
static void inc() { i++; }
}
int j = StaticTest.i; // 47
StaticTest st1 = new StaticTest();
StaticTest.inc();
StaticTest st2 = new StaticTest();
// st1.i == st2.i == 48 // 所有i都指向同一个存储空间
你的第一个 Java 程序
// HelloDate.java
import java.util.*;
public class HelloDate {
public static void main(String[] args) {
System.out.println("Hello, it's");
System.out.println(new Date());
}
}
要创建一个独立运行的程序,那么该文件中必须存在某个类与该文件同名,且那个类必须又一个main方法,其形式如public static void main(String[] args)。
编译和运行
$ javac HelloDate.java // 编译,产生一个 HelloDate.class 文件
$ java HelloDate // 运行
注释和嵌入式文档
- 多行注释:
/* something */ - 单行注释:
// something
注释文档
Java 中可以将代码与文档放到一个文件中,这样有利于文档的维护,为了实现这一目的,这里使用一种特殊的注释语法来标记文档,此外还有一个工具javadoc来提取注释。javadoc的输出是一个html
# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:05] C:1
$ javadoc HelloDate.java
正在加载源文件HelloDate.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.8.0_242
正在构建所有程序包和类的树...
正在生成./HelloDate.html...
正在生成./package-frame.html...
正在生成./package-summary.html...
正在生成./package-tree.html...
正在生成./constant-values.html...
正在构建所有程序包和类的索引...
正在生成./overview-tree.html...
正在生成./index-all.html...
正在生成./deprecated-list.html...
正在构建所有类的索引...
正在生成./allclasses-frame.html...
正在生成./allclasses-noframe.html...
正在生成./index.html...
正在生成./help-doc.html...
# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:11]
$ ls
allclasses-frame.html HelloDate.class index-all.html package-list stylesheet.css
allclasses-noframe.html HelloDate.html index.html package-summary.html
constant-values.html HelloDate.java overview-tree.html package-tree.html
deprecated-list.html help-doc.html package-frame.html script.js

注释语法
所有 javadoc 命令都只能在由/**和*/组成的注释中
javadoc 的注释,只能为public和protected成员进行文档注释,而private和defaule成员的注释会被忽视掉
javadoc 主要有两种形式:
- 嵌入HTML
- 文档标签:
- 独立文档标签是一些以
@字符开头的命令,且置于注释行的最前面(除了前导的*) - 行内文档标签则可以在 javadoc 注释中的任何位置,同样以
@开头,但要在花括号内。
- 独立文档标签是一些以
常用的标签有:
@see:引用其他类,会生成一个超链接条目(不会校验该链接是否有效),超链接文本为“See Also”@see classname
@see fully-qualified-classname
@see fully-qualified-classname@method-name
{@link package.class#member label}:与@see类似,不过是行内标签,使用“label”来处理作为超链接文本{@docRoot}:该标签产生到文档根目录的相对路径{@inheritDoc}:该标签从当前这个类最直接的基类继承相关文档到当前文档注释中@version:版本信息@author:作者信息@since:指定JDK版本最低为多少@param:表示参数含义,形式如@param parameter-name description@return:描述返回值,形式如@return description@throws:异常描述,该方法可能抛出的每个异常都需要说明,形式如@throws fully-qualified-class-name description@deprecated:指出一些旧特性已由改进的新特性所取代,不建议使用。调用一个标记为@deprecated的方法,编译器会发出警告。
// HelloDate.java
import java.util.*;
/** A class comment
* Test comment
* @author wuxiaobai24
* @version 0.1
*/
public class HelloDate {
/** a field comment */
public int i;
/**
* a <strong>protected</strong> filed comment
* <ol>
* <li>one</li>
* <li>two</li>
* <li>three</li>
* </ol>
*/
protected int p;
/** a private field comment */
private int j;
/** A method comment
* @param args args comment
*/
public static void main(String[] args) {
System.out.println("Hello, it's");
System.out.println(new Date());
}
}



编码风格
- 驼峰式写法
- 标识符的第一个字符采用小写,其余用大写
练习
练习1
// Ex1.java
public class Ex1 {
public int i;
public char c;
public static void main(String[] args) {
Ex1 e = new Ex1();
System.out.println(e.i);
System.out.println(e.c);
}
}
练习2
// Ex2.java
public class Ex2 {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
练习3 & 练习4 & 练习5
// Ex3.java
class DataOnly {
int i;
double d;
boolean b;
}
class ATypeName {
}
public class Ex3 {
public static void main(String[] args) {
ATypeName a = new ATypeName();
DataOnly d = new DataOnly();
d.i = 1;
d.d = 2.0;
d.b = false;
System.out.println(d.i);
System.out.println(d.d);
System.out.println(d.b);
}
}
练习6
// Ex4.java
public class Ex4 {
int storage(String s) {
return s.length() * 2;
}
public static void main(String[] args) {
String s = new String("Hello");
Ex4 e = new Ex4();
int len = e.storage(s);
System.out.println(len);
}
}
练习7 & 练习8
// Ex7.java
class StaticTest {
static int i = 47;
}
class Incrementable {
static void increment() { StaticTest.i++; }
}
public class Ex7 {
public static void main(String[] args) {
StaticTest st1 = new StaticTest();
Incrementable.increment();
StaticTest st2 = new StaticTest();
System.out.println(st1.i);
System.out.println(st2.i);
System.out.println(StaticTest.i);
}
}
练习9
// Ex9.java
public class Ex9 {
public static void main(String[] args) {
int i = 24;
Integer bi = i;
System.out.println(i);
System.out.println(bi);
// ....
}
}
练习10
// Ex10.java
public class Ex10 {
public static void main(String[] args) {
if (args.length == 3) {
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
}
}
}
练习11
// Ex11.java
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
anIntegerRepresentingColors = newHue;
}
}
public class Ex11 {
public static void main(String[] args) {
AllTheColorsOfTheRainbow allTheColorsOfTheRainbow = new AllTheColorsOfTheRainbow();
allTheColorsOfTheRainbow.changeTheHueOfTheColor(1);
System.out.println(allTheColorsOfTheRainbow.anIntegerRepresentingColors);
}
}
首发与Code & Fun
《 Java 编程思想》CH02 一切都是对象的更多相关文章
- 《java编程思想》一切都是对象
1. 用引用操纵对象 在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用.我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能 ...
- JAVA编程思想(1) - 一切都是对象
-"假设我们说还有一种不用的语言,那么我们就会发觉一个有些不同的世界" 1. 用引用操纵对象 每种编程语言都有自己的数据处理方式. 有些时候,程序猿必须时刻留意准备 ...
- 阅读java编程思想之一切都是对象
温故而知新--- 1. 用句柄操作对象 现实生活中,我们可以把遥控器当作句柄,电视机当作对象.当我们拿到句柄(遥控器)的时候,我们是可以控制对象的(电视机).比如说调节音量大小,色彩等.那么在程序里, ...
- Java程序员的日常——《编程思想》一切都是对象
今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...
- Java编程思想 4th 第1章 对象导论
所有编程语言都提供抽象机制. 面向对象编程似乎是一种很好的编程思想和方式,面向对象编程中的对象简洁描述是:对象具有状态.行为和标识.状态指的是数据存储,存储的数据能反应状态:行为指的是方法,方法表示对 ...
- 《Java编程思想》笔记 第一章 对象导论
1.抽象过程 Q:什么是对象??? A: 1) 万物皆对象 --- 对象具有状态,行为和标识 2)程序是对象的集合,他们通过发送消息来告诉彼此要做的 3)通过创建包含现有对象的包的方式来创建新类型 ...
- Java编程思想 - 第11章 持有对象
· 大量笔记存放在Github Java文件中,请移步查看:https://github.com/iGuure/AndroidCodeHub/tree/master/Java%20pratice/Th ...
- Java编程思想读书笔记 第一章 对象导论
抽象过程 纯粹的面向对象程序设计方式: 万物皆为对象: 对象可以存储数据,还可以在其自身执行操作 程序是对象的集合: 通过发送消息告诉彼此要做的 每个对象都有自己的由其它对象构成的存储:可以在程序中构 ...
- Java编程思想 4th 第2章 一切都是对象
Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
- 开发工具篇:JAVA和IntelliJ IDEA相恋
开发工具篇:JAVA和IntelliJ IDEA相恋 idea是什么? IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之 ...
- 敏捷开发:代码Review
热情高涨 代码走查作为一种流程形式,起初大家的参与热情非常高涨. 因为,自己可以学习到别人一些巧妙的思想,自己的代码和习惯都暴漏出来. 这个过程中不断地吸收和改正. 但是...... 我们一开始组织的 ...
- 在Mac/linux上查找(并终止)进程锁定特定端口的几种方法
前言 无论是做网站还是做产品,经常使用到杀死某个进程的方法.制作脚本并熟悉运用是一个非常节省时间的方法. 基本命令 查找: [sudo] lsof -i :3000 杀戮 kill -9 方法一 ...
- Java和JavaScript之间的区别
1.简介 通过优锐课核心java学习笔记中,我们可以看到,Java和JavaScript之间的区别.我们将在本文中比较Java语言和JavaScript语言.JavaScript由Netscape开发 ...
- .NET C# 红包生成算法,可设置红包总额和数量,可限制最大最小红包
很多场景算红包的要求:根本问题就是指定的钱,指定的个数,红包发完,钱不剩余,最小红包1分钱,最大也需要限制. 原理:割绳子算法:每次都取最大值为总绳长的随机值,最后将其排序,计算每两个的差值,总差值即 ...
- express框架中使用nodemon自启动服务
1.安装nodemon //全局安装 npm install -g nodemon //本地安装 npm install nodemon --save 2.修改package.json配置 " ...
- python封装简介
1.效果图: 对比一: 对比二: 2.学习来源代码: # 封装是面向对象的三大特性之一 # 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 # 如何隐藏一个对象中的属性? # - 将对象的属 ...
- scratch3.0二次开发scratch3.0基本介绍(第一章)
为什么要自己开发而不使用官方版本? 这个问题要看我们的做少儿编程教育的需求是怎么样的. scratch本身提供了离线版本以及官网在线平台供我们使用,这足以满足我们对于编程教学模块的需求.但是对于一些教 ...
- Oracle RAC服务器重启故障排查
Oracle Real Application Clusters(Oracle RAC),相对于Oracle单实例来说部署安装和维护都增加了难度,尤其在日常的维护和故障处理过程中,各种日志的查看更加重 ...
- 有关lightning页面中页面加载时间计数器颜色分别表示的时间范围的问题
之所以要转载这篇文章的原因是,有一次调查lightning中右上角有个页面加载时间控件颜色分别代表多少时间范围的问题,搜索查阅了很多资料和文件,最终在一篇有关Lighthouse前端性能优化测试工具的 ...