简单易学、拥有面向对象编程思想、平台无关性(一次编译处处可用)【但现在已经不是最大的优势项了,市面上很多技术都已经成熟,可以通过某一种技术来实现跨平台这种类似的情况(Docker)】、支持多线程
JVM
Java虚拟机,JVM 可以对不同的系统来特定的实现,是为了使用相同的字节码都可以给出相同的结果,这也是”一次编译,处处可用“的关键点
JDK
给开发者使用的,用来创建和编译Java程序。也包含了编译 java 代码的编译器 比如 javac 和一些其它工具和 API
JRE
是 Java 的运行环境,包含了程序运行的环境和必要的类库而JDK则包含了 JRE
字节码
JVM 虚拟机可以理解的代码就是字节码(也就是扩展名为.class的文件)
好处
Java 程序不用重新编译就可以在不同操作系统上运行。是因为字节码不面向某一种特定的处理器,只面向虚拟机
原因
Java 语言即有编译型语言的特征也有解释性语言的特征。Java 程序是先经过编译生成字节码文件,再通过 Java 解释器来解释执行
编译型语言
是通过编译器将源代码一次性翻译为可以被平台执行的机器码。编译语言的执行速度比较快,开发效率比较低【C、C++等】(运行前就会吧程序编译为机器语言,运行时不需要重新编译,所以执行效率高)
解释型语言
是通过编译器一句一句的吧代码解释为机器代码后再执行。解释性语言开发效率比较快,执行速度比较慢【Python、JS等】(在程序运行的时候才翻译,这样每执行一次就要翻译一次,所以效率低)
标识符也就是变量名,给变量起的名字。关键字是 Java 预先就用了的标识符
除了定义常量或者是局部变量外,比如在方法参数、对象属性很少会使用基本数据类型来定义变量。而且包装类型可用于泛型而基本数据类型不可以
包装数据类型默认值为null,基本数据类型存在不同默认值
Byte、Short、Integer、Long 这四种包装类型默认创建了数值 [-128,127] 相应类型的缓存数据。Character 创建了数值在 [0,127] 范围的缓存数据
Integer i = 10; // 装箱
int n = i; // 拆箱
// 基本数据类型可以直接赋值给包装类型,这叫装箱。
// 包装类型可以直接赋值给基本数据类型,这叫拆箱。
和计算机保存浮点数的机制有很大关系。计算机读取的是二进制,但计算机在表示数字的时候,宽度是有限的,无限循环的小数就会被截断,所以就会导致小数精度发生失真的问题【比如 0.2 转为二进制,会不断乘以 2,直到不存在小数为止 0.2 * 2 = 0.4 -> 0】
使用 BigInteger 来表示。BigInteger 内容使用 int[] 数组的形式来存储任意大小的整型数据,但对于不是特别大的整数用 BigInteger 运算的效率会相对较低
可以节省内存(因为可以被这个类的所有实例所共享,所以静态变量也只会被分配一次内存),也方便调用
字符常量是单引号一起来的一个字符,字符串常量是双引号引起的0个或多个字符。
字符常量相当于一个整型值(ASCII值)可以参加表达式运算。字符串常量代表的是一个地址值
方法的返回值
某个方法中代码执行后产生的结果,返回值的作用就是接收结果,可以吧这个结果用于其它操作
方法有哪几种类型
无参数无返回值、有参数无返回值、有返回值无参数、有返回值有参数
静态方法是属于类的,在类加载的时候就会分配内存。而非静态成员属于实例对象,只有在对象实例化以后才存在。非静态成员不存在的时候静态方法就已经存在, 因此,无法在静态方法中调用内存中还不存在的非静态成员
重载
在同一个类中(或者父类和子类之间),方法名相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符不同
重写
方法名和参数列表必须相同,子类方法返回值类型和抛出的异常范围 ≤ 父类,访问修饰符的范围 ≥ 父类。构造方法无法被重写
就是允许在调用方法时传入不定个数的实参,注意点是:可变长参数只能作为方法的最后一个形参
优先匹配固定参数的方法,因为固定参数的方法匹配度更高