### Java基础知识要点解析
#### 1. 访问修饰符的作用范围
- **Public**: 具有最高的可见性,可以在任何地方被访问。
- **Protected**: 可以被同一个包内的类或者不同包内的子类访问。
- **Friendly(默认)**: 仅限于同一个包内的类可以访问。如果一个成员没有指定访问修饰符,则默认为friendly。
- **Private**: 只能在定义它的类内部访问。
**注意**: 不写访问修饰符默认为friendly(即包私有)。
#### 2. ArrayList与Vector及HashMap与Hashtable的区别
- **ArrayList与Vector**:
- **同步性**: Vector是线程安全的,因此是同步的;而ArrayList不是线程安全的,因此是非同步的。
- **数据增长**: Vector默认增长为原来的一倍,而ArrayList的增长策略通常是增加原容量的一半。
- **HashMap与Hashtable**:
- **历史原因**: Hashtable是基于更早的Dictionary类设计的,而HashMap是在Java 1.2版本中引入的新实现。
- **同步性**: Hashtable是线程安全的,因此是同步的;而HashMap不是线程安全的,因此是非同步的。
- **允许null值**: HashMap允许键和值中出现null,而Hashtable不允许。
#### 3. Char型变量是否可以存储中文汉字
- **答案**: 是的,Java中的`char`类型可以存储中文汉字。
- **原因**: Java使用Unicode编码,一个`char`类型占用16位(2字节),足以容纳一个中文字符。
#### 4. 多线程与同步的实现方法
- **多线程实现方法**:
- **继承Thread类**: 直接继承Thread类并重写run()方法来创建线程。
- **实现Runnable接口**: 实现Runnable接口并通过传递给Thread对象来创建线程。
- **同步实现方法**:
- **Synchronized关键字**: 使用`synchronized`关键字来实现同步,可以应用于方法或代码块。
- **Wait与Notify**: 在多线程环境中使用`wait()`和`notify()`方法进行线程间的通信。
#### 5. 类继承时的构造函数执行顺序
- **示例代码**:
```java
package test;
public class FatherClass {
public FatherClass() {
System.out.println("FatherClassCreate");
}
}
public class ChildClass extends FatherClass {
public ChildClass() {
System.out.println("ChildClassCreate");
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
```
- **输出结果**:
```
FatherClassCreate
FatherClassCreate
ChildClassCreate
```
- **解释**: 当创建`ChildClass`对象时,首先会调用父类`FatherClass`的构造函数,然后再调用子类自身的构造函数。
#### 6. 内部类的实现方式
- **非静态内部类**:
```java
package test;
public class OuterClass {
private class InnerClass {
public InnerClass() {
System.out.println("InnerClassCreate");
}
}
public OuterClass() {
InnerClass ic = new InnerClass();
System.out.println("OuterClassCreate");
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
}
}
```
- **输出结果**:
```
InnerClassCreate
OuterClassCreate
```
- **静态内部类**:
```java
public class OuterClass {
private double d1 = 1.0;
// 有效选项:
// A. 静态内部类可以有静态成员,而非静态内部类则不能有静态成员
public static class InnerOne {
public static double methoda() {
return d1; // 错误: 静态方法不能直接访问外部类的实例成员
}
}
// 无效选项:
// B. 非静态内部类不能声明静态成员
// C. 未给出完整代码,但通常用于声明非静态内部类
}
```
通过以上解析,我们可以看出Java语言在基础概念上有着丰富的细节,这些知识点对于理解Java程序的行为至关重要。在实际开发过程中,正确地理解和运用这些基本概念是非常重要的。