Java期末拾遗-下半
1.编译器和解释器的区别
编译器是“一次性翻译,整体执行”,解释器是“一边翻译,一边执行”。
对比图(改自GPT):
对比项 | 编译器(Compiler) | 解释器(Interpreter) |
---|---|---|
翻译方式 | 一次性将整个源代码编译成可执行文件 | 逐行解释源代码并立即执行 |
输出结果 | 可执行文件(如 .exe 、.class 等) |
无独立可执行文件,直接运行 |
执行效率 | 高(编译后运行快) | 较低(每次运行都要解释) |
调试方便程度 | 不易定位具体错误行(需要整个编译过程) | 容易定位(出错立即停止) |
第一次运行速度 | 慢(需要先编译) | 快(直接运行) |
依赖环境 | 编译后可独立运行,不再依赖编译器 | 每次运行都依赖解释器 |
常见语言 | C、C++、Java(先编译成字节码) | Python、JavaScript、Ruby |
需要注意的是:Java既是编译型又是解释型语言。
这句话看起来矛盾,其实是因为 Java 有两个阶段的执行过程,结合了编译型语言和解释型语言的特点。
第一步:编译(Compiler)
Java 源代码(.java 文件)会先被 编译器(javac) 编译成 字节码文件(.class),这个过程是一次性编译,类似于 C、C++ 的编译阶段。
第二步:解释(Interpreter)或即时编译(JIT)
编译后的 .class 文件不是直接执行的,而是由 Java 虚拟机(JVM) 来运行:
JVM 内部会用 解释器 把字节码一行一行“翻译”成机器指令并执行。
同时,JVM 的 JIT(Just-In-Time)编译器 会把频繁执行的字节码“临时编译”为本地机器码,提高效率。
2.static变量
static 变量(也叫静态变量),是属于类(class)而不是对象(object)的变量。
static能够修饰成员变量和方法,内部类,也可以形成静态static代码块,不能修饰局部变量。
静态代码块:定义在成员位置,使用static修饰的代码块{},随着类的加载而执行,且执行一次,优先于main方法和构造方法的执行。
static 变量在内存中只存在一份,它是随着类的加载而加载的,且只加载一次。例如:
Java 程序的入口方法 main是一个 static(静态)方法。
public static void main(String[] args){}
它优先于对象存在,所以,可以被所有对象共享。
需要注意的是:静态方法不能访问非静态变量,因为它没有 this 对象。
静态方法在没有任何对象的情况下就可以被调用,而非静态变量属于某个对象,必须通过 this 才能访问。
this 代表当前对象的引用,而静态方法属于类本身,不属于任何对象,所以它没有 this。
static void print() {
System.out.println(name); // ❌ 错误,name 是非静态变量
}
3.多态、重写与重载
重写:
重写是实现多态的必要前提之一。
子类出现重名的成员方法(返回值类型,方法名和参数列表都相同),访问是特殊情况,声明不变,将父类方法重新实现。
需要注意:1.子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
2.子类方法覆盖父类方法,必须要保证权限大于等于父类权限(例如父类是 public,子类不能是 protected),
子类抛出的异常不能比父类方法更宽泛。
例如:
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
重载:
在一个类中方法名相同,但参数不同(类型或个数),返回类型可以相同或不同的多个方法。
特性 | 内容 |
---|---|
是否需要继承 | 无需继承,可在同一个类中定义 |
方法名 | 相同 |
参数列表 | 必须不同(类型、数量或顺序不同) |
返回类型 | 可以不同,但不能靠返回类型区分方法 |
例如:
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
需要注意的是:Java支持构造函数重载(Constructor Overloading),即一个类可以有多个构造函数,只要它们的参数列表不同(参数类型、顺序或数量不同)。
多态:
多态是指同一行为,具有多个不同的表现形式。
即父类定义了一个方法,而子类方法重写该方法时方法主体不一样,
这样在不同子类里面这个方法的实现形式就不一样,能让程序更有扩展性。
需要注意:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,不能调用子类拥有,而父类没有的方法。想要调用子类特有的方法,必须做向下转型。
多态例如:
class Animal {
void makeSound() { }
}
class Dog extends Animal {
@Override
void makeSound() { //对于Cat子类,makeSound方法是Bark
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
void makeSound() { //对于Cat子类,makeSound方法是Hajimi
System.out.println("Hajimi");
}
}
4.关系
在画类图的时候,”is-a” 和 “has-a” 是两种最基础的关系。
- “is-a” 关系(继承/实现),包括子类 继承 父类,或类 实现 接口。
继承(类 → 类):空心三角箭头(子类指向父类),如:Dog ──────▷ Animal
实现(类 → 接口):虚线空心三角箭头 或 棒棒糖表示法,如:
Dog ⤍ «interface» Runnable或Dog ───○ Runnable - “has-a” 关系(组合/聚合/关联),表示一个类包含另一个类的对象。
组合(Composition):强依赖,部分不能脱离整体存在(如 Car 和 Engine)。
聚合(Aggregation):弱依赖,部分可以独立存在(如 University 和 Department)。
关联(Association):普通的持有关系(如 Student 和 Course)。关系类型 符号 示例 说明 组合 实心菱形 ◆── Car ◆── Engine 生命周期绑定,强依赖 聚合 空心菱形 ◇── University ◇── Department 生命周期独立,弱依赖 关联 实线箭头 ───> Student ───> Course 普通持有关系
5.java易忘英语单词汇总
inherit 继承 subclass(child class)子类 equivalent 等价的、同义的
signature 署名 coexist 共存 invoke 调用 instantiate 实例化 abnormalities紊乱
execute 执行 exception handler 异常处理器 stack trace 堆栈跟踪
scope 作用域 wrapper 包装 instance 实例 arguments 参数 集合Collection
6.访问权限问题
对于父类来说:
private:仅当前类可访问(子类和其他类均不可见)。
default(包私有):同一包内的类可访问(子类如果在不同包则不能访问!)。
protected:同一包内的类 + 不同包的子类可访问。
public:所有类均可访问。
7.java文件中的注释问题
注释类型 | 语法 | 用途 | 是否生成 Javadoc |
---|---|---|---|
单行注释 | // |
临时注释或简短说明 | ❌ 否 |
多行注释 | /* ... */ |
跨行注释,适合较长说明 | ❌ 否 |
Javadoc | /** ... */ |
生成 API 文档(含 @param 等标签) |
✅ 是 |