auto commit

This commit is contained in:
CyC2018 2018-03-19 10:20:20 +08:00
parent e714e1c6eb
commit 7e68b4f3ec

View File

@ -34,41 +34,41 @@
## final
### 1. 数据
<font size=4> **1. 数据** </font> </br>
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
- 对于基本类型final 使数值不变;
- 对于引用类型final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
### 2. 方法
<font size=4> **2. 方法** </font> </br>
声明方法不能被子类覆盖。
private 方法隐式地被指定为 final如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是重载了。
### 3. 类
<font size=4> **3. 类** </font> </br>
声明类不允许被继承。
## static
### 1. 静态变量
<font size=4> **1. 静态变量** </font> </br>
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次。
- 静态变量: 类所有的实例都共享静态变量,可以直接通过类名来访问它;
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
### 2. 静态方法
<font size=4> **2. 静态方法** </font> </br>
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现也就是说它不能是抽象方法abstract
### 3. 静态语句块
<font size=4> **3. 静态语句块** </font> </br>
静态语句块和静态变量一样在类第一次实例化时运行一次。
### 4. 初始化顺序
<font size=4> **4. 初始化顺序** </font> </br>
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
@ -141,13 +141,13 @@ protected void finalize() throws Throwable {}
## clone()
### 1. 浅拷贝
<font size=4> **1. 浅拷贝** </font> </br>
引用类型引用同一个对象。clone() 方法默认就是浅拷贝实现。
<div align="center"> <img src="../pics//d990c0e7-64d1-4ba3-8356-111bc91e53c5.png"/> </div><br>
### 2. 深拷贝
<font size=4> **2. 深拷贝** </font> </br>
可以使用序列化实现。
@ -157,15 +157,15 @@ protected void finalize() throws Throwable {}
## equals()
### 1. == 与 equals() 区别
<font size=4> **1. == 与 equals() 区别** </font> </br>
- 对于基本类型,== 判断两个值是否相等;
- 对于引用类型,== 判断两个引用是否引用同一个对象,而 equals() 判断引用的对象是否等价。
### 2. 等价性
<font size=4> **2. 等价性** </font> </br>
[散列](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%AE%B9%E5%99%A8.md#%E6%95%A3%E5%88%97)
> [散列](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%AE%B9%E5%99%A8.md#%E6%95%A3%E5%88%97)
# 四、继承
@ -177,10 +177,12 @@ Java 中有三个访问权限修饰符private、protected 以及 public
protected 用于修饰成员,表示在继承体系中成员对于子类可见。但是这个访问修饰符对于类没有意义,因为包没有继承体系。
更详细的内容:[浅析 Java 中的访问权限控制](http://www.importnew.com/18097.html)
> [浅析 Java 中的访问权限控制](http://www.importnew.com/18097.html)
## 抽象类与接口
<font size=4> **1. 抽象类** </font> </br>
抽象类和抽象方法都使用 abstract 进行声明。抽象类一般会包含抽象方法,但是少数情况下可以不包含,例如 HttpServlet 类,但是抽象方法一定位于抽象类中。抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。
```java
@ -195,7 +197,11 @@ public abstract class GenericServlet implements Servlet, ServletConfig, Serializ
}
```
接口定义了一组方法,但是接口都没有方法的实现,可以理解为这些方法都是抽象方法。
> [深入理解 abstract class 和 interface](https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/)
<font size=4> **2. 接口** </font> </br>
接口是抽象类的延伸Java 为了安全性而不支持多重继承,一个类只能有一个父类。但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补不支持多重继承的缺陷。从 Java 8 开始,接口也可以拥有默认的方法实现。
```java
public interface Externalizable extends Serializable {
@ -206,23 +212,37 @@ public interface Externalizable extends Serializable {
}
```
| **参数** | **抽象类** | **接口** |
| --- | --- | --- |
| 默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
| 实现 | 子类使用 extends 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字 implements 来实现接口。它需要提供接口中所有声明的方法的实现 |
| 构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
| 与正常 Java 类的区别 | 除了你不能实例化抽象类之外,它和普通 Java 类没有任何区别 | 接口是完全不同的类型 |
| 访问修饰符 | 抽象方法可以有 public、protected 和 default 这些修饰符 | 接口方法默认修饰符是 **public** 。你不可以使用其它修饰符。 |
| main 方法 | 抽象方法可以有 main 方法并且我们可以运行它 | 接口没有 main 方法,因此我们不能运行它。 |
| 多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
| 速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
| 添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
<font size=4> **3. 比较** </font> </br>
> [Java 抽象类与接口的区别](http://www.importnew.com/12399.html)
| | ** 抽象类** | ** 接口** |
| --- | --- | --- |
| 1 | An abstract class can extend only one class or one abstract class at a time | An interface can extend any number of interfaces at a time |
| 2 | An abstract class can extend another concrete (regular) class or abstract class | An interface can only extend another interface |
| 3 | An abstract class can have both abstract and concrete methods | An interface can have only abstract methods |
| 4 | In abstract class keyword "abstract" is mandatory to declare a method as an abstract | In an interface keyword "abstract" is optional to declare a method as an abstract |
| 5 | An abstract class can have protected and public abstract methods | An interface can have only have public abstract methods |
| 6 | An abstract class can have static, final or static final variable with any access specifier | interface can only have public static final (constant) variable |
> [Difference Between Abstract Class and Interface in Java](https://beginnersbook.com/2013/05/abstract-class-vs-interface-in-java/)
<font size=4> **4. 使用选择** </font> </br>
使用抽象类:
- 需要在几个相关的类中共享代码;
- 需要能控制继承来的方法和字段的访问权限,而不是都为 public。
- 需要继承非静态non-static和非常量non-final字段。
使用接口:
- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
- 需要使用多重继承。
> [When to Use Abstract Class and Interface](https://dzone.com/articles/when-to-use-abstract-class-and-intreface)
## super
### 1. 访问父类的成员
<font size=4> **1. 访问父类的成员** </font> </br>
如果子类覆盖了父类的中某个方法的实现,那么就可以通过使用 super 关键字来引用父类的方法实现。
@ -248,7 +268,7 @@ public class Subclass extends Superclass {
}
```
### 2. 访问父类的构造函数
<font size=4> **2. 访问父类的构造函数** </font> </br>
可以使用 super() 函数访问父类的构造函数,从而完成一些初始化的工作。
@ -271,11 +291,11 @@ public MountainBike(int startHeight, int startCadence, int startSpeed, int start
## String, StringBuffer and StringBuilder
### 1. 是否可变
<font size=4> **1. 是否可变** </font> </br>
String 不可变StringBuffer 和 StringBuilder 可变。
### 2. 是否线程安全
<font size=4> **2. 是否线程安全** </font> </br>
String 不可变,因此是线程安全的。
@ -285,21 +305,21 @@ StringBuilder 不是线程安全的StringBuffer 是线程安全的,使用 s
## String 不可变的原因
### 1.1 可以缓存 hash 值
<font size=4> **1. 可以缓存 hash 值** </font> </br>
因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 等。不可变的特性可以使得 hash 值也不可变,因此就只需要进行一次计算。
### 2. String Pool 的需要
<font size=4> **2. String Pool 的需要** </font> </br>
如果 String 已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
<div align="center"> <img src="../pics//f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg"/> </div><br>
### 3. 安全性
<font size=4> **3. 安全性** </font> </br>
String 经常作为参数String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的那么在网络连接过程中String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
### 4. 线程安全
<font size=4> **4. 线程安全** </font> </br>
String 不可变性天生具备线程安全,可以在多个线程中使用。
@ -309,7 +329,7 @@ String 不可变性天生具备线程安全,可以在多个线程中使用。
使用 String.intern() 可以保证所有相同内容的字符串变量引用相同的内存对象。
更详细的内容:[揭开 String.intern() 那神秘的面纱](https://www.jianshu.com/p/95f516cb75ef)
> [揭开 String.intern() 那神秘的面纱](https://www.jianshu.com/p/95f516cb75ef)
# 六、基本类型与运算
@ -422,16 +442,15 @@ Class 和 java.lang.reflect 一起对反射提供了支持java.lang.reflect
IDE 使用反射机制获取类的信息,在使用一个类的对象时,能够把类的字段、方法和构造函数等信息列出来供用户选择。
更详细的内容:[深入解析 Java 反射1- 基础](http://www.sczyh30.com/posts/Java/java-reflection-1/)
> [深入解析 Java 反射1- 基础](http://www.sczyh30.com/posts/Java/java-reflection-1/)
### Advantages of Using Reflection:
<font size=4> **Advantages of Using Reflection:** </font> </br>
- **Extensibility Features** : An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.
- **Class Browsers and Visual Development Environments** : A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.
- **Debuggers and Test Tools** : Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.
### Drawbacks of Reflection
<font size=4> **Drawbacks of Reflection:** </font> </br>
Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection.
@ -464,22 +483,20 @@ public class Box<T> {
}
```
更详细的内容:
- [Java 泛型详解](https://www.ziwenxie.site/2017/03/01/java-generic/)
- [10 道 Java 泛型面试题](https://cloud.tencent.com/developer/article/1033693)
> [Java 泛型详解](https://www.ziwenxie.site/2017/03/01/java-generic/)
> [10 道 Java 泛型面试题](https://cloud.tencent.com/developer/article/1033693)
# 十、注解
Java注解是附加在代码中的一些元信息用于一些工具在编译、运行时进行解析和使用起到说明、配置的功能。注解不会也不能影响代码的实际逻辑仅仅起到辅助性的作用。
Java 注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。
更多详细内容:[注解Annotation实现原理与自定义注解例子](https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html)
> [注解 Annotation 实现原理与自定义注解例子](https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html)
# 十一、特性
## 面向对象三大特性
[封装、继承、多态](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%80%9D%E6%83%B3.md#%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%A4%9A%E6%80%81)
> [封装、继承、多态](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%80%9D%E6%83%B3.md#%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%A4%9A%E6%80%81)
## Java 各版本的新特性
@ -507,8 +524,7 @@ New highlights in Java SE 7
8. Diamond Syntax
> [Difference between Java 1.8 and Java 1.7?](http://www.selfgrowth.com/articles/difference-between-java-18-and-java-17)
更详细的内容:[Java 8 特性 ](http://www.importnew.com/19345.html)
> [Java 8 特性 ](http://www.importnew.com/19345.html)
## Java 与 C++ 的区别