重学Java(二):对象无处不在
前言
本系列文章内容来自于《Thinking in Java》作者的最新续作《On Java》基础卷,作者根据最新 Java 8、11、17的内容,重讲了Java的编程思想,值得初学者阅读。
操作对象
Java将一切都视为对象,但实际操作的其实是该对象的引用,再由引用来修改对象信息。
一种安全的做法是,始终在创建引用时就进行初始化:
String s;
String s = "asdf";
首行代码中,创建了一个引用,但这个引用还没有连接对象,直接使用起来会有问题。
第二行代码可以看到,字符串可以用带引号的文本进行初始化。
创建对象
引用的作用是关联对象。通常使用 new 关键字来创建对象。
数据存储方式
寄存器。这是最快的存储方式,因为数据会直接保存在CPU中,但是程序员无法直接控制寄存器的分配,因为寄存器数量是有限的。
栈(Stack)。数据保存在随机顺序存储器(RAM)中,处理器通过栈指针操作数据,在效率上仅次于寄存器。在栈上的所有对象都要明确其生命周期,灵活性上稍有限制。对象引用保存在栈中。
堆(Heap)。数据也保存在 RAM 中,用于存储所有 Java 对象。编译器不关心位于堆上的对象存在多久,使用较为灵活。但分配和清理堆存储时花费时间略高于栈。
常量存储区。
非 RAM 存储。一个例子是序列化对象,指的是转换为字节流并能发送到其他机器上的对象;另一个例子是持久化对象,也就是保存在磁盘上的对象,这些对象能转换为其他形式保存到其他媒介中,也能在需要的时候重新转换为 RAM 对象。
注意:对基本类型来说,无需使用 new 关键字创建基本类型的变量,而是直接创建一个“自动变量”,也不是引用。基本类型变量会在栈上保存它的值。
| 基本类型(有符号) | 大小 | 最小值 | 最大值 | 包装类 |
|---|---|---|---|---|
| char | 16位,2个字节 | \u0000(0) | \uffff(65535) | Char |
| byte | 8位,1个字节 | -128 | 127 | Byte |
| short | 16位 | -32768 | 32767 | Short |
| int | 32位 | -231 | 231 - 1 | Int |
| long | 64位 | -263 | 263 - 1 | Long |
| float | 32位 | IEEE 754 | IEEE 754 | Float |
| double | 64位 | IEEE 754 | IEEE 754 | Double |
除了以上几个基本类型,还有 boolean 类型,其包装类为 Boolean。通过包装类型可以将基本类型呈现为位于堆上的非原始对象。自动装箱和拆箱机制能够将基本类型对象和包装类对象自动转换。
高精度数字
BigInteger:支持任意精度的整数。
BigDecimal:支持任意精度的浮点数
数组
创建一个用于放置对象的数组时,实际数组内包含的是引用,这些引用会被自动初始化为 null 值,即这些引用并未指向任何一个对象。操作引用前需确保其指向了某个对象。
作用域
Java对象的生命周期和基本类型有所不同。当使用new创建一个对象时,该对象在其作用域结束后依然存在,而其引用则会在作用域结束后消失。
垃圾收集器会监视所有通过new创建的对象,并及时发现哪些对象不再被引用。然后就会释放这部分对象占用的内存,使这些内存可以用于其他新对象。垃圾回收机制解决了由于程序员忘记释放内存而导致的内存泄漏问题。
创建类
大多数面向对象编程语言会使用 class 关键字描述对象种类。
字段
当定义类时,可以为其定义两种元素:字段和方法。
当一个类的字段是基本类型时,即便你没有初始化这些字段,它们也会拥有默认值:
| 基本类型(有符号) | 默认值 |
|---|---|
| char | \u0000(null) |
| byte | (byte)0 |
| short | (short)0 |
| int | 0 |
| long | 0L |
| float | 0.0f |
| double | 0.0d |
| boolean | false |
这一特点确保了基本类型的字段一定被初始化。但这种机制并不会应用于局部变量(如在方法内部的变量),因为局部变量不是类的字段,使用前必须赋值。
方法、参数和返回值
方法最基础的部分包括方法名、参数、返回值以及方法体。方法名和参数列表共同构成了方法签名。方法签名是方法的唯一标识符。
Java中的方法只能作为类的一部分而存在。除static方法外,方法只能通过对象调用。
除基本数据类型外,一般情况下,给方法参数传递对象,实际上就是对象的引用。
当返回值的类型是void时,使用return关键字的作用是退出该方法。
编写并运行Java程序
名称可见性
为了清晰地描述库的名称,Java语言使用的方法是将互联网域名反转使用。因为域名是唯一的,所以不会产生冲突。
这种机制确保了所有文件都有其对应的命名空间,同时文件里定义的类都有唯一对应的标识符。但这种方式也会为源代码管理产生挑战。
通过空文件夹层层嵌套而形成的这种文件夹结构,其作用不只是为了对应反转的URL,通常用于保存一些表明文件夹内容的数据。
使用其他组件
Java消除了所谓的前向引用,即即使类稍后在文件中才会定义,依然可以在文件的上文中使用这个类。
import语句的作用是通知编译器导入一个指定位置的包,即放置各种类的库。
static 关键字
使用static的字段或方法不依赖于任何对象。非static的字段和方法必须基于指定的对象。不能在没有具体对象的前提下,使用static方法直接调用非static成员或方法。
编写程序
所有Java文件都会导入一个特定的库,即java.lang。里面有一些我们不用额外导入就能使用的类,如System、String等。
Java文件中必须存在一个与该文件同名的类。如果需要创建一个能独立运行的程序,文件同名的类中还要包含一个程序启动的入口方法 main() 方法。
main() 方法的参数是一个 String 对象的数组,用于获取控制台的输入。
运行程序
javac Helloworld.java # 编译,将.java文件编译成.class字节码文件
java Helloworld # 解释,自动获取路径下与类名Helloworld同名的class字节码文件,并运行其中的main方法
重学Java(二):对象无处不在的更多相关文章
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...
- 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...
- 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...
随机推荐
- Wampserver64 报错:无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。
缺少环境配置, 程序下载地址如下: https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679 点击下载,下载完成后,双击程 ...
- jQuery入口函数测试
<script src="js/jquery-1.12.4.js"></script><script> window.onload = func ...
- 线上问题排查--进程重启失败,最后发现是忘了cd
背景 我前面写了几篇文章,讲c3p0数据库连接池发生了连接泄露,但是随机出现,难以确定根因,最终呢,为了快速解决问题,我是先写了个shell脚本,脚本主要是检测服务的接口访问日志,看看过去的30s内是 ...
- AcWing 4799. 最远距离题解
请看: 我们规定,如果一个无向连通图满足去掉其中的任意一条边都会使得该图变得不连通,则称该图为有效无向连通图. 去掉一条边就不连通了,这不就是树吗? (否则如果是图(就是不是树的图)的话,一定有环,拆 ...
- zookeeper运维常用指令
zkServer.sh ./zkServer.sh start:启动zookeeper ./zkServer.sh stop:停止zookeeper ./zkServer.sh status:查看zo ...
- Codeforces 1254B1 - Send Boxes to Alice (Easy Version)
题意 有\(n(1\leq n\leq 10^5)\)个盒子,每个盒子有\(a_i(0\leq a_i \leq 1)\)个糖果,你每一次可以将第\(i\)个盒子里的糖果放到第\(i-1\)或\(i+ ...
- 最接地气的.NET微服务框架
前言: "人必有所执,方能有所成",从2018年底我就开始规划要写一个.NET微服务框架,5年了,今天终于正式发布了. 正文: Wing 致力于打造一个功能强大.最接地气的.NET ...
- 使用KRPano资源分析工具强力加密JS文件
本文地址:http://www.cnblogs.com/reachteam/p/6294767.html 软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278 ...
- PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口
QMidArea 参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...
- 【python爬虫】爬虫所需要的爬虫代理ip是什么?
前言 在进行爬虫程序开发时,经常会遇到访问被限制的网站,这时就需要使用代理 IP 来进行访问.本文将介绍代理 IP 的概念及使用方法,帮助读者更好地应对爬虫程序中的访问限制问题.同时,本文还将提供一些 ...