Java基础-1

Java基础-1 Java基础转载https://github.com/Snailclimb/JavaGuideJava SE vs Java EEJava SEJava Platform, Standard Edition: Java 平台标准版包含支持 Java 应用程序开发和运行的核心类库以及虚拟机等核心组件**Java SE 可以用于构建桌面应用程序或简单的服务器应用程序** Java EEJava Platform, Enterprise EditionJava 平台企业版 Java SE 的基础上包含了支持企业级应用程序开发和部署的标准和规范比如 Servlet、JSP、EJB、JDBC、JPA、JTA、JavaMail、JMS**Java EE 可以用于构建分布式、可移植、健壮、可伸缩和安全的服务端 Java 应用程序例如 Web 应用程序** Java MEJava PlatformMicro EditionJava ME 是 Java 的微型版本主要用于开发嵌入式消费电子设备的应用程序例如手机、PDA、机顶盒、冰箱、空调等JVM vs JDK vs JREJVMJava Virtual Machine, Java 虚拟机 运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现WindowsLinuxmacOS目的是使用相同的字节码它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译随处可以运行” JDKJava Development KitJava 开发工具包供开发者使用用于创建和编译 Java 程序。它包含了 JRE以及编译器 javac 和其他工具如 javadoc文档生成器、jdb调试器、jconsole监控工具、javap反编译工具等 JREJava Runtime Environment只包含运行 Java 程序所需的环境和类库图JVM图JDK、JRE 和 JVM 的关系什么是字节码?采用字节码的好处是什么?我们需要格外注意的是 .class-机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件然后通过解释器逐行解释执行这种方式的执行速度会相对比较慢。而且有些方法和代码块是经常需要被调用的(也就是所谓的热点代码)所以后面引进了 JITJust in Time Compilation 编译器而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后其会将字节码对应的机器码保存下来下次可以直接使用。而我们知道机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。Oracle JDK vs OpenJDK非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建只添加了几个部分例如部署代码其中包括 Oracle 的 Java 插件和 Java WebStart 的实现以及一些闭源的第三方组件如图形光栅化器一些开源的第三方组件如 Rhino以及一些零碎的东西如附加文档或第三方字体。展望未来我们的目的是开源 Oracle JDK 的所有部分除了我们考虑商业功能的部分 OpenJDK 是开源的开源意味着你可以对它根据你自己的需要进行修改、优化比如 Alibaba 基于 OpenJDK 开发了 Dragonwell8https://github.com/alibaba/dragonwell8 OpenJDK 是商业免费的这也是为什么通过 yum 包管理器上默认安装的 JDK 是 OpenJDK 而不是 Oracle JDK。虽然 Oracle JDK 也是商业免费比如 JDK 8但并不是所有版本都是免费的。 OpenJDK 更新频率更快。Oracle JDK 一般是每 6 个月发布一个新版本而 OpenJDK 一般是每 3 个月发布一个新版本。现在你知道为啥 Oracle JDK 更稳定了吧先在 OpenJDK 试试水把大部分问题都解决掉了才在 Oracle JDK 上发布Java 和 C 的区别?Java 和 C 都是面向对象的语言都支持封装、继承和多态但是它们还是有挺多不相同的地方 Java 不提供指针来直接访问内存程序内存更加安全 Java 的类是单继承的C 支持多重继承虽然 Java 的类不可以多继承但是接口可以多继承。 Java 有自动内存管理垃圾回收机制(GC)不需要程序员手动释放无用内存。 C 同时支持方法重载和操作符重载但是 Java 只支持方法重载操作符重载增加了复杂性这与 Java 最初的设计思想不符。标识符和关键字的区别是什么在我们编写程序的时候需要大量地为程序、类、变量、方法等取名字于是就有了 标识符 。简单来说 标识符就是一个名字 。 有一些标识符Java 语言已经赋予了其特殊的含义只能用于特定的地方这些特殊的标识符就是 关键字 。简单来说关键字是被赋予特殊含义的标识符 。比如在我们的日常生活中如果我们想要开一家店则要给这个店起一个名字起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”因为“警察局”这个名字已经被赋予了特殊的含义而“警察局”就是我们日常生活中的关键字。Java 语言关键字有哪些Tips所有的关键字都是小写的在 IDE 中会以特殊颜色显示。 default 这个关键字很特殊既属于程序控制也属于类方法和变量修饰符还属于访问控制。 在程序控制中当在 switch 中匹配不到任何情况时可以使用 default 来编写默认匹配的情况。 在类方法和变量修饰符中从 JDK8 开始引入了默认方法可以使用 default 关键字来定义一个方法的默认实现 在访问控制中如果一个方法前没有任何修饰符则默认会有一个修饰符 default但是这个修饰符加上了就会报错。⚠️ 注意虽然 true, false, 和 null 看起来像关键字但实际上他们是字面值同时你也不可以作为标识符来使用。自增自减运算符前缀形式例如 a 或 --a先自增/自减变量的值然后再使用该变量例如b a 先将 a 增加 1然后把增加后的值赋给 b。 后缀形式例如 a 或 a--先使用变量的当前值然后再自增/自减变量的值。例如b a 先将 a 的当前值赋给 b然后再将 a 增加 1。 为了方便记忆可以使用下面的口诀符号在前就先加/减符号在后就后加/减答案a 11 、b 9 、 c 10 、 d 10 、 e 10。移位运算符移位运算符是最基本的运算符之一几乎每种编程语言都包含这一运算符。移位操作中被操作的数据被视为二进制数移位就是将其向左或向右移动若干位的运算。 移位运算符在各种框架以及 JDK 自身的源码中使用还是挺广泛的HashMapJDK1.8 中的 hash 方法的源码就用到了移位运算符staticfinalinthash(Objectkey){inth;// key.hashCode()返回散列值也就是hashcode// ^按位异或// :无符号右移忽略符号位空位都以0补齐return(keynull)?0:(hkey.hashCode())^(h16);}重载和重写有什么区别重载就是同样的一个方法能够根据输入数据的不同做出不同的处理 重写就是当子类继承自父类的相同方法输入数据一样但要做出有别于父类的响应时你就要覆盖父类方法什么是可变长参数允许在调用方法时传入不定长度的参数。就比如下面这个方法就可以接受 0 个或者多个参数。可变参数只能作为函数的最后一个参数 遇到方法重载的情况怎么办呢会优先匹配固定参数还是可变参数的方法呢答案是会优先匹配固定参数的方法因为固定参数的方法匹配度更高。publicstaticvoidmethod2(Stringarg1,String...args){//......}