什么是Java

Java是一门面向对象的高级编程语言,不仅吸收了C++语言的各种优点,比如继承了C++语言面向对象的
技术核心。还摒弃了C++里难以理解的多继承、指针等概念,,同时也增加了垃圾回收机制,释放掉不
被使用的内存空间,解决了管理内存空间的烦恼。

因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地
实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

Java的特点有哪些

Java 语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安
全性等很多特点,下面针对这些特点进行逐一介绍。

面向对象

Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支
持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发
程序,需要采用面向对象的思想设计程序和编写代码。

平台无关性

平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,
因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入
虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。

Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需生成虚拟机
上的目标代码,就可以在多种平台上不加修改地运行。

简单性

Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了
很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回
收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。

解释执行

Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运
行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运
行环境中。

多线程

Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持
多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方
法就写在 run() 方法体内。

分布式

Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提
供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式
应用的重要手段。

健壮性

Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的
一大进步。另外,Java 的异常机制也是健壮性的一大体现。

高性能

Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度
也越来越高。

安全性

Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言
具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以
防替代本地的同名类,并包含安全管理机制。

Java 语言的众多特性使其在众多的编程语言中占有较大的市场份额,Java 语言对对象的支持和强大的
API 使得编程工作变得更加容易和快捷,大大降低了程序的开发成本。Java 的“一次编写,到处执行”正是
它吸引众多商家和编程人员的一大优势。

JDK、JRE、JVM

JDK

JDK(Java SE Development Kit), Java标准的开发包,提供了编译、运行Java程序所需要的各种工具
和资源,包括了Java编译器、Java运行时环境、以及常用的Java类库等。

JRE

JRE(Java Runtime Environment) ,Java运行时环境,用于解释执行Java的字节码文件。普通用户只
需要安装JRE来运行Java程序即可,而作为一名程序员必须安装JDK,来编译、调试程序。

JVM

JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。 它是整个Java实现跨平台的核心 ,负责
解释执行字节码文件,是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的
接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。也就是说
JVM是运行Java字节码的虚拟机。

不同平台的JVM是不同的,但是他们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不
同平台实现了相同的虚拟机,编译后的Java字节码就可以在该平台上运行。

为什么要采用字节码

在 Java 中,JVM 可以理解的代码就叫做字节码 (即Java源代码经过虚拟机编译器编译后扩展名为
.class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,
在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无
须重新编译便可在多种不同操作系统的计算机上运行。

什么是跨平台

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟
机,该系统就可以运行java程序。

总结

  1. JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
  2. JDk包含JRE,JDK 和 JRE 中都包含 JVM。
  3. JVM 是 Java 编程语言的核心并且具有平台独立性。

Oracle JDK、OpenJDK

  • Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
  • OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全

开源的;

  • Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的

类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了
彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的
问题,但是,只需切换到Oracle JDK就可以解决问题;

  • 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
  • Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来

获取最新版本;

  • Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

Java有哪些数据类型

Java 中有 8 种基本数据类型,分别为:
6 种数字类型 (四个整数形,两个浮点型) :byte、short、int、long、float、double
1 种字符类型 :char
1 种布尔型 :boolean

byte

byte 数据类型是 8 位、有符号的,以二进制补码表示的整数;
最小值是 -128(-2^7) ;
最大值是 127 (2^7-1) ;
默认值是 0 ;
byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四
分之一;
例子:byte a = 100,byte b = -50

short

short 数据类型是 16 位、有符号的以二进制补码表示的整数
最小值是 -32768(-2^15) ;
最大值是 32767 (2^15 - 1) ;
Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
默认值是 0 ;
例子:short s = 1000,short r = -20000

int

int 数据类型是 32 位、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31) ;
最大值是 2,147,483,647(2^31 - 1) ;
一般地整型变量默认为 int 类型;
默认值是 0

long

注意:Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析
long 数据类型是 64 位、有符号的以二进制补码表示的整数;
最小值是 -9,223,372,036,854,775,808(-2^63) ;
最大值是 9,223,372,036,854,775,807(2^63 -1) ;
这种类型主要使用在需要比较大整数的系统上;
默认值是 0L ;
例子: long a = 100000L,Long b = -200000L。
“L”理论上不分大小写,但是若写成”l”容易与数字”1”混淆,不容易分辩。所以最好大写

float

float 数据类型是单精度、 32 位、符合IEEE 754标准的浮点数;
float 在储存大型浮点数组的时候可节省内存空间;
默认值是 0.0f ;
浮点数不能用来表示精确的值,如货币;
例子:float f1 = 234.5f

double

double 数据类型是双精度、 64 位、符合IEEE 754标准的浮点数;
浮点数的默认类型为double类型;
double类型同样不能表示精确的值,如货币;
默认值是 0.0d ;
例子:double d1 = 123.4

char

char类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000 (即为 0 );
最大值是 \uffff (即为 65535 );
char 数据类型可以储存任何字符;
例子:char letter = ‘A’;( 单引号 )

boolean

boolean数据类型表示一位的信息;
只有两个取值:true 和 false;
这种类型只作为一种标志来记录 true/false 情况;
默认值是 false ;
例子:boolean one = true

包装类型

这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、
Character、Boolean

image.png

Java中引用数据类型有哪些,它们与基本数据类型有什么区别?

引用数据类型分 3 种:类,接口,数组;简单来说,只要不是基本数据类型.都是引用数据类型。 那他们有什么不同呢?

从概念方面来说

  1. 基本数据类型:变量名指向具体的数值
  2. 引用数据类型:变量名不是指向具体的数值,而是指向存数据的内存地址,.也就是hash值

    从内存的构建方面

  3. 基本数据类型:被创建时,在栈内存中会被划分出一定的内存,并将数值存储在该内存中.

    1. 引用数据类型:被创建时,首先会在栈内存中分配一块空间,然后在堆内存中也会分配一块具体的空间用来
      存储数据的具体信息,即hash值,然后由栈中引用指向堆中的对象地址

      从使用方面

  4. 基本数据类型:判断数据是否相等,用==和!=判断。

  5. 引用数据类型:判断数据是否相等,用equals()方法,==和!=是比较数值的。而equals()方法是比较内存

地址的。equals()重写前比较的是地址值,重写后比较的是对象属性。