Java编程思想之《一切都是对象》理解

2023-10-27

前言

《Java编程思想》中提到,

Java是基于C++的,但相比之下,Java是一种"纯粹"的面向对象的程序设计语言。
Java中不再使用指针来操作内存中的元素,而是采用对象的 “引用”【这个引用是作者提出的一种为了简化概念上的理解和C++语言的引用有着一些重大差异,望读者不必过于深究。】

对象的理解

使用引用来操作对象。

Java中对一切对象的操作,都是通过对【对象的引用】的操作来实现的,而不是操作对象本身。因此有时候你就可以知道为什么声明了一个变量但是没有初始化也是可以的。【因为该S就是一个引用。并不一定需要对象需要与之关联。example: String S】;
注意: 使用引用来操作对象时候,一般来说,都是需要给引用关联一个对象。或者是说初始化。JAVA中当一个类的成员变量是基本类型【boolean char byte short int long float double 】,在没有进行初始化赋值时,系统提供一个默认值。但是局部变量未初始化时候,使用该对象时候,编译会报错。

对象的产生与存储位置

文中提到所有的对象都是由开发人员创建出来。example: String e=new String(“object”);
就通过new关键字来创建了一个对象,e是该对象的一个引用。随后我们就可以使用e来操作这个对象了。
于是我们会好奇,这个对象到底存储到计算机哪个位置了?
书中讲述了存储对象的五个位置:
1)寄存器。最快的存储区。在cpu内部你不能直接控制,而且数量机器有限。
2)堆栈。存储于RAM,速度仅次于寄存器,内部通过指针上下移动来进行内存的分配和释放。缺点:不灵活,必须直到所有项数据的确切的生命周期。以便指针上下移动。
3)堆。通用内存池位于RAM中。用于存放所有的java对象。优点:灵活,无需知道对象生命周期 缺点:对象的分配和清理时间会比较长。
4)常量存储:嵌入式系统中一般会将选择将常量 存储于ROM。
5)非RAM存储:像I/O操作的流对象、持久化对象【数据库数据】可以存放与其他媒介上。比如磁盘。
既然有这5个位置可以存放数据。但是我们的java对象具体存放至哪里呢?
程序设计人员考虑到一些经常用到的一系列类型,选择将其进行了特殊对待。这些类型也被成为基本类型。
并且这些类型的存储空间的大小是固定的。因此这也是java语言编写的程序更具有可移植性的原因之一。
基本类型 字节 包装器类型

0.boolean - Boolean

  1. char 2 Character
  2. byte 1 Byte
  3. short 2 Short
  4. int 4 Integer
  5. long 8 Long
  6. float 4 Float
  7. double 8 Double
  8. void - Void

boolean 类型所占的存储空间的大小没有定义。仅仅定义为能狗取字面值true或false;
基本类型不用new来创建变量,存储位置在堆栈中。[为了速度]
如果使用new 来创建对象,存储位置就是在堆中。

Java中提供了两个非常有用的计算的类; BigInteger 、 BigDecimal。但两者没有基本类型。
BigDecimal 可以用于精确的货币计算。【以后千万在面试计算银行货币的类型别说是double】
BigInteger 可以用于计算任意精度的整数。

对象的作用域和生命周期

和C/C++语言一样,同样是使用{ }来位置来决定对象的作用域和生命周期。
同一个域中这里不可以多次使用一样的变量名称来定义对象。
example:
{ int x=1;
{
int x=100; //报错。因为x在之前定义过。
}
}
对象和基本类型的生命周期是不一样的。
对象生命周期时间会比作用域中要长。

example:
{
String str=new String(“Hello World!”);
}
当这个作用域结束后,str 就没有了。但是 Hello World 的存储并没有释放。这里面是java中有一个垃圾回收器来进行管理。它会监听new创建的对象。并辨别那些不会再被引用的对象,随后释放这些对象的内存空间。

类概念

既然这里一切都是对象。那么决定了某一类的对象的外观和行为是什么呢?采用什么来区别对象呢?
于是就有了类型的概念。java中使用关键字class 来声明一种类型。
居然是一种类型,那么这个类应该具有哪些东西呢?我们都知道类中可以有存储数据的成员变量、可以完成特定操作或者功能的方法。所有的类无外乎就是这两个东西。我们所有的工作都是围绕类来书写。
example:

package com.chapter_02;
public class DemoClass{
	
	String name;   //存放数据变量
 //定义静态方法
	public  static void LocalVariable() {
		
		System.out.println("功能实现!");
		
	}	
	public static void main(String[] args) {
		// 调用方法
		LocalVariable();
	}
}

方法: 类中的方法是类的功能实现体,是一个类最为核心的部分。类对象的强大之处就是在类的方法之中。
关于类中方法基本使用:
方法的基本组成部分包括:名称、参数、返回值、方法体。
example:
public int MAX(int a,int b){
return a>b?a:b;
}
// 输入值是a ,b 两个形参。 输出是一个int 类型的值,也就是返回值。 方法名称是MAX. 方法体就是{ return a>b?a:b;}
如果没有返回值。则使用void。return 表示的就是返回。无返回值的情况下return可以省略。
example:
public void MAX(int a,int b){
int max= a>b?a:b;
}
引入static关键字。
static 就是静态的意思。 以上的方法是普通的方法。普通的方法的调用必须通过对象.方法名 来调用。
static 既可以加在 成员变量中也可以加在 方法中,还可以加在 类中[这里不做概述]。
static加在 成员变量名称中,该变量单独占用一份独立的空间。不会随着对象的增加存储的空间上升。
static 加在方法面前,一只想为某特定的域分配单一存储空间,无需考虑对象的多少。二希望这个方法不予和它的类的任何对象相关联。即使在没有对象的情况下,也可以使用这个方法。

example:

package com.chapter_02;


public class DataOnly {
	
	static int x;
	String name;
	public  static void LocalVariable() {
		
		System.out.println("功能实现!");
		
	}
	
	public static void main(String[] args) {
		
		LocalVariable();
		DataOnly dataOnly = new DataOnly();
		dataOnly.x=1111;
		DataOnly dataOnll = new DataOnly();
		dataOnll.x=2222; 
		System.out.println(dataOnly.x+"   "+dataOnll.x);
		

	}

}

结果如下:
功能实现!
2222 2222

分析: 两个对象操作的是同一份x ,所以对象dataOnly和dataOnll的x值是一样的。

关于编码风格和注释/嵌入式文档

编码风格

1.驼峰规范。java中类名称单词首字母都要大写,类成员变量和方法名称采用驼峰书写风格。
example:
class AllTestColor{
int testColorFirst;
void changeColor();
}

注释/嵌入式文档
注释

1.使用传统的C语言风格的注释。“ /* ” 开始 “ */ ” 结束 用于多行注释。
example:

	/*
	 * 
	 * this a demo !
	 * 
	 */

2.单行注释。 使用 “// ”. 注释后,该行就不会参与编译和运行了。
example:

//	String name;    
嵌入式文档

常用的一些标签。
1.@see: 引用其他类。
@see 标签允许用户引用其他类的文档。Javadoc会在其生成的HTML文件中,通过@see 链接到其他文档中去。但是不会检查该链接是否有效。
example:
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
2.{@link package.class#member label}
和@see 及其类似,只是它用于行内,并且使用"label"作为超链接文本。
3.{@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的显示超链接。
4.@version
@version version-information
书写版本信息
5@author
@author author-information
书写作者信息。
6@since
允许你指定程序最早使用的版本
7.@param
用于方法文档的参数的描述信息
@param parameter-name description
8.@return
用于方法文档中,来描述返回值的信息
@return description
9.@throws
@throws fully-qualified-class-name description
表述 在某个方法调用出错的时候将会抛出异常
10@Deprecated
编译器发布警告,指明一些旧特性已由新特性所取代。建议用户不要在使用这些特性。因为在不就得将来将会它们很可能会被删除。

就写这么多了,有点累了。

参考:《Java编程思想》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java编程思想之《一切都是对象》理解 的相关文章

随机推荐

  • 小知识·Git常用命令

    1 强制推送 慎用 除非你认为其他冲突等可以丢弃 或者不是很重要 git push force 2 创建文件等小命令 touch a 创建一个a文件 echo 1234 gt gt a 把1234这个内容放入a文件 cat a 打开a文件
  • el-tree树设置懒加载以及设置默认勾选

    当需要对element ui组件懒加载进行拓展功能 如添加查看更多或者其他图标进行加载 可使用下面的方法进行调整使用 加载tree树时 要求能够通过点击查看更多进行懒加载 且可进行勾选复选框获取数据 由于界面存在多个Tree树 故命名多个r
  • 5. 一线大厂高并发缓存架构实战与性能优化

    分布式缓存技术Redis 1 冷热数据分离 2 缓存设计 2 1 缓存击穿 失效 2 2 缓存穿透 2 3 缓存雪崩 3 大V直播带货导致线上商品系统崩溃原因分析 4 突发性热点缓存重建导致系统压力暴增问题 5 缓存数据库双写不一致问题 6
  • 解类魔方算法(以C和JAVA为基础)

    这是15年前 环球科学杂志上的一篇文章 作者写了一个类似简单魔方的小游戏 M12 这是游戏说明 给大家翻译一下 游戏由两个按键控制 一个是 INVERT 另一个是 MERGE INVERT 英文的意思是 反向 能将 1 2 3 4 12 排
  • vscode 解决正在下载程序包“C/C++ language components (Linux / x86_64)” 失败引起的符号找不到问题

    1 问题 vscode ssh远程查看代码时 大纲无法罗列函数列表 根本原因是远程c c 插件没有安装成功 错误信息如下 正在下载程序包 C C language components Linux x86 64 失败 正在重试 失败 正在重
  • 前台-vue3使用animate.css

    cnpm install animate css save main ts import animated from animate css app use router use animated as any mount app 页面使用
  • BES固件烧录说明

    BES固件烧录说明 准备工具 烧录前准备 烧录步骤 单线烧录 单线升级的硬件要求 单线升级的软件要求 单线升级工具界面 单线升级步骤 详细演示了BES各芯片平台固件烧录的方法 包含串口烧录和单线烧录升级 适用于目前发布的BES2300系列
  • react + ts 配置项目路劲别名(import的时候使用@符号报错)

    前言 项目开发的过程中 tsx 页面中 import 引入项目的时候 ts 文件报错 找不到模块 xxx xxx 或其相对应的类型声明 其原因主要是因为目前 ts 对 指向 src 的目录的提示是不支持的 vite默认也不支持 所以需要手动
  • 小程序优惠券内圆角

  • Java技术——Java中的static关键字解析

    0 前言 static是Java中的重要的一个点 也是面试的时候经常被问到的点 如果理解不够很容易给面试官语言基础不扎实的印象 本文从static方法 static内部类 static变量 以及static代码块四个角度分别解析static
  • NRF24L01模块----6通道通讯测试

    一 MCU与NRF24L01通讯 采用SPI通讯协议 速率最大为10M 与普通SPI元器件稍有不同的是 多了一个CE引脚 用来开启接收 发送 以及使器件进入待机模式 具体看IC DATASHEET说明 写寄存器指令格式为 1 SPI写寄存器
  • elementui 自定义loading动画加载层

    elementui 自定义loading动画加载层 main js中添加 import Loading from element ui 自定义加载层 Vue prototype openLoading function wer const
  • YOLOV8-网络结构

    代码下载链接 https download csdn net download weixin 40723264 88011324 一 整体网络 本文结合YOLOv5网络进行讲解 通过与YOLOv5网络进行比较 进一步理解YOLOv8 尽快上
  • Go语言学习笔记——jwt跨域鉴权

    文章目录 Golang jwt跨域鉴权 jwt介绍 JWT 到底是什么 JWT 和 OAuth 选择签名方法 签名方法和密钥类型 安装jwt 简单使用 生成JWT 解析jwt 测试 生成token并解析token jwt在项目中的使用 第一
  • Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解

    Java学习 时间类 Period类与Duration类 LocalDate类与Instant类 用法详解 前言 java 8 中引入的两个与日期相关的新类 Period 和 Duration 两个类看表示时间量或两个日期之间的差 两者之间
  • 交易日均千万订单的存储架构设计与实践

    一 订单系统概述 1 1 业务范围 服务业务线 快递 快运 中小件 大件 冷链 国际 B2B合同物流 CLPS 京喜 三入三出 采购入 退货入 调拨入 销售出 退供出 调拨出 等 1 2 订单中心价值 1 解耦 提升系统稳定性 原系统 交易
  • ERP现状及未来发展趋势分析?

    经过多年发展 ERP作为最重要的管理软件为国内外各类型企业所普遍接受 在我国 ERP行业已经进入成熟期 随着云计算 物联网等技术的推进 国内外竞争环境日益加剧 后ERP时代 表现出以下发展趋势 第一 商业智能化建设加强 经过多年运用 ERP
  • Linux下psql的使用(一):安装、建库、建表、数据载入、删除

    Linux下psql的使用 一 安装 建库 建表 数据载入 删除 一 Install PostgreSQL Database 安装Postgresql sudo apt get install postgresql 登录PostgreSQL
  • Java-类中代码块的使用

    Java 类中代码块的使用 1 概念 代码块 初始化块 代码块用来初始化类和对象 代码块如果有修饰的话 只能使用static 静态代码块和非静态代码块的区别 静态 内部可以有输出语句 随着类的加载而运行 初始化类的属性 一个类中定义了多个静
  • Java编程思想之《一切都是对象》理解

    前言 Java编程思想 中提到 Java是基于C 的 但相比之下 Java是一种 纯粹 的面向对象的程序设计语言 Java中不再使用指针来操作内存中的元素 而是采用对象的 引用 这个引用是作者提出的一种为了简化概念上的理解和C 语言的引用有