Java编程思想 学习笔记2
二、一切都是对象
1.用引用操纵对象
在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”。可以将这想象成遥控器(引用)来操纵电视机(对象)。另外,没有电视机,遥控器也可以单独存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。
2.必须由你创建所有对象
一旦创建了一个引用,就希望它能与一个新对象相关联。通常用new操作符来实现。
①存储到什么地方
程序运行时,对象是怎样进行放置安排的呢?特别是内存是怎样分配的?有五个不同的地方可以存储数据:
- 寄存器。这是最快的存储区,因为它位于处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在。
- 堆栈。位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所以项的确切的生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些数据存储于堆栈中——特别是对象引用,但是Java对象并不存储于其中。
- 堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需要用new写一行简单的代码,当执行这个代码时,会自动在堆里进行存储分配。当然,这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多时间。
- 常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
- 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是流对象和持久化对象。
②特例:基本类型
不用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,因此更高效。
Java确定了每种基本类型所占存储空间的大小。
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
boolean | — | — | — | Boolean |
char | 16-bit | Unicode o | Unicode 2^16-1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15-1 | Short |
int | 32 bits | -2^31 | +2^31-1 | Integer |
long | 64 bits | -2^63 | +2^63-1 | Long |
float | 32 bits | -2^128 | +2^127 | Float |
double | 64 bits | -2^1024 | +2^1023 | Double |
void | — | — | — |
Void |
所有数值类型都有正负号,所以不愿去寻找无符号的数值类型。
boolean类型所占存储空间的大小没有明确指明,仅定义为能够取字面值true或false。
③Java中数组
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值(null)。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时会报错。因此,常犯的数组错误在Java中就可以避免。
3.永远不需要销毁对象
①作用域
作用域决定了在其内定义的变量名的可见性和生命周期。在Java中,作用域由花括号的位置决定。
尽管以下代码在C和C++中是合法的,但是在Java中却不能这样书写:
{
int x = 12;
{
int x = 96;//Illegal
}
}
编译器将会报告变量x已经定义过。Java不允许这样的做法,这样会导致程序混乱。
②对象的作用域
Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。
事实证明,由new创建的对象,只要你需要,就会一直保持下去。如果Java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞程序呢?
Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便其他新的对象使用。
4.创建新的数据类型:类
一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时称作成员函数)。字段可以时任何类型的对象,可以通过其引用与其进行通信。如果字段时对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值:
基本类型 | 默认值 |
boolean | false |
char | '\u0000'(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
当变量作为类的成员变量使用时,Java才确保给它默认值。确保初始化的方法不适用于“局部”变量。
5.方法、参数和返回值
Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。方法名和参数列表(它们合起来被称为“方法签名“)唯一地标识出某个方法。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用。通过对象调用方法时,需要先列出对象名,紧接是句点,然后是方法名和参数列表。例如,有一个方法f(),不带任何参数,返回类型是int。如果有个名为a的对象,可以通过它来调用f():int x = a.f(); 返回值的类型必须与x的类型相兼容。
这种调用方法的行为通常被称为发送消息给对象。在上面的例子中,消息是f(),对象是a。面向对象的程序设计通常简单地被归纳为“向对象发送消息”。
①参数列表
方法的参数列表指定要传递给方法什么样的信息。参数列表中传递的实际上也是引用,并且引用的类型必须正确。
6.构建一个Java程序
①名字可见性
有时,不同模块由于设计者的不同可能会出现名字冲突的现象。Java采用一种新的方法来处理此问题。为了给类库生成一个不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,因为这样可以保证它们肯定是独一无二的。
包名都是小写的。
这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符。
②运用其他的构件
import指示编译器导入一个包,也就是一个类库。使用通配符“*”来一次性导入一群类。
③static关键字
除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
由于在用static方法前不需要创建任何对象,所以对于static方法,不能简单地通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域或方法。
7.注释和嵌入式文档
Java里有两种注释风格。一种是“/*......*/”(多行注释),另一种是“//”(单行注释)。
①注释文档
javadoc是用于提取注释的工具,它是JDK安装的一部分。它采用了Java编译器的某些技术,查找程序内的特殊注释标签。它不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法名抽取出来。javadoc输出的是一个HTML文件,可以用Web浏览器查看。
②语法
所以javadoc命令都只能在“/**”注释中出现,和通常一样,注释结束于“*/”。使用javadoc的方式主要有两种:嵌入HTML,或使用“文档标签”。独立文档标签是一些以“@”字符开头的命令,且要置于注释行的最前面。而“行内文档标签”则可以出现在javadoc注释中的任何地方,它们也是以”@“字符开头,但要在花括号里。
共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域、方法。
注意,javadoc只能为public和protected成员进行文档注释。(但可以用-private进行标记,以便把private成员的注释也包括在内)。
③一些标签实例
1.@see:引用其他类
@see标签允许用户引用其他类的文档。javadoc会在其生成的HTML文件中,通过@see标签链接到其他文档。
2.{@link package.class#member label}
该标签与@see极其相似,只是它用于行内,并且是用“label”作为超链接文本而不用“See Also”.
3.{@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的显式超链接。
4.{@inheritDoc}
该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中。
5.@version
该标签的格式如下:
@version version-information
其中,“version-information”可以是任何你认为合适包含在版本说明中的重要信息。如果javadoc命令行中使用了“-version”标记,那么就从生成的HTML文档中特别提取出版本信息。
6.@author
该标签的格式如下:
@author author-information
其中,author-information一看便知是你的姓名,但是也可以包括电子邮件地址或者其他任何适宜的信息。如果javadoc命令行中使用了“-author”标记,那么就从生成的HTML文档中特别提取出作者信息。
7.@since
该标签允许你指定程序代码最早使用的版本,可以在HTML Java文档中看到它被用来指定所用的JDK版本的情况。
8.@param
该标签用于方法文档中,形式如下:
@param paramater-name description
其中,paramater-name是方法的参数列表中的标识符,description是可延续数行的文本,终止于新的文档标签出现之前。
9.@return
该标签用于方法文档中,形式如下:
@return description
其中,description用来描述返回值的含义,可以延续数行。
10.@throws
对异常进行说明,格式如下:
@throws fully-qualified-class-name description
其中fully-qualified-class-name给出一个异常类的无歧义的名字,而该异常类在别处定义。
description告诉你为什么此异常类型会在方法调用中出现。
11.@deprecated
该标签用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性。如果使用一个标记为@deprecated的方法,则会引起编译警告。
8.编码风格
在“Java编程语言编码约定”中,代码风格是这样规定的:类名的首字母要大写;如果类名由几个单词构成,那么把它们并在一群,其中每个内部单词的首字母都采用大写形式。几乎其他所有内容——方法,字段以及对象引用名称等,公认的风格与类的风格一样,只是标识符的第一个字母采用小写。
9.总结
本章简单介绍了如何编写一个Java程序,是十分基础的内容,但也是很重要的。记录下来以便复习记忆
Java编程思想 学习笔记2的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想 学习笔记1
一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...
- [Java编程思想-学习笔记]第1章 对象导论
1.1 抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...
- Java编程思想 学习笔记11
十一.持有对象 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...
- Java编程思想学习笔记——类型信息
前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...
- Java编程思想 学习笔记12
十二.通过异常处理错误 Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的 ...
- Java编程思想 学习笔记10
十.内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性.然而必须要了解,内部类和组合是 ...
- Java编程思想 学习笔记7
七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- Java编程思想 学习笔记4
四.控制执行流程 1.true和false 所有条件语句都利用条件表达式的真或假来决定执行路径.注意Java不允许我们将一个数字作为布尔值使用. 2.if-else 3.迭代 while.do-whi ...
随机推荐
- Mesos的用途
http://mesos.apache.org/ https://mesosphere.com/why-mesos/ http://www.cnblogs.com/ee900222/p/docker_ ...
- mysql数据库优化大全
转载:https://blog.csdn.net/weixin_38112233/article/details/79054661 数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式 ...
- Angular service定义服务
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...
- Jquery Jquery对象和DOM对象的微妙联系
声明变量 var $variable= Jquery 对象: var varibake= DOM对象: var $cr= $("#id&q ...
- Bootstrap洼地
前面的话 这是一个轻量.灵活的组件,它能延伸至整个浏览器视口来展示网站上的关键内容.本文将详细介绍Bootstrap洼地 概述 洼地(Well)样式的效果和巨幕jumbotron样式类似,不同点是we ...
- Spring IOC和Spring AOP的实现原理(源码主线流程)
写在前面 正本文参考了<spring技术内幕>和spring 4.0.5源码.本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解. Spring IOC 一.容器初始 ...
- Picture POJ - 1177(扫描线求面积并)
题意:求矩形并的面积.. 解析: 扫描线第一道题....自下而上扫描的... 如果不懂什么是扫描线戳我 #include <iostream> #include <cstdio> ...
- MT【10】和三次有关的一个因式分解
解答: 评:1此处因式分解也可以看成关于$a$的函数$f(a)$利用多项式有理根的有关知识得到 2.此处我们可以得到关于$\Delta ABC$的余弦的一个不等式$cosA+cosB+cosC> ...
- TiKV 源码解析系列文章(三)Prometheus(上)
本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...
- 【CF809E】Surprise me!(动态规划,虚树,莫比乌斯反演)
[CF809E]Surprise me!(动态规划,虚树,莫比乌斯反演) 题面 洛谷 CodeForces 翻译: 给定一棵\(n\)个节点的树,每个点有一个权值\(a[i]\),保证\(a[i]\) ...