Java基础——必须掌握的核心概念

>该文章的主要内容,包括 Java 基础知识、Java 程序的运行过程、变量与类型、运算细节、面向对象编程的核心概念和方法、JVM 的设计目标等。这些是我整理所学Java知识点的二次提炼,被一些网友说是八股文,确实哎!这知识点越是提炼,越是抽象。掌握这些知识后,还是得多敲代码,这些东西只是帮你更好地理解你所敲的代码,不迷茫,不要本末倒置哦!

## **Java 程序基础**

### **Java 程序的运行过程:**

1. 编译:
   Java 源代码经过编译器编译成字节码文件,该文件与平台无关。
2. 加载:
   字节码文件被 JVM 的类加载器加载到内存中。类加载器负责查找和加载类文件,并将其转换为 JVM 可以理解的格式。
3. 字节码校验:
   加载后的文件,经过 JVM 的字节码校验器进行校验,确保字节码的安全性和正确性。
4. 解释执行:
   JVM 的解释器会逐条解释字节码指令,将其转换为机器码并执行。(end)
5. 即时编译(JIT)
   为了提高性能,JVM 还提供了即时编译技术。JIT 编译器会在运行时将经常执行的代码编译成机器码,从而提高执行效率。
6. 垃圾回收
   JVM 内置了垃圾回收机制,自动管理内存,回收不再使用的对象,减少内存泄漏和其他内存管理问题。

### **程序基本结构**

1. 一个 Java 源码只能定义一个 public 类型的 class,并且 class 名称和文件名要完全一致;
2. 使用 javac 可以将 .java 源码编译成.class 字节码。

### **变量与类型(细节)**

1. Java 提供了两种变量类型:基本类型和引用类型。基本类型包括整型,浮点型,布尔型,字符型。
2. 变量可重新赋值,等号是赋值语句,不是数学意义的符号。
3. 常量在初始化后不可重新赋值,使用常量便于理解程序意图。

### **整数运算(细节)**

1. 整数运算的结果永远是精确的;
2. 运算结果会自动提升;
3. 可以强制转型,但超出范围的强制转型会得到错误的结果;
4. 应该选择合适范围的整型,没必要为了节省内存而使用 byte 和 short 进行整数运算。

### **浮点数运算(细节)**

1. 浮点数常常无法精确表示,并且浮点数的运算结果可能有误差;
2. 比较两个浮点数通常比较它们的差的绝对值是否小于一个特定值;
3. 整型和浮点型运算时,整型会自动提升为浮点型;
4. 可以将浮点型强制转为整型,但超出范围后将始终返回整型的最大值。

### **基本类型变量 vs 引用类型变量**

1. 基本类型变量存储的是对象本身的值,当变量内容发生变化时,新的值会覆盖掉之前的值,不会重新分配新的内存空间。
2. 引用类型变量类似于指针,存储的是对象的内存地址,而不是对象本身的实际值。这使得多个引用类型变量可以引用同一个对象,修改其中一个变量的内容会影响到其它引用该对象的变量。
3. 当引用类型的变量内容发生变化时,是否创建新的内存空间取决于具体的编程语言和内存管理机制。

### **数组(细节)**

1. 数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
2. 可以通过索引访问数组元素,但索引超出范围将报错;
3. 数组元素可以是值类型,或者引用类型,但数组本身是引用类型。

### **流程控制**

在 Java 程序中,JVM 默认总是顺序执行以分号结束的语句。但是,在实际的代码中,程序经常需要做出条件判断,循环。因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能。

### **”==“ 的作用**

1. 可以判断值类型是否相等。
2. 判断引用类型的变量时,指的是这两个是否指向同一个对象。如果判断对象具体内容是否相等,就需要 equals()方法。

## **面向对象基础**

### **面向对象编程**

1. 面向过程编程,是把模型分解成一步一步的过程。
2. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方法。
3. 在 OOP 中,class 和 instance 是"模板"和"实例"的关系,定义 class 就是定义了一种数据类型,对应的 instance 是这种数据类型的实例。
4. 通过 new 操作符创建新的 instance,然后用变量指向它,就可以通过变量引用这个 instance。
5. 指向 instance 的变量都是引用变量。

### **方法**

1. 方法可以让外部代码安全地访问实例字段。
2. 方法是一组执行语句,并且可以执行任意逻辑。
3. 方法内部遇到 return 时返回,void 表示不返回任何值;
4. 外部代码通过 public 方法操作实例,内部代码可以调用 private 方法。

### **构造器(构造方法)**

1. 实例在创建时通过 new 操作符调用对应的构造方法,用于初始化实例;
2. 没有定义构造方法时,编译器会自动创建一个默认的无参构造器;
3. 可定义多个构造方法,编译器根据参数自动判断;
4. 可以在一个构造器中调用另一个构造器,便于代码的复用。

### **方法重载**

1. 方法重载是指多个方法的 方法名相同,各自的参数不同,返回值类型通常相同。
2. 方法重载的目的是,功能类似的方法使用同一名字,容易记并且调用起来更简单。

### **继承**

1. 继承是面向对象编程的一种强大的代码复用方式,Java 只允许单继承,所有类最终的根类是 Object。
2. 子类无法访问父类的 private 的属性和方法;
3. 父类 protected 修饰的字段可以被子类访问,protected 关键字可以把字段和方法的访问权限控制在继承树的内部。
4. 子类的构造方法可以通过 super()调用父类的构造方法。
5. 向上转型:把子类类型安全地变为父类类型的赋值,被称为向上转型。
6. 向上转型:用 instanceof 判断一个变量所指向的实例是否是指定类型或者类型的子类,才能将该变量向下转型。
7. 两个类是 is 的关系,才叫做继承,才能 extend;如果两个类是使用的关系,has 的关系,可以将一个类的对象作为另一个类的属性。

### **多态**

1. Java 的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。
2. Java 的动态绑定机制:

- 当调用对象方法时,该方法会和该对象的实际类型(运行类型)绑定,进行使用;
- 当调用对象属性时,没有动态绑定机制,在哪里声明,就哪里使用;

3. 覆写 Object 类的方法,因为所有的 class 最终都继承自 Object,Object 定义了几个方法 toString(),equals(),hashCode(),在必要的情况下,我们可以覆写这些方法。
4. final 修饰符

- final 修饰的方法可以阻止被覆写;
- final 修饰的类可以阻止被继承;
- final 修饰的属性 必须在创建对象时初始化,随后不可修改。

#### **抽象类**
1. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰;
2. 使用了抽象方法的类,就是抽象类。但是无法实例化一个抽象类,抽象类只能被继承。
3. 面向对象编程的本质是上层代码只定义规范,不需要考虑子类的实现。

### **接口**
1. 如果一个抽象类中没有字段,所有的方法都是抽象方法,则该抽象类就是接口,改名为interface。一个类可以实现多个接口。
2. 接口也是数据类型,适用于向上转型和向下转型。

### **静态字段和静态方法**
1. 静态字段属于所有实例"共享"的字段,实际上是属于 class 这个类的字段。
2. 调用静态方法不需要实例,无法访问this,静态方法只能可以访问静态字段和其它静态方法;
3. 静态方法常用于工具类和辅助方法。  

### **包**
1. Java定义了一种名字空间,称之为包,package。一个类总是属于某个包。Java内建的package机制是为了避免class命名冲突。
2. 如果要调用其它包的class,可以使用import
3. 编译器会默认自动启动 当前包的其它class,默认启动java.lang包。

### **作用域**
1. public修饰的class,interface可以被其它任何类访问。
2. private修饰的字段和方法的访问权限限定在class内部,其它类无法访问,但是该class的嵌套类可以访问。
3. protected 作用于继承关系。定义protected的字段和方法可以被子类访问,以及子类的子类。
4. 包作用域是指一个类允许访问同一个package的类。
5. Java在方法内部定义的变量是局部变量,局部变量的作用域是从变量声明开始,到一个块结束。

## **Java核心类**

### **String类**
1. Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[] 字段实现的,但是较新的JDK是用byte[]存储的。
2. 字符串操作不改变元字符串内容,而是返回新字符串。
3. 当比较两个字符串时,必须使用equals()方法。

### **字符编码**
为了统一全球所有语言的编码,全球统一码联盟发布了Unicode编码。
UTF-8编码,是一种变长编码,用来把固定长度的Unicode编码变成变长编码。

### **StringBuilder类**
1. Java标准库提供了StringBuilder,它是可变的,可以预分配缓冲区,在新增字符时,不会创建新的临时对象,可以高效拼接字符串。
2. StringBuffer 是 StringBuilder 的线程安全版本,现在很少使用。

### **包装类**
1. 每个基本类型都有包装类,Java编译器能自动装箱和自动拆箱,在编译期间完成。
2. 所有的包装类型都是不变类,都是被final修饰的,与String一样。关于包装类型的数据进行比较,也得使用equals()方法。
3. 整数和浮点数的包装类型都继承自Number。

### **常用工具类**
1. Math:数学计算
2. Random:生成随机数


### **JVM 的设计目标**

提供一个与硬件无关的抽象计算机模型,使得 Java 程序可以在各种平台上运行。

1. 跨平台兼容性:Java 程序编译成字节码后,可以在任何安装了 JVM 的系统上运行。
2. 安全性:JVM 提供了多层次的安全机制,确保 Java 程序在执行过程中不会对系统造成危害。
3. 性能优化:通过即时编译(JIT)和垃圾回收(GC)等技术,JVM 能够在运行时优化程序性能。
4. 多线程支持:JVM 内置了对多线程的支持,使得 Java 程序可以高效地进行并发处理。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147991.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

18.2K Star,AI 高效视频监控摄像头

Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 导语 在家庭和企业安防领域,实时视频监控是保障安全的核…

2024 SNERT 预备队招新 CTF 体验赛-Web

目录 1、robots 2、NOF12 3、get_post 4、好事慢磨 5、uploads 6、rce 7、ezsql 8、RCE 1、robots robots 协议又叫爬虫协议,访问 robots.txt 继续访问 /JAY.php 拿到 flag:flag{hello_Do_YOU_KONw_JAY!} 2、NOF12 F12 和右键都被禁用 方法&#…

22、Raven2

难度 中 目标 root权限 4个flag 使用Virtualbox启动 kali 192.168.86.105 靶机 192.168.86.106 信息收集 看到111端口有一个rpc相关的东西,去网上查看了一下是什么服务 通过在网上搜索发现这是一个信息泄露的漏洞,上面的这个端口其实就是泄露的端口和…

【Spring 底层原理】手搓一个Spring框架

文章目录 准备工作Spring 框架到底在干啥?几个概念辨析注解的定义自定义核心注解配置类启动类辅助类 Spring 容器XxxAware 回调机制初始化机制前置、后置处理器完整的容器代码源码下载 最近工作接触到的知识比较底层,因此为了突破瓶颈,彻底搞…

ubuntu+MobaXterm+ssh+运行Qt(成功版)

点击上方"蓝字"关注我们 01、ubuntu连接SSH >>> 通过串口工具连接ubuntu 登录 解决连接不上的问题 检查 SSH 服务:确保目标机器上 SSH 服务已启动。你可以在目标机器上运行以下命令: sudo systemctl status ssh 如果没有运行,可以使用以下命令启动 SSH …

英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!

英特尔正稳步推进其2024年计划,备受瞩目的AI加速器Gaudi3预计将于下周震撼登场。这款被誉为英特尔AI英雄的产品,专注于处理大规模训练和推理任务,拥有无与伦比的扩展能力。面对市场对高效能半导体的旺盛需求,英特尔首席执行官帕特…

FX5 CPU模块和以太网模块的以太网通信功能

FX5 CPU模块和以太网模块的以太网通信功能的概要如下所示。 CPU模块的内置以太网端口的通信规格如下所示。 1、与MELSOFT的直接连接 不使用集线器,用1根以太网电缆直接连接以太网搭载模块与工程工具(GX Torks3)。无需设定IP地址,仅连接目标指定即可进行…

无服务器计算构建人工智能管理区块链系统

图片发自简书App 图片发自简书App 本发明属于网络版权管理技术领域,特别涉及一种以交易信息作 为唯一标准发行虚拟币的区块链系统。 背景技术 数字代币如比特币、以太坊等是区块链技术的实现方式之一,目 标是取代法定货币流通,通过“挖矿”的…

前端-js例子:收钱转账

支付宝转账 在这里用到周期定时器setInterval(function,time),设置达到目标钱数时停止定时器。 点击转账按钮时,开始函数显示。 同时要确定输入框里输入的是数字。(有一定容错) window.onloadfunction(){var btn document.que…

什么是慢充优惠话费充值api?如何选择平台

一、话费充值api的定义 话费充值api是一种能够让开发者将话费充值功能集成到自己的平台的接口。通过接入话费充值api接口,就能够实现话费充值平台的搭建,从而为用户提供话费充值服务,这一接口主要适用于对话费充值有长期稳定需求的企业或者商…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时,移除Dockershim后存在哪些疑惑? 大家好,我是秋意零。 K8s版本截止目前(24/09)已经发布到了1.31.x版本。早在K8s版本从1.24.x起(22/05),默认的容器运行时就不再是Doc…

排序-----归并排序(递归版)

核心思想:假设数组前后两部分各自有序,然后各定义两个指针,谁小谁放到新开辟的数组里面,最后把新开辟的数组赋值给原数组就完成了。要使前后两部分有序就采用递归的方式,不断往下划分块,最后一层划分为两个…

01 基础request

目录 类 WxRequest 的定义 静态属性 default 构造函数 constructor 方法 request HTTP 方法封装 创建 WxRequest 实例并导出 完整代码: 类 WxRequest 的定义 创建一个 WxRequest 类包含一个静态属性 default 和几个方法,用于处理网络请求。 静态…

【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作(超详解)

前言: 🌟🌟本期讲解多线程的知识哟~~~,希望能帮到屏幕前的你。 🌈上期博客在这里:【后端开发】JavaEE初阶—线程的理解和编程实现-CSDN博客 🌈感兴趣的小伙伴看一看小编主页:GGBondl…

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

基本概念 CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率和任务CPU占用率。 系统CPU占用率:是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系…

INIT与init_array

INIT与init array 1.so执行JNI_OnLoad之前,还会执行俩个构造函数init 和init array 在so加载时候有这个过程: .init -> .init array -> JNI_Onload -> java_com_xxx 在脱壳的过程中会在一些系统级的.so中下断点比如:fopen&#x…

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接:21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame; package com.yundait.snake;import j…

缓存的思考与总结

缓存的思考与总结 什么是缓存缓存命中率数据一致性旁路模式 Cache aside双写模式直写模式 write through异步写 Write Behind 旁路和双写 案例 新技术或中间的引入,一定是解决了亟待解决的问题或是显著提升了系统性能,并且这种改变所带来的增幅&#xff…