Java笔试05

news2024/10/21 22:40:19

在Java中,final 关键字可以用于修饰类、方法和变量:

  1. 修饰类
    • final 修饰的类不能被继承,即不能有子类。
    • 这通常用于工具类或者不希望被扩展的类。
  1. 修饰方法
    • final 修饰的方法不能被子类覆盖。
    • 这通常用于确保类的行为不会被改变,或者在性能优化时,因为方法覆盖检查会带来一定的开销。

但是:

  1. 不能被重写(Override)final方法不能在子类中被重写。这是因为final方法的设计意图是让这个方法在继承链中不再改变,确保所有继承这个类的子类都使用同一个方法实现。
  2. 可以被重载(Overload):尽管final方法不能被重写,但它们仍然可以被重载。重载是指在同一个类中定义多个同名方法,但这些方法的参数列表必须有所不同(参数的数量、类型或顺序不同)。
  1. 修饰变量
    • final 修饰的变量是常量,一旦赋值后就不能被修改。
    • 常量名通常以大写字母开始,并使用下划线分隔单词,以提高可读性。
    • 修饰成员变量:类中被声明为 final 的成员变量必须在声明时初始化或者在构造器中初始化,之后不能被修改。
    • 修饰局部变量:方法中被声明为 final 的局部变量必须在声明时初始化或者在声明后的立即一次赋值,之后不能被修改。

privateprotected 访问修饰符,控制成员变量和方法的可见性:

  1. private
    • private 成员变量或方法只能在声明它的类内部访问。
    • private 方法不能被子类继承,子类无法访问父类的 private 方法。
    • private 变量同样不能被子类继承或访问。
    • private 修饰的成员是最不可见的。
  1. protected
    • protected 成员变量或方法可以在同一个包内的其他类以及不同包中的子类中访问。
    • protected 方法可以被子类继承,子类可以访问父类的 protected 方法。
    • protected 变量也可以被子类继承和访问。
    • protected 修饰的成员比 private 可见性高,但比 public 可见性低。

区别:

  • 可见性private 只能被同一个类访问,而 protected 可以被同一个包内的类以及所有子类访问。
  • 继承private 成员和方法不参与继承,而 protected 成员和方法会被子类继承。
  • 封装private 提供了最强的封装,因为它完全限制了外部访问。protected 则在封装和灵活性之间提供了一个折中。

在Java中,限定符通常指的是访问修饰符,它们控制成员的可见性。访问修饰符包括 publicprivateprotected 以及包级私有(没有修饰符)。

abstract:是一个非访问修饰符,它用于声明抽象类和抽象方法。抽象类不能被实例化,抽象方法没有具体的实现,必须由子类提供实现。

在Java中,“短路”(short-circuit)求值是指在布尔表达式中,如果表达式的结果已经可以确定,那么就不会对表达式的其他部分进行求值。这通常发生在逻辑运算中,特别是使用逻辑AND(&&)和逻辑OR(||)操作符时。

Java的基本数据类型及其占用的内存空间如下:

  1. byte:8位,占用1个字节。
  2. short:16位,占用2个字节。
  3. int:32位,占用4个字节。
  4. long:64位,占用8个字节。
  5. float:32位,占用4个字节。
  6. double:64位,占用8个字节。
  7. char:16位,占用2个字节。
  8. boolean:在Java虚拟机中没有定义其大小,但通常在数组中占用1个字节,在其他情况下占用4个字节。

Java中的多态性是面向对象编程(OOP)的一个核心概念。多态性使得同一个方法调用可以对不同的对象有不同的行为。

  1. 方法重载(Overloading)
    • 同一个类中可以有多个同名方法,但参数列表必须不同(参数的类型、数量或顺序不同)。
    • 编译器根据方法调用时提供的参数列表来决定具体调用哪个方法。
  1. 方法覆盖(Overriding)
    • 子类可以覆盖(Override)父类中的方法,即子类提供了一个与父类方法同名、同参数列表的方法。
    • 运行时多态性:在运行时,根据对象的实际类型来调用相应的方法。即使通过父类的引用调用该方法,如果对象是子类的实例,也会调用子类中覆盖的方法。
  1. 接口实现(Interface Implementation)
    • 一个类可以实现一个或多个接口,接口中的方法在实现类中必须被具体实现。
    • 可以通过接口类型的引用调用实现类中的方法,实现多态性。
  1. 抽象类和抽象方法
    • 抽象类是不能实例化的类,它包含一个或多个抽象方法,这些方法没有具体的实现。
    • 子类继承抽象类时,必须提供抽象方法的具体实现,除非子类也是抽象的。
  1. 泛型(Generics)
    • 从Java 5开始引入,允许在类、接口和方法中使用类型参数,以支持泛型编程。
    • 泛型提供了一种方式来编写与类型无关的代码,可以提高代码的复用性和类型安全性。

抽象类:

抽象类可以包含没有具体实现的方法(抽象方法),也可以包含有具体实现的方法(非抽象方法)。
抽象类不能直接实例化,因为可能包含没有实现的方法。
如果子类不是抽象类,那么它必须实现父类中的所有抽象方法。如果一个抽象类的子类本身也是抽象类,那么它不需要实现父抽象类中的所有抽象方法。抽象类可以包含抽象方法,这些方法可以由更具体的子类来实现。如果子类也是抽象的,它可以推迟实现这些方法,直到有一个非抽象的子类出现。
抽象类可以实现一个或多个接口,并且必须提供接口中所有方法的实现,除非抽象类本身也是抽象的。

String 对象一旦创建,其内容就不能被改变。每次对 String 对象进行修改操作时,实际上都会生成一个新的 String 对象。而 StringBuilder 对象的内容可以被修改,这使得它在频繁修改字符串内容的场景下更加高效。

String 类和 StringBuilder 类都可以使用 + 运算符和 append() 方法进行字符串连接。不过,String 使用 + 运算符连接字符串时,每次连接都会生成新的 String 对象,而 StringBuilder 使用 append() 方法连接字符串时,是在原有对象上进行修改。

在Java中,即使使用 StringBuilderStringBuffer 类型的对象,使用 + 号连接字符串时,Java编译器会将这个操作转换为使用 StringBuilderappend() 方法的调用来执行连接。这个过程实际上是创建了一个新的 StringBuilder 对象,然后在其上调用 append() 方法,最后通过 toString() 方法将结果转换为一个新的 String 对象。这意味着每次使用 + 连接操作时,都会生成一系列临时的 StringBuilder 对象和新的 String 对象。

(是+String,不是两个StringBuilder + )
StringBuilderStringBuffer的区别

  1. 线程安全性
    • StringBuffer 是线程安全的。这意味着它的所有操作都是同步的,可以在多线程环境中使用而不会出现问题。
    • StringBuilder 是非线程安全的。它的操作不是同步的,因此在单线程环境中性能更好,但在多线程环境中可能会遇到线程安全问题。
  1. 性能
    • 由于 StringBuilder 不需要进行线程同步,所以在单线程环境中,它通常比 StringBuffer 有更好的性能。
    • StringBuffer 由于需要进行线程同步,所以在性能上可能会稍逊于 StringBuilder
  1. 使用场景
    • 如果你的代码在单线程环境中运行,并且需要频繁地修改字符串,那么 StringBuilder 是更好的选择,因为它提供了更好的性能。
    • 如果你的代码在多线程环境中运行,并且需要频繁地修改字符串,那么 StringBuffer 是更好的选择,因为它是线程安全的。
  1. API
    • StringBuilderStringBuffer 都提供了类似的API,包括 append()insert()delete()replace() 等方法,用于操作字符串。
  1. 默认构造方法
    • StringBuilder 的默认构造方法创建的是一个空的字符串缓冲区。
    • StringBuffer 的默认构造方法同样创建的是一个空的字符串缓冲区。
  1. 继承关系
    • StringBuilder 继承自 AbstractStringBuilder 类。
    • StringBuffer 也继承自 AbstractStringBuilder 类。

创建新线程:

继承Thread类并重写run()方法。
通过创建一个继承自 Thread 类的子类,并重写 run() 方法,然后创建该子类的实例并调用其 start() 方法,可以创建并启动一个新线程。

实现Runnable接口并实现run()方法。
通过创建一个实现了 Runnable 接口的类,并实现 run() 方法,然后将该类的实例传递给 Thread 类的构造函数,再调用新 Thread 实例的 start() 方法,可以创建并启动一个新线程。

使用Executor框架。
Executor 框架是Java并发API的一部分,它提供了一种管理线程池和执行异步任务的方法。通过使用 Executors 类的工厂方法创建一个线程池,然后使用 execute 方法提交一个实现了 Runnable 接口的对象,可以创建并启动新线程。

使用Callable和Future接口。
CallableFuture 接口与 Executor 框架一起使用,可以创建新线程。CallableRunnable 类似,但它可以返回一个结果和抛出异常。通过使用 Executors 类创建一个线程池,然后使用 submit 方法提交一个实现了 Callable 接口的对象,可以创建并启动新线程。Future 接口用于获取异步执行的结果。
 

Stack 是一种后进先出(LIFO)的数据结构。

LinkedList 实现了 List 接口,但它也提供了 addoffer 等方法来实现队列的行为。

PriorityQueue 是一种优先队列,元素的出队顺序是根据元素的优先级来决定的,而不是按照先进先出的顺序。

ArrayDeque 是双端队列,但它也提供了标准的队列操作,如 addFirstaddLastpollFirstpollLast 等,可以用来实现标准的先进先出队列。

Java中的构造器:

  1. 初始化对象:构造器的主要目的是在创建新对象时初始化对象的状态。它允许程序员为对象的属性设置初始值。
  2. 分配资源:构造器可以在对象创建时分配必要的资源,比如打开文件、网络连接或数据库连接。
  3. 执行验证:构造器可以包含逻辑来验证对象的状态是否有效。如果传入的参数不满足某些条件,构造器可以抛出异常。
  4. 控制对象的创建:通过构造器,可以控制对象的创建过程。例如,可以通过构造器中的逻辑来决定是否应该创建一个新的对象实例。
  5. 提供不同的构造方式:一个类可以有多个构造器,每个构造器可以有不同的参数列表,这样可以提供多种方式来创建和初始化对象。
  6. 继承和多态:在继承中,子类的构造器会调用父类的构造器来确保父类属性的正确初始化。同时,构造器也可以体现出多态性,即通过父类引用可以创建不同类型的子类对象。
  7. 封装:构造器有助于封装对象的创建细节,用户不需要知道对象是如何被创建和初始化的,只需要知道如何使用对象。
  8. 避免对象状态不一致:通过在构造器中设置对象的初始状态,可以避免对象在创建后立即处于不一致状态。
  9. 实现设计模式:某些设计模式,如单例模式(Singleton),可能会利用构造器的特性来控制对象的创建。
public class Person {
    // 类的属性
    private String name;
    private int age;

    // 构造器
    public Person(String name, int age) {
        this.name = name; // 使用this关键字来区分成员变量和参数
        this.age = age;
    }

    // Getter和Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

transient修饰符用于声明一个变量不需要被序列化。

finaltransient修饰符不能同时用于同一个变量。因为final变量的值是固定的,所以它不需要序列化,因为序列化是为了在反序列化时恢复对象的状态,而final变量的状态是不可变的。因此,同时使用finaltransient修饰符是不合理的。

序列化(Serialization)和反序列化(Deserialization)是编程中的两个重要概念,尤其在对象持久化和网络传输中非常常见。这两个过程涉及到将对象的状态转换为可以存储或传输的格式,以及将这种格式转换回对象状态的过程。

序列化(Serialization)

序列化是指将对象的状态信息转换为可以存储在文件中或通过网络传输的格式(如JSON、XML或二进制格式)的过程。序列化通常用于以下场景:

  1. 持久化:将对象的状态保存到文件或数据库中,以便在程序下次运行时可以恢复对象的状态。
  2. 网络传输:在网络上发送对象时,需要将对象转换为可以在网络上传输的格式。由于网络传输只能处理字节流,因此需要将对象序列化为字节流。

反序列化(Deserialization)

反序列化是序列化的逆过程,它是指将序列化后的格式(如文件中的JSON、XML或二进制数据)转换回对象状态的过程。反序列化用于以下场景:

  1. 从持久化状态恢复对象:当从文件或数据库中读取序列化的对象数据时,需要将这些数据反序列化为对象,以便可以在程序中使用。
  2. 接收网络传输的对象:当从网络接收到序列化的对象数据时,需要将这些数据反序列化为对象,以便可以在本地环境中使用。

序列化和反序列化的目的

序列化和反序列化的目的是为了在不同的环境和时间点之间保持对象的状态。例如,如果你有一个复杂的对象,并且希望在用户会话之间保持该对象的状态,你可以将对象序列化并存储在数据库中。当用户再次访问系统时,你可以从数据库中读取序列化的数据并反序列化回对象,从而恢复对象的状态。

这个过程可以总结为:

  1. 序列化:对象 → 可存储/传输的格式
  2. 反序列化:可存储/传输的格式 → 对象

队列(Queue)是一种先进先出(FIFO, First-In-First-Out)的数据结构,而栈(Stack)是一种先进后出(LIFO, Last-In-First-Out)的数据结构。

先进先出(FIFO)的队列:

  1. 数组队列:使用数组实现的队列,元素从队列的一端添加,从另一端移除。
  2. 链表队列:使用链表实现的队列,元素同样从一端添加,从另一端移除。
  3. 循环队列:一种优化的数组队列,使用模运算来处理数组的循环使用。
  4. 优先队列(或堆):虽然通常不是严格意义上的FIFO,但可以按照元素的优先级进行出队操作。
  5. 双端队列(Deque):虽然双端队列允许从两端进行插入和删除操作,但它仍然可以以FIFO的方式工作。

先进后出(LIFO)的栈:

  1. 数组栈:使用数组实现的栈,元素从栈顶添加和移除。
  2. 链表栈:使用链表实现的栈,元素同样从栈顶添加和移除。
  3. 表达式栈:用于解析和计算表达式的栈,通常以LIFO的方式工作。
  4. 调用栈:在程序执行过程中,用于存储函数调用的栈,当函数返回时,最后一个调用的函数首先被移除。

其他类型的队列:

  1. 后进先出(LIFO)队列:虽然不是标准的队列,但可以通过栈实现这种类型的队列。
  2. 广度优先搜索队列:在图算法中使用,通常以FIFO的方式工作,但也可以用于实现其他类型的队列。
  3. 消息队列:在分布式系统中使用,可以有多种行为,包括FIFO和非FIFO。


文件系统是计算机操作系统中用于管理文件存储和访问的系统。它定义了数据在存储介质(如硬盘、固态硬盘、USB驱动器等)上的组织方式。

  1. 扇区(Sector)
    • 扇区是磁盘存储的最小物理单位。
    • 磁盘被划分为许多同心圆,每个同心圆被进一步划分为扇区。
    • 每个扇区通常包含512字节或4096字节(随着技术的发展,扇区大小也在增加)。
    • 扇区是读写磁盘数据的最小单位。
  1. 页面(Page)
    • 页面通常是指内存管理中的单位。
    • 在虚拟内存系统中,页面是内存被划分的固定大小的块。
    • 操作系统使用页面来管理内存,将数据从磁盘交换到RAM,或从RAM交换到磁盘。
    • 页面的大小通常为4KB。
  1. 簇(Cluster/Allocation Unit/Disk Block)
    • 簇是文件系统在磁盘上分配空间的最小单位。
    • 文件系统将磁盘分成许多簇,每个簇可以包含一个或多个扇区。
    • 簇的大小可以是512字节、4KB、8KB等,取决于文件系统和磁盘的配置。
    • 文件和目录存储在这些簇中,但它们的大小必须适应簇的大小,因此可能会有空间浪费。
  1. 文件(File)
    • 文件是文件系统中存储数据的对象。
    • 文件由元数据(如文件名、大小、创建时间等)和数据组成。
    • 文件可以跨多个簇存储,文件系统会跟踪文件占用的所有簇。

这些组件之间的关系和结构如下:

  • 磁盘:磁盘被划分为许多扇区。
  • :文件系统将扇区组合成簇,簇是文件存储分配的最小单位。
  • 文件:文件存储在簇中,一个文件可能占用一个或多个簇。
  • 页面:虽然页面主要与内存管理相关,但操作系统可以使用页面大小来优化文件的读写操作,例如,将文件数据读入内存时,可能会以页面大小为单位进行。

磁盘(特别是传统机械硬盘,HDD)通常是圆的。硬盘内部有一个或多个旋转的磁盘(盘片),这些磁盘是圆形的。每个磁盘的表面被划分为许多同心圆,这些同心圆被称为磁道。磁道被进一步划分为扇区,扇区是磁盘上用于存储数据的最小物理单位。

磁盘的结构:

  1. 盘片:硬盘内部的圆形磁盘,通常由金属(如铝)或玻璃制成,并涂有磁性材料。
  2. 磁头:硬盘上用于读取和写入数据的部件,磁头悬浮在磁盘表面之上,非常接近但不接触磁盘。
  3. 读写臂:控制磁头移动的机械臂,可以将磁头移动到磁盘上的不同磁道上。
  4. 电机:驱动磁盘旋转的电机。
  5. 缓存:硬盘内部的小型快速存储器,用于临时存储数据。
  6. 控制电路:管理硬盘操作的电子电路。

磁盘的工作原理:

当硬盘接收到读写请求时,读写臂会移动磁头到指定的磁道上,然后磁盘旋转,将所需的扇区带到磁头下方进行读取或写入操作。

固态硬盘(SSD):

与机械硬盘不同,固态硬盘没有旋转的磁盘和移动的磁头。SSD使用闪存芯片来存储数据,这些芯片可以是NAND类型。SSD的存储介质是固态的,因此它们没有物理移动部件,这使得SSD在读写速度、耐用性和功耗方面通常优于传统机械硬盘。

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

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

相关文章

Yolo目标检测:实时性与准确性的完美结合

在目标检测领域,Yolo(You Only Look Once)算法无疑是一颗璀璨的明星。自2016年由Joseph Redmon等人提出以来,Yolo凭借其出色的实时性和准确性,迅速在多个应用场景中崭露头角。本文将详细介绍Yolo目标检测的基本原理、优…

Qt学习笔记第21到30讲

第21讲 new/delete关键字 new关键字 在 C 中, new 关键字用于动态分配内存。它是 C 中处理动态内存分配的主要工具之一,允许在程序运行时根据需要分配内存。 用法 ①分配单个对象:使用 new 可以在堆上动态分配一个对象。例如&#xf…

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

JavaWeb 22.Node.js_简介和安装

有时候,后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式: 在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时,出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意: 03. 匿名函数之函数表达式 函数:匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量: index:含义:它表示 Series 对象的索引,也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中,如果不加锁,可能会导致以下问题: 数据不一致:多个线程同时访问和修改共享资源时,如果没有加锁,可能会导致数据竞争,即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM(Parent POM)2.…

算法的学习笔记—丑数(牛客JZ49)

😀前言 在程序设计和算法竞赛中,丑数问题是一个经典的动态规划题目。丑数(Ugly Number)定义为只包含质因子 2、3 和 5 的数。举例来说,数字 6(因子为 2 和 3)、数字 8(因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人,是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上,如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题,以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中,玩家需设法吸引顾客消费。同时,还需投入时间和资源修复遗址,过程中或会遇到技术、资金及文化保护等挑战,增添游戏趣味与深度。 修改器地址: https://downf…

力扣——链表的中间结点(链表)C语言

题目: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 返回中间3这个结点; 返回中4这个结点; 原理: 思路1:利用遍历链表,统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然,这里所说的深入,并不是指长篇大论,而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前,我们先来了解一个问题:为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…