首页 > 编程语言 >Java基础之源

Java基础之源

时间:2024-10-16 19:09:58浏览次数:6  
标签:JRE Java 基础 跨平台 之源 JVM class 加载

目录

JDK、JRE和JVM有何区别?

JDK包含JRE,比JRE多了开发和调试的工具,比如把Java文件编译成class文件的javac,在比如一些诊断工具jmap,jconsole,jheap还有反编译工具javap

JDK是最全面的,包含了JRE和JVM以及开发工具

JRE是运行java应用程序的最小环境,他包含了JVM和Java核心类库,是包含在JRE中的lib目录下的rt.jar包中的,但JRE不包括开发工具

Java的跨平台原理是什么?

跨平台定义:跨平台指的是基于源代码的跨平台,只写一套代码,在各个平台上如Windows、Linux、unix、mac上都可以顺利运行

  • Java源程序(.java文件)要先编译成与平台无关的字节码(.class文件),然后字节码文件再解释成机器码运行(解释通过Java虚拟机来执行的)
  • 字节码文件(.class文件)不面向任何具体平台,只面向虚拟机
  • Java虚拟机时刻运行Java字节码文件的虚拟计算机,不同平台虚拟机是不同的,他们有相同的接口
  • Java语言具有一次编译,到处运行的特点,就是说编译后的字节码文件(.class文件)可以跨平台运行,前提是该平台已经安装有相应的虚拟机
  • Java的跨平台原理决定了其性能没有C/C++高

描述一下 JVM 加载 class 文件的原理机制?

Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

  类装载方式,有两种
  1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,
  2.显式装载, 通过class.forname()等方法,显式加载需要的类
  隐式加载与显式加载的区别:两者本质是一样?

 Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

 Java的类加载器有三个,对应Java的三种类:(java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 )

 Bootstrap Loader  // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
        | 
      - - ExtClassLoader   // 负责加载扩展类(就是继承类和实现类)
                      | 
                  - - AppClassLoader   // 负责加载应用类(程序员自定义的类)

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。

委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

  我们可以通过这样的代码来获取类加载器:

1
2
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。

前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

1.装载:查找和导入class文件;

2.连接:

  (1)检查:检查载入的class文件数据的正确性;

  (2)准备:为类的静态变量分配存储空间;

  (3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。

  这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

Java有什么核心优势让其成为世界上最流行的编程语言之一?

  1. 跨平台性(平台无关性)
    Java 最大的亮点之一是“一次编写,到处运行”(Write Once, Run Anywhere, WORA)。这是通过 Java 虚拟机(JVM)实现的,JVM 可以在任何安装了它的平台上运行 Java 字节码。这种跨平台能力极大地简化了程序在不同操作系统(如 Windows、Linux、macOS)上的部署和迁移工作。
  2. 面向对象编程(OOP)
    Java 是一种纯粹的面向对象语言,它支持封装、继承和多态等面向对象的特性。这些特性使得 Java 代码更加模块化、易于维护和扩展。面向对象的编程思想也促进了软件工程的发展,使得大型项目的开发更加有序和高效。
  3. 丰富的类库和框架
    Java 拥有庞大的标准库(Java SE),提供了大量的类和接口,涵盖了网络编程、数据库访问、图形用户界面开发等多个方面。此外,Java 社区还贡献了大量的第三方库和框架,如 Spring、Hibernate、MyBatis 等,这些工具和框架极大地简化了 Java 应用的开发过程。
  4. 安全性
    Java 设计时就考虑了安全性问题,提供了丰富的安全特性,如访问控制、自动内存管理(垃圾回收)、类加载器架构等。Java 应用程序运行在沙箱环境中,限制了程序对系统资源的访问,从而减少了恶意代码的危害。
  5. 高性能
    随着 JVM 的不断优化和 JIT(即时编译器)技术的引入,Java 程序的运行性能得到了显著提升。现代 JVM 能够将 Java 字节码高效地转换为本地机器码,从而在保持跨平台性的同时,提供了接近甚至超过传统编译型语言的性能。
  6. 广泛的社区支持和开源文化
    Java 拥有庞大的全球开发者社区,这些开发者通过论坛、博客、GitHub 等平台分享经验、解决问题、贡献代码。此外,Java 社区还积极推广开源文化,许多优秀的 Java 项目都是开源的,这进一步促进了 Java 技术的发展和应用。
  7. 稳定性和可靠性
    Java 在设计时就注重稳定性和可靠性,经过多年的发展和应用实践,Java 已经证明了自己在构建稳定、可靠的大型系统方面的能力。许多关键业务系统和基础设施都采用了 Java 技术,如银行系统、电子商务平台、云计算平台等。

编译和执行Java程序的命令是什么?

javac命令windows+R

javac A.java 回车 java A(A是Java文件名)输出执行结果

假设输出的是中文,会怎么样?

修改代码与输出结果,两种情况与两种结果(错误:编码GBK的不可映射字符||能编译成功,但是输出乱码)

带包名的类如何编译

package mypack;
public class A {
public static void main(String[] args) {
   System.out.println("abc");
   }
 }

标签:JRE,Java,基础,跨平台,之源,JVM,class,加载
From: https://www.cnblogs.com/yangcurry/p/18470582

相关文章

  • 初探Vue2:基础概念与实践指南
    通过记录自己在学习Vue2的过程中的实践经历,复盘项目中的技术应用,巩固Vue2的知识要点,并分享职场中的感悟和心得Vue2简介定义Vue.js,简称Vue,是一个渐进式JavaScript框架,它专注于构建用户界面,易于上手的同时,也能在复杂的应用场景中发挥强大的功能。特点Vue2的核心特点包括:响......
  • 《深入理解Java异常处理:理论与实践》
    《深入理解Java异常处理:理论与实践》引言在Java编程中,异常处理是一个非常重要的概念。它帮助开发者构建健壮、可靠的程序。本文将详细介绍Java中的异常处理机制,包括异常类的层次结构、如何捕获和处理异常,以及在编程实践中的一些最佳实践。目录异常处理的基本概念Java异常类......
  • Javascript算法——二分查找
    1.数组1.1二分查找1.搜索索引开闭matters!!![left,right]与[left,right)/***@param{number[]}nums*@param{number}target*@return{number}*/varsearch=function(nums,target){letleft=0;letright=nums.length-1;//[left,right],相等时......
  • java基础(6)抽象类和接口
    目录​编辑1.前言2.正文2.1抽象类2.1.1抽象类的概念2.1.2抽象类的语法2.1.3抽象类的特点2.1.4抽象类的作用2.2接口2.2.1接口的概念2.2.2接口的用法2.2.3接口的特点2.2.4实现多个接口2.2.5接口间的继承 2.2.6抽象类和接口的区别3.小结1.前言哈喽大家好吖,......
  • C/C++语言基础--C++异常看这一篇就够了
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言通过前面几节课,我们学习了抽象、封装、继承、多态等相关的概念,接下来我们将讲解异常,异常是专门处理错误的;这一次加了不少图标,希望大家喜欢;C语言后面也会继续更新知识点,如内联汇编;欢迎收藏+关注,本人将会持续更新......
  • Java基础语法-运算符
    运算符Java语言支持如下运算符:算术运算符:+,-,,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符:?:扩展赋值运算符:+=,-=,*=,/=//二元运算符inta=10;intb=20;intc=25;intd......
  • 前端开发 --JavaScript
    前言html种script主要包括内联script和引用外部JavaScript文件两张方式1.内联script的用法内联script指的是将JavaScript代码直接写在html文档中某个部位<!--内嵌--><script>alert(1)</script><script>windowonload=function(){vara......
  • JAVA入门必备知识点!!你入门了吗?
    目录技术能力考核——答案一、缓存中间件(一)理论部分请简述你熟悉的一种缓存中间件(如Redis)的底层数据结构,并举例说明其在实际应用中的优势。解释缓存穿透、缓存击穿和缓存雪崩的概念,并分别阐述应对这些问题的策略。在分布式系统中,如何保证缓存与数据库的数据一致性?请列......
  • java,awt,中文方框,中文乱码10/16
    今天,在学习图形化界面时,出现中文乱码。经过多种方法,总结1.在IDEA的顶部菜单栏中,选择“Run”(运行)选项。2.在下拉菜单中选择“EditConfigurations”(编辑配置)选项。3.在构建与运行中点修改选项4.添加虚拟机选项5.设置为-Dfile.encoding=gbk在重新运行就可以了。但是一开始,......
  • java_day12_Collection、List
    CollectionCollection【接口】:我们通过帮助文档发现,Collection是一个接口,不能直接new对象根据元素是否可以发生重复,继续分类-List【接口】元素可以发生重复,且有索引的概念ArrayList-Set【接口】元素不可以发生重复,没有索引借助ArrayList子类对......