java基础深度学习 #1

Java白皮书关键术语

  • 简单性
  • 可移植性
  • 面向对象
  • 解释型
  • 分布式
  • 高性能
  • 健壮性
  • 多线程
  • 安全性
  • 动态性:程序运行过程中可以对自己进行修改
  • 体系结构中立:容易的在各种机器上解释执行并翻译成本地机器代码

首先,java(比如cshap)其都是由c语言进化而来的,所以一般来说,这俩语言都需要先翻译成C语言,再在不同的平台 (linux/windows)上被翻译成各自平台的内核函数再执行,因此一套代码在不同平台的编译版本是不能互通的,但是java通过初次翻译成一个中间语言实现了跨平台(不彻底的编译),不同平台需要安装各自的JRE,再去通过这个JRE翻译成各自的内核函数进行运行。这个过程是会产生性能损耗的。

java初步打包成class文件,再重新转化成c语言。(高级语言都额外加了一层翻译,因此要慢一些)

java的运行环境

SE:基础语法或基础功能函数

EE:web开发

ME:安卓开发
SDK:样例代码+使用说明

Java的生态发展始于其核心基础------Java SE(Standard Edition),它提供了基础语法和基本功能函数,由原始团队构建并持续演进。随着Java语言的成熟,开源社区和大牛开发者不断贡献代码与工具,推动了大量第三方类库的涌现,这些类库丰富了Java的功能体系,形成了强大的生态系统。

使用命令行工具

java要求文件的名字和类名完全一致

打开记事本:

bash 复制代码
public class Test{
    public static void main(String[] xxx}{
        Systom.out.println("大家好");
    }
}

编码改为CRLF,windows环境编码

然后先运行javac Test.java生成class文件

然后运行java Test执行代码输出。
java中(以及其他语言)main函数可以传递来自操作系统的参数,比如代码:

java 复制代码
 
public class Test{
    public static void main(String[] xxx}{
        for(int i=0;i<xxx.length;i++){
            System.out.println(xxx[i]);
        }
        
    }
}

操作系统是如何打开程序的

操作系统会记录主方法路径,当用户运行一个名为 XXX.exe 的可执行程序时,程序会先将自身解压(.exe实际上就是win系统可识别的一个压缩包),接着会读取一个固定的配置文件(win开发规定),从中获取关键信息,包括主函数所在的路径、支持的可识别文件拓展名以及 logo 路径等。

  • 安装阶段:很多安装程序(尤其是单文件 .exe 安装包)会解压内容,但不是所有软件都如此。
  • 启动阶段:大多数原生编译程序不会解压;但用高级语言打包成单文件的应用可能会在首次或每次启动时解压资源。

java基础(深入版) *

java变量类型及其空间占用详解

Java 是一门高级语言,但它最终运行在由 C/C++ 编写的 Java 虚拟机(JVM)之上。这意味着 Java 的所有变量,无论看起来多么抽象,最终都要依赖C语言,并映射到物理内存中的字节。而物理内存的操作,是由 CPU 和操作系统共同决定的。

现代计算机的 CPU 无法直接操作"1 位"或"半个字节"。它能读写的最小单位是 1 个字节(8 位)。这个限制来自硬件架构,也体现在 C 语言中------C 的 char 类型就是 1 字节,是最小可寻址单位。JVM 作为用 C/C++ 写成的程序,自然也继承了这一约束。所以,Java 在物理内存层面的最小操作粒度也是 1 字节(8 位)。加粗样式

Boolean:32位 *

boolean 作为作为局部变量或操作数栈中的值时,通常它会被当作 int 来处理,占用 32 位(4 字节)。这是因为 JVM 的字节码指令集(如 istore、iload)是以 32 位为基本操作单元的。用 32 位处理 boolean 可以复用整数指令,简化虚拟机设计,提升执行速度。
byte :8位,-128 - 127
short :16位 -32768 - 32767
int :32位
Long :64位
float :32位
double :64位,java的默认浮点类型
char 类型根据编码决定,默认16位两字节
bool类型的占位多少:默认32bit

现代操作系统给的存储最细粒度一般是4kb,因此就算jvm一次申请小于4kb的空间也会分配4kb(比如只申请一个int型变量),然后java底层是c,c语言最细粒度是char类型的8bit,因此java最细粒度也是8bit,这4kb java操作最小粒度是一次操作8bit。

标识符:

**Final: ***

final:
1、final修饰的基本类型不可以第二次赋值
2、final修饰的引用类型不可以第二次改变指向(意味着可以改变属性值)

java 复制代码
final List<String> list = new ArrayList<>();
list.add("Hello"); // 合法!修改的是对象内部状态
list = new ArrayList<>(); // 编译错误!不能让 list 指向另一个对象

3、final修饰的类不可以被继承

Java 标准库中的 String、Integer、Math 等类都是 final 的,原因包括:

  • 安全性:防止恶意子类篡改行为;
  • 设计意图:该类不是为扩展而设计的;
  • 性能优化:JVM 可以对 final 类的方法调用进行内联(inline)优化,因为知道不会有子类重写。
    注意:final 类仍然可以继承其他类(只要那个父类不是 final),只是自己不能再被继承。

4、final修饰的方法不可以被重写
5、final修饰的变量支持线程可见性,可以阻止一定程度上的指令重排序 *

根据 Java 内存模型(JMM) 的规定:

在构造器中正确初始化的 final 字段,在对象"安全发布"后,对所有线程都是立即可见的,无需额外的同步(如 volatile 或锁)。

这意味着:

  • 如果一个对象的 final 字段在构造函数中被赋值,
  • 并且该对象的引用没有在构造完成前"逸出"(即没有在构造器中把 this 赋给全局变量或启动线程),
  • 那么其他线程一旦看到这个对象,就能立即看到其 final 字段的正确值,不会看到"未初始化"或"部分初始化"的状态。

简单说:在对象还没有完全构造好之前,就把它的引用(this)暴露给了其他代码(比如赋值给静态变量、传给其他线程、注册监听器等),这就叫 "this 逸出"。

比如先final int value; 还没有给value初始化就让一个变量INSTANCE=this,于是读取 INSTANCE.value;结果读到了 未初始化的值 0,而不是预期的值。

JMM 禁止编译器和 CPU 对 final 字段的写入与其构造器结束之间的指令进行重排序。这保证了 final 字段的初始化一定在对象构造完成前完成。

举个例子:

java 复制代码
class FinalExample {
    final int x;
    int y;
    FinalExample() {
        x = 3; // final 字段
        y = 4; // 普通字段
    }
}

线程 A 创建对象:obj = new FinalExample();

线程 B 读取:if (obj != null) { System.out.println(obj.x); }

  • 对于 x(final):B 线程一定看到 3;
  • 对于 y(非 final):B 线程可能看到 0(默认值)或 4,取决于是否发生重排序或缓存未刷新。

因此,final 不仅是"不可变"的语义标记,更是并发安全的重要工具。它使得 immutable 对象(所有字段都是 final 且无 setter)天然线程安全。

相关推荐
csbysj20205 小时前
Django 模板
开发语言
Zaralike5 小时前
Java设计模式
java·开发语言·设计模式
一 乐5 小时前
智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
JIseven5 小时前
uniapp页面新手引导
java·前端·uni-app
liu****5 小时前
20.预处理详解
c语言·开发语言·数据结构·c++·算法
蕨蕨学AI5 小时前
【Wolfram语言】8 基本图形对象
开发语言·wolfram
froginwe116 小时前
NumPy 数组属性
开发语言
ChinaRainbowSea6 小时前
Spring Boot3 + JDK21 的迁移 超详细步骤
java·spring boot·后端·spring
ULTRA??6 小时前
moonbit关于模式匹配中的变量绑定
开发语言·c++·人工智能