Thinking in Java 读书笔记 第二章 一切都是对象

17 篇文章 0 订阅

章二 一切都是对象

用CSDN的markdown写的,中间丢失了两份更新,都无法恢复。总之,没有自动保存功能,手动保存还经常保存不下来(what the fuck),引以为戒吧:

  • 一是在编辑这个博客时打开了另一个博客(更新一下内容),然后这个博客已经写的内容就白写了
  • 二是不小心按到了什么键,直接就退出了,然后博客也白写了。

C++和Java都是混合/杂合型语言。相比之下,由于C++需要实现对C的向后兼容,显得更加复杂。而Java是纯面向对象语言,Java中(几乎)一切都是对象

2.1 用引用操纵对象

操纵内存中元素方式:1.直接操纵元素,2.基于特殊语法进行间接表示(如指针
在Java中,一切被视为对象,可以用单一语法进行操纵,Java选择用引用操作。
代码示例:String s = new String()
式中,String s声明了一个对象引用new String()通过new关键字创建了一个**String对象实例,两者通过=来连接。

2.2 必须由你创建所有对象

2.2.1 存储位置

Java中有5个不同的位置可以存储数据

  • 寄存器:位于CPU内部速度最快数量有限无法直接控制
  • 堆栈:位于通用RAM中,可以通过堆栈指针从处理器哪里获得直接支持。
        堆栈指针向下移动则分配内存,向上移动则释放内存。系统必须知道堆栈中数据的确切生命周期
        堆栈中存储对象引用基本数据类型
  • :通用内存池,也位于RAM中,用以存放所有的Java对象。无需知道数据存活时间,更灵活
      但是用进行存储分配和清理比用堆栈耗时更多
  • 常量存储:通常直接存放于程序代码内部
  • 非RAM存储:数据存货在程序之外,不受程序控制。主要有流对象持久化对象

2.2.2 特例:基本数据类型

存在原因:Java中用new关键词创建对象并置于中,但用new创建小型,简单变量效果不佳。
     于是创建并非是引用自动变量,由这些变量直接存储,并置于堆栈中,更高效

Java中基本数据类型

基本类型大小最小值最大值包装器类型
boolean——————Boolean
char16-bitsUnicode 0Unicode 65535Character
byte8 bits-128127Byte
short16 bits-3276832767Short
int32 bits-2^312^31-1Integer
long64 bits-2^632^63-1Long
float32 bitsIEEE754IEEE754Float
double64 bitsIEEE754IEEE754Double
void——————Void


高精度数字

Java支持两种用于高精度计算的类,类似包装器类,但没有对应的基本类型,能执行intfloat所有操作,必须以调用方法形式->降低运算速度

  • BigInteger:支持任意精度整数
  • BigDecimal:支持任意精度定点数

tips

  • Java中基本数据类型所存储空间具有不变性->可移植性
  • Java中所有数值类型都有正负号,没有无符号类型
  • Java中boolean类型只能取字面值truefalse,存储空间大小未明确定义
  • Java SE5后的自动包装功能能将基本类型转为包装器类型Character ch = 'x';
    反向操作亦可:char c = ch;
  • Java中字符串可以用带引号的文本初始化:String s = "example"

2.2.3 Java中的数组

特性:

  • Java确保数组中元素会被初始化
  • 范围检查:Java确保其不能再范围外访问
  • 数组对象中,数组中所有引用被初始化为null
    基本数据类型数组中,数组所占内容会被置零

2.3 永远不需要销毁对象

变量生命周期的混乱往往会导致大量的bug。Java会自动完成清理工作,减少bug。

2.3.1 作用域(scope)

作用域决定了在其内定义的变量名的可见性生命周期
在C、C++和Java中,作用域花括号{}的位置决定。
作用域内定义的变量只可用于作用域结束之前
Java中,无法用同名变量隐藏一个更大作用域的变量

    int x = 12;
    {
        int x = 43;  //illegal in Java; legal in C/C++
    }

2.3.2 对象的作用域

Java对象的生命周期与其基本类型不一样,可以存活在作用域之外
Java通过垃圾收集器GC来监视所有对象,并释放所有不被引用的变量的内存空间

2.4 创建新的数据类型:类

Java中通过class关键字引入新类型: Class Example { //nothing here }
创建新类型后,通过new关键字创建类型实例: Example e = new Example();

2.4.1 字段和方法

Java中全部工作即为定义类产生类对象,给对象发送消息
定义完类后,可以在类中设置其两种类型的元素:

  • 字段(数据成员):字段可以为1.基本数据类型,或2.对象引用
  • 方法(成员函数)
字段(数据成员)默认值:
基本类型默认值
booleanfalse
char‘\u0000’(null)
byte,short,int,long0(各种形式0)
float,double0.0f, 0.0d
对象引用null
注意:此默认值仅在基本数据类型作为字段时有效,作为局部变量无效,
   方法体中定义的局部变量最好赋初值

2.5 方法、参数和返回值

Java的方法决定了对象能够接收什么样的信息。
Java中方法只能作为类的一部分来创建,只能通过对象来调用。
方法的4个基本组成:

  • 返回值:通过返回类型描述调用方法后从方法返回的值
  • 名称:方法标识
  • 参数:通过参数列表给出传递给方法的信息的类型名称
  • 方法体:具体实现

方法标签:由方法名参数列表组成,唯一标识某个方法。
通过对象调用方法通常被成为发送消息给对象面向对象程序设计通常简单地归纳为向对象发送方法

2.5.1 参数列表

Java中,参数列表传递的实际为引用,而不是对象本身。
return关键字两个用途:1.表明事情已完毕,离开此方法;2.返回返回值
void关键字:若任何返回值,则返回类型设为void

2.6 构建Java程序

2.6.1 名字可见性

名字管理程序设计语言来说,是一个重要问题。
在C++中,通过将函数包于类内,避免与其他类的函数名冲突;通过命名空间避免全局数据全局变量的冲突。在Java中,没有全局数据全局变量,并通过域名反转的方式定义包名(小写),且每个类有唯一的标识符,杜绝了命名冲突问题。

2.6.2 运用其他构建

如果想在自己的程序里使用预先定义好的类(复用),编译器必须知道如何定位类。
两种情况:
1. 两个类在同一文件,可以直接使用,且没有向前引用问题。对于java.lang.*包中类库也可直接使用
2. 在其他文件,用import关键字给编译器定位,如import java.util.ArrayList,可用通配符‘*’来导入一整个类库,如上所述。

2.6.3 static关键字

static关键字用以声明事物与包含它的那个类的任何对象实例不关联。主要有以下两种用途

  • static字段:用以声明该字段与具体实例对象无关

    • static字段只有一份存储空间
    • static字段可以通过对象两种途径来引用
  • static方法:用以声明该方法与具体实例对象无关
    • static方法可以通过对象两种途径来引用
    • static方法中不能直接调用非static方法
    • static方法可以创建或使用其同类型对象,通常用以看护实例群,示例:main()函数

2.7 第一个Java程序

程序示例:

import java.util.Date;
public class HelloDate {
    public static void main(String[] args) {
        System.out.println(new Date());
    }
}

说明:
system类位于java.lang包中,无需importout为system类的一个静态PrintStream对象println()提供打印并换行服务。

类名必须与文件名相同,类中必须包含main()方法:public static void main(String[] args)
public关键字表示该方法可由外部调用,参数argsString对象数组,用以保存命令行参数
这里的Date()对象给出当前时刻,语句结束后立即被垃圾收集器清理,输出结果:
Fri Oct 06 22:59:18 GMT+08:00 2017

注意:多查阅JDK文档,可在官网下载

2.7.1 编译和运行

安装和配置Java环境(百度可以轻易查到)

2.8 注释和嵌入式文档

同C++一样,Java也有两种注释风格:
1. 单行注释 : \\ This line is a comment
2. 多行注释: \* All the contents between is a comment *\

2.8.1 注释文档

Java中,可以通过使用javadoc来提取注释,生成文档
javadoc输出HTML文件,可以用Web浏览器查看

2.8.2 语法

/**
This is a javadoc example
just another line
*/

使用javadoc的方式主要有两种:
1. 嵌入HTML
2. 文档标签
- 独立文档标签
- 行内文档标签

主要有三种类型的注释文档:
- 注释:在类定义之前
- 注释:在域定义之前
- 方法注释:在方法定义之前

注意:javadoc只可为publicprotected成员做进行文档注释

2.8.3 嵌入式HTML

2.8.4 一些标签示例

JDK文档可以查阅javadoc参考,一些可用于代码文档的javadoc标签如下:

  • @see:引用其他类的文档,通过该标签链接
  • @link package.class#member label:与@see相似,但只用于行内
  • ………………

2.9 编码风格

参考《阿里巴巴Java开发手册》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值