当前位置: 首页 > news >正文

Java编程思想 Thinking in Java 学习笔记——第2章 一切都是对象

Java编程思想学习笔记——第2章 一切都是对象

  • 2.1 用引用操纵对象
  • 2.2 必须由你创建所有对象
    • 2.2.1 存储到什么地方
    • 2.2.2 特例:基本类型
    • 2.2.3 Java中的数组
  • 2.3 永远不需要销毁对象
    • 2.3.1 作用域
    • 2.3.2 对象的作用域
  • 2.4 创建新的数据类型:类
  • 2.5 方法、参数和返回值
  • 2.6构建一个Java程序
    • 2.6.3 static关键字
  • 2.7 你的第一个Java程序
  • 2.8 注释和嵌入式文档
    • 2.8.1 注释文档
    • 2.8.2 语法
  • 2.9 编码风格

2.1 用引用操纵对象

每种编程语言都有自己的语法规则去操纵内存中的对象。比如说C,C++是通过指针这种简介方式来操纵对象。
在Java中,一切都是对象。操纵的标识符其实是对象的引用(reference)。
引用像遥控器,对象是电视机。有遥控器(引用)就可以保持与电视机(对象)的联系。
String s;
这只是定义了一个引用,如果向s发送消息,就会报一个运行时错误,因为s没有与任何事物相关联。安全的做法是,创建一个引用的同时并对它初始化。
String s=“abcd”;

2.2 必须由你创建所有对象

2.2.1 存储到什么地方

寄存器:这是最快的存储区。位于处理器内部。
堆栈:位于通用RAM(随机访问存储器)中,可以通过堆栈指针直接访问。速率仅次于存储器。
栈:一种通用内存池,也位于RAM(随机访问存储器)。堆不同于堆栈的好处是——编译器不需要知道存储的数据(new出来的)在堆里存活的时间。
常量存储:直接存放在程序代码内部,在ROM(只读存储器)中。
非RAM存储:
流对象:一个机器发给另一个机器的字节流。
持久化对象:对象被存放在磁盘上。

2.2.2 特例:基本类型

new一个简单变量,存储在堆,不高效。
Java采取与c、c++相同的方法,不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,更高效。
在这里插入图片描述

BigInteger支持任意精度的整数。

BigDecimal支持任何精度的定点数。

2.2.3 Java中的数组

C、C++中的数组就是内存块,可能会有访问内存块外的数组或数组初始化前使用内存,都会产生难以预料的后果。
Java的主要目标之一是安全。Java确保数组初始化,而不不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销运行时的下标检查为代价的。由此换来安全性和效率的提高。

创建一个数组对象,就是创建一个引用数组,并且每个引用都会被自动初始化为一个特定值,拥有自己的关键字null,一旦java看到null,就知道这个引用还没有指向某个对象。在使用引用前,要指定对象,否则运行时会报错。

2.3 永远不需要销毁对象

2.3.1 作用域

在C、C++、Java中,作用域由花括号的位置决定。

在Java中,空格、制表符、换行都不会影响程序的执行结果。

2.3.2 对象的作用域

Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。
例如:
{
String s= new String(“a string”);
}//End of scope

引用s在作用域终点就消息了。然而,s指向的String对象仍继续占据内存空间。作用域之后无法访问这个对象。
Java有一个垃圾回收器,用来监视new创建的所有对象,并辨别那些不会再被引用的对象,并释放这些对象的内存空间,以便其他新的对象使用。

有一个问题:
java中有垃圾回收器,能监视new创建的所有对象,并辨别那些不会被引用的对象。随后,释放这些对象的内存空间,以便使其他新的对象使用。那为什么会有java heap泄漏呢
Java中的内存泄漏(Java Heap Leak)与C/C++中的内存泄漏在表现上相同(最终都会导致OutOfMemoryError),但成因完全不同。

C/C++中的内存泄漏是程序员显式分配了内存(malloc或new)后,完全丢失了该内存的地址,导致无法再访问也无法释放它。

而Java中的内存泄漏,更准确的描述是:“无用的对象仍然被意外地引用着”(Unintentional Object Retention)。

垃圾回收器只会回收那些不可达(Unreachable) 的对象。如果一个对象虽然程序以后永远不会再使用它,但由于编码错误,它仍然被一个有效的引用链(Reference Chain)所连接,GC就无法回收它。这种对象的累积就会导致内存泄漏,最终耗尽堆内存。

2.4 创建新的数据类型:类

字段:数据成员
方法:成员函数

字段可以是任意类型的对象。
字段如果是某个类型的引用,必须初始化该引用,以便与一个实际对象相关联。
字段如果是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值。
boolean-》false
char-》‘\uooo’(null)
byte->0
short->0
int->0
long->0L
float->0.0f
double->0.0d

如果是局部变量例如 int x; x值不会被初始化为零。Java会在编译时,返回一个错误,告知变量没有初始化,这是优于C++的地方。

2.5 方法、参数和返回值

许多程序设计语言(像C、C++),用函数这个术语来描述命名子程序,而在Java里却常用方法这个术语来表示“做某些事情的方式”。
方法的基本构成是名称、参数、函数体、返回值。
方法只有通过对象才能调用。

2.6构建一个Java程序

2.6.3 static关键字

定义类只是描述类的属性和行为。new创建对象时,数据存储空间才被分配,方法才供外界调用。

新的情形:
1)只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象。
2)希望某个方法不与包含它的类的任何对象关联在一起

此时用static关键字。
Class Mytest{
static int i=19;
}
Mytest m1=new Mytest();
引用static变量有两种方法。通过对象,m1.i;
或者类名直接引用,Mytest.i;

Class Lei(){
static void incre(){
Mytest.i++;
}
}
Lei mylei=new Lei();
mylei.incre();

或者
Lei.incre();

2.7 你的第一个Java程序

2.8 注释和嵌入式文档

注释方式有两种
当行//
多行/* */

2.8.1 注释文档

2.8.2 语法

2.9 编码风格

类名首字母大写。
类名多个字母,首字母都大写。
方法,对象首字母小写。

Class AllTheColor{
int anIntegerRepresent;
void changeTheHun;
}

http://www.dtcms.com/a/390307.html

相关文章:

  • AssemblyScript 入门教程(2)AssemblyScript的技术解析与实践指南
  • 深入理解Java数据结构
  • 【试题】网络安全管理员考试题库
  • 第一章 信息化发展
  • 第六章:实用调试技巧
  • 人工智能通识与实践 - 智能语音技术
  • CSP-S 提高组初赛复习大纲
  • 卷积神经网络CNN-part7-批量规范化BatchNorm
  • [xboard]02 uboot下载、移植、编译概述
  • Python入门教程之字符串运算
  • 堡垒机部署
  • 刷题记录(10)stack和queue的简单应用
  • 如何进行时间管理?
  • Spring面试题及详细答案 125道(46-65) -- 事务管理
  • OA ⇄ CRM 单点登录(SSO)实现说明
  • 人工智能在设备管理软件中的应用
  • __pycache__ 文件夹作用
  • 利欧泵业数据中心液冷系统解决方案亮相2025 ODCC开放数据中心峰会
  • 【论文阅读】Masked Conditional Variational Autoencoders for Chromosome Straightening
  • 天气预测:AI 如何为我们 “算” 出未来的天空?
  • 大数据管理与应用有什么注意事项?企业该如何发挥大数据的价值
  • CSS的opacity 属性
  • STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册
  • 【0基础3ds Max】创建标准基本体(长方体、球体、圆柱体等)理论
  • 驾驭未来:深度体验 Flet 0.7.0 的重大变革与服务化架构
  • 【Datawhale组队学习202509】AI硬件与机器人大模型 task01 具身智能基础
  • Go语言高并发编程全面解析:从基础到高级实战
  • leetcode算法刷题的第三十八天
  • RHEL 兼容发行版核心对比表
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘yaml’ 问题