前言

本系列文章内容来自于《Thinking in Java》作者的最新续作《On Java》基础卷,作者根据最新 Java 8、11、17的内容,重讲了Java的编程思想,值得初学者阅读。

操作对象

Java将一切都视为对象,但实际操作的其实是该对象的引用,再由引用来修改对象信息。

一种安全的做法是,始终在创建引用时就进行初始化

String s; 
String s = "asdf";

首行代码中,创建了一个引用,但这个引用还没有连接对象,直接使用起来会有问题。

第二行代码可以看到,字符串可以用带引号的文本进行初始化。

创建对象

引用的作用是关联对象。通常使用 new 关键字来创建对象。

数据存储方式

  1. 寄存器。这是最快的存储方式,因为数据会直接保存在CPU中,但是程序员无法直接控制寄存器的分配,因为寄存器数量是有限的。

  2. 栈(Stack)。数据保存在随机顺序存储器(RAM)中,处理器通过栈指针操作数据,在效率上仅次于寄存器。在栈上的所有对象都要明确其生命周期,灵活性上稍有限制。对象引用保存在栈中。

  3. 堆(Heap)。数据也保存在 RAM 中,用于存储所有 Java 对象。编译器不关心位于堆上的对象存在多久,使用较为灵活。但分配和清理堆存储时花费时间略高于栈。

  4. 常量存储区。

  5. 非 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(二):对象无处不在的更多相关文章

  1. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  2. 重学 Java 设计模式:实战单例模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...

  3. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  4. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

  5. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  6. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  7. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  8. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

  9. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...

  10. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...

随机推荐

  1. 2021-7-11 Vue的自定义指令简单实例

    获取焦点简单实例,用Vue.directive(ps:指令)定义,命名不要是关键字,用v-加自定义指令名称调用,而内部用钩子函数inserted来实现 <!DOCTYPE html> &l ...

  2. Go 语言 select 都能做什么?

    原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作. 通过 select 语句,我们可以同时监听多个 ch ...

  3. 一文了解react中定义样式(css/less/sass)的常用方法

    react中通过jsx的语法方式,将html标签和js语法联系在一起,而css的编写方式,没有明确的指定编写方式,目前就有很多不同方法,每个方式各有其优缺点,我们一起来看看常用的定义方式有哪些. 最基 ...

  4. Programming abstractions in C阅读笔记:p91-p106

    <Programming Abstractions In C>学习第45天,p91-p102,完成第二章内容学习.总结如下: 一.技术总结 1.垃圾回收 p91,"Some la ...

  5. Hybird 技术讨论:热更新原理解析

    原生应用 VS 混合应用 大家对于原生应用和混合应用已经非常熟悉了,这里就不再进行详细的介绍,用通俗易懂的话解释下他们的一些特点.   1.原生应用 在 Android.iOS 等移动平台上利用提供的 ...

  6. 12、Spring之基于xml的AOP

    阅读本文前,建议先阅读Spring之基于注解的AOP 12.1.环境搭建 创建名为spring_aop_xml的新module,过程参考9.1节 12.1.1.配置打包方式和依赖 <?xml v ...

  7. 四层负载均衡的NAT模型与DR模型推导

    导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理.通过本文可以了解到四层负载均衡的技术特点.NAT模型和DR模型的工作原理.以及NAT模 ...

  8. Vue源码学习(二):<templete>渲染第一步,模板解析

    好家伙, 1.<template>去哪了 在正式内容之前,我们来思考一个问题, 当我们使用vue开发页面时,<tamplete>中的内容是如何变成我们网页中的内容的? 它会经历 ...

  9. 第2章 Git安装

    兄弟,恭喜你,刷到这篇超详细安装GIt教程,就让Codeyang带你一步一步的安装Git!~~ Git官网地址: https://git-scm.com/ 查看 GNU 协议,可以直接点击下一步. 选 ...

  10. .NET C#基础(9):资源释放 - 需要介入的资源管理

    1. 什么是IDisposable?   IDisposable接口是一个用于约定可进行释放资源操作的接口,一个类实现该接口则意味着可以使用接口约定的方法Dispose来释放资源.其定义如下: pub ...