- 简单易学;
- 面向对象(封装、继承、多态);
- 平台无关性
- 支持多线程
- 可靠性(具备异常处理和自动内存管理机制)
JDK(Java Develoment Kit): 是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
JRE(JavaRuntime Environment): 是Java的运行环境,包含JVM标准实现及Java核心类库。
JVM (Java Virtual Machine) :是Java虚拟机,是整个Java 实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
封装:封装把一个对象的属性私有化,访问它可以通过特定的接口。
继承:通过已有的类来创建新类的过程,已有的类称为基类/父类,新类称为子类/派生类,新类可以继承父类的方法和属性,也可以新增自己的方法和属性。
多态:分为编译时多态(方法重载)和运行时多态(方法重写)。要实现多态需要做两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。在 Java 中有两种形式可以实现多态:继承(多个⼦类对同⼀⽅法的重写)和接⼝(实现接⼝并覆盖接⼝中同⼀⽅法)。
使用new 关键字
使用Class类的newInstance方法,该方法调用无参的构造器创建对象(反射)
Class.forName.newInstance();
使用克隆clone()方法;
反序列化,比如调用ObjectInputStream 类的readObject()方法
由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的,因为其内存地址是不同的;
如果Integer和int比较时,只要两个变量值相等,则结果就是true,因为包装类Integer和基本数据类型比较时,会自动进行拆箱操作,实际是两个int型变量在进行比较;
final:用于声明属性、方法和类;表示属性不可变、方法不可覆盖、被其修饰的类不可继承;
finally: 异常处理语句结构一部分,表示总是执行;
finalize:Object类的一个方法,在垃圾回收时会调用被回收对象的finalize
==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是应用数据类型,则比较的是对象的地址值是否相等。
equals方法:用法比较两个对象的内容是否相等。注意:equals 方法不能用于比较基本数据类型的变量。如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址(很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等)。
两个对象的hashCode()相同,equals()不一定为true.因为在散列表中,hashCoding()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等【散列冲突】
Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true的时候,整个运算结果才为true, 否则为false.
&&:有短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式。
&:不管第一个表示式结果是否为true,第二个都会执行。除此之外,&还可以用作位运算符:当&两边的表达式不是Boolean类型的时候,&表示按位操作。
Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。
从 Java 5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型。
从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
break 跳出整个循环,不再执行循环(结束当前的循环体)
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
Java 的参数是以值传递的形式传入方法中,而不是引用传递。
当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。
当传递方法参数类型为引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。即使 Java 函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。
泛型是通过类型参数来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息,
类型擦除:泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 < T > 则会被转译成普通的 Object 类型,如果指定了上限如 < T extends String > 则类型参数就被替换成类型上限。
深拷贝
直接复制了一个对象,并且用新指针指向新对象
所以深拷贝是安全的
浅拷贝
仅拷贝基本数据类型对象,对于引用数据类型,创建了一个指针指向原有对象的地址值
浅拷贝不安全,如果是引用数据类型对象,修改后会影响原数据
在运行状态,对于任何一个类,都可以获得整个类的所有属性和方法,对于任何一个对象都可以调用它的任何方法和属性。简单来说就是动态获取类的信息以及动态调用类的属性和方法的功能。
Stream
流,简单来说,使用 java.util.Stream
对一个包含一个或多个元素的集合做各种操作。这些操作可能是 中间操作 亦或是 终端操作。 终端操作会返回一个结果,而中间操作会返回一个 Stream
流。