Idea快捷键
- psvm 快速生成main函数,(测试类)
- alt+insert 快速生成(javabeen类 )
- javabeen需要有private修饰成员变量方法,一个空参构造,一个带参构造。成员方法的set和get方法。
- sout 快速生成输出语句。
- 用private修饰构造方法,就是生成一个(工具类),工具类里面可以写方法。
- 用static修饰的变量为 静态变量 (全局可以用)
- 用static修饰的方法为静态方法。(静态方法中没有this关键字)
- 静态方法可以不用实例化就可以直接用
- 选中几行代码按住ctrl+alt+m,快速将选中的代码封装为一个方法、
static 静态
静态成员是 属于类本身的,而不是对象。
静态变量
-
普通变量:属于对象,每个对象一份。
-
静态变量:属于类,所有对象共享一份。
-
class User { public static int count = 0; // 静态变量,统计用户数量 public String name; // 普通变量,每个对象独立 public User(String name) { this.name = name; count++; // 每次创建对象,count 递增 } } public class Test { public static void main(String[] args) { User u1 = new User("Tom"); User u2 = new User("Jerry"); System.out.println(User.count); // 输出 2 } }
静态方法
-
直接通过类调用,不需要对象。
-
限制:静态方法中不能访问非静态变量和非静态方法。
-
class MathUtil { public static int add(int a, int b) { //注意static关键字 return a + b; } } public class Test { public static void main(String[] args) { System.out.println(MathUtil.add(3, 5)); // 8 直接调用 } }要调用实例方法,必须先创建对象。
-
class MathUtil { public int add(int a, int b) { //无static关键字 return a + b; } } public class Test { public static void main(String[] args) { MathUtil util = new MathUtil(); // 先创建对象,在调用方法 System.out.println(util.add(3, 5)); // ✅ 输出 8 } }final修饰类
-
final class:不能被继承。意思为最后的 -
final class Animal {} // class Dog extends Animal {} // ❌ 报错修饰方法
-
final方法不能被子类重写。 -
class Animal { public final void run() { System.out.println("Animal is running"); } } class Dog extends Animal { // public void run() {} // ❌ 报错 }修饰变量
-
变量变成常量,赋值后不可再改。
-
final int a = 10; // a = 20; // ❌ 报错接口
interface接口是一组规范/约定,定义了方法签名,但不提供实现(Java8 开始可以有
default方法)。 -
interface USB { void connect(); void disconnect(); } class Mouse implements USB { @Override public void connect() { System.out.println("Mouse connected"); } @Override public void disconnect() { System.out.println("Mouse disconnected"); } } public class Test { public static void main(String[] args) { USB usb = new Mouse(); // 多态 usb.connect(); } } 作用: 统一标准,方便解耦。 实现多继承(一个类可以实现多个接口)。抽象类
abstract介于普通类和接口之间。可以写方法的声明(抽象方法)和部分实现。
-
abstract class Animal { public abstract void sound(); // 抽象方法,没有实现 public void eat() { // 普通方法,有实现 System.out.println("Animal eating"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof!"); } } 作用: 定义一个基础骨架,部分由子类完成。 当一类事物有 共同点(可以写在父类),又有 差异点(抽象方法由子类实现)。特性 接口 interface抽象类 abstract class继承关系 一个类可实现多个接口 一个类只能继承一个抽象类 方法 默认都是抽象方法(Java8 有 default)可有抽象方法和普通方法 属性 public static final常量可定义变量(可有不同修饰符) 使用场景 更强调行为约定(能做什么) 更强调模板骨架(是什么) -
多态的三个条件
-
要有继承或实现关系
-
父类引用指向子类对象
-
调用方法时表现为“编译看左边,运行看右边”
-
编译时:检查父类是否有这个方法
-
运行时:实际调用子类的实现(如果子类重写了方法)
-
-
class Person { public void say() { System.out.println("Person say"); } } class User extends Person { @Override public void say() { System.out.println("User say"); } } public class Test { public static void main(String[] args) { Person p = new User(); // 向上转型 p.say(); // 输出: User say } } Person p = new User(); p.say(); 这两行代码 编译的时候看左边(看父类Person是否有say方法)、运行看右边(看User类是否有say方法)。 多态的核心作用:解耦、扩展、复用。一句话总结:用父类/接口来定义规范, 用子类来实现细节,运行时根据实际对象决定执行哪个方法。 真实场景 Spring 框架:List list = new ArrayList(); 或 List list = new LinkedList(); → 程序依赖 List 接口,不关心用哪种实现。 数据库开发:Connection conn = new MysqlConnection(); 或 Connection conn = new OracleConnection(); → 程序写死 Connection,换数据库时不用改业务代码。 策略模式、工厂模式 都是基于多态。 -
访问控制修饰符(权限范围)
作用:控制谁能访问。
适用:类、方法、变量、构造方法。 -
修饰符 同类中 同包 子类 其他包 public✅ ✅ ✅ ✅ protected✅ ✅ ✅ ❌ default(不写)✅ ✅ ❌ ❌ private✅ ❌ ❌ ❌
class User {
public String name; // 任何地方都能访问
protected int age; // 子类可以访问
String address; // 包内访问
private String password; // 仅类内访问
}
private 只能在当前类内用。私有
default(不写) 只能在当前包内的类文件使用
protected 只有继承的可以用.
public 不限制,都可以用
类相关修饰符
static 静态
-
修饰变量:属于类,所有对象共享。
-
修饰方法:类方法,类名直接调用。
final 常量/禁止继承或重写
-
修饰类:类不能被继承。
-
修饰方法:方法不能被重写。
-
修饰变量:值不能被修改。
abstract 抽象
-
修饰类:类不能实例化,必须被继承。
-
修饰方法:方法没有实现,必须由子类实现。
synchronized
-
用于多线程,保证方法或代码块同一时间只被一个线程访问。
native
-
声明本地方法(用 C/C++ 实现)。
继承和多态相关修饰符
override(不是关键字,而是注解 @Override)
-
表示子类重写父类方法。
transient
-
修饰变量,表示该变量不参与序列化。
volatile
-
修饰变量,保证多线程下变量的可见性。
常见组合举例
public class Example {
public static final double PI = 3.14; // 公共常量
private int id; // 私有成员
protected String name; // 子类可见
transient String cache; // 不序列化
public final void run() {} // 不能被重写
public static void print() {} // 静态方法
public abstract void work(); // 抽象方法
}
总结:
权限控制:public、protected、default、private
类行为:static、final、abstract、synchronized、native
变量特性:transient、volatile
浮点标准:strictfp
| 修饰符 | 类 | 方法 | 变量 | 含义 |
|---|---|---|---|---|
| 访问控制 | ||||
public | ✅ | ✅ | ✅ | 任何地方可见 |
protected | ❌ | ✅ | ✅ | 同包和子类可见 |
default(不写) | ✅ | ✅ | ✅ | 仅同包可见 |
private | ❌ | ✅ | ✅ | 仅类内部可见 |
| 类相关 | ||||
static | ❌ | ✅ | ✅ | 属于类,不依赖对象 |
final | ✅ | ✅ | ✅ | 类不能继承;方法不能重写;变量不能修改 |
abstract | ✅ | ✅ | ❌ | 类不能实例化;方法必须由子类实现 |
| 并发控制 | ||||
synchronized | ❌ | ✅ | ❌ | 方法/代码块同一时刻仅一个线程访问 |
volatile | ❌ | ❌ | ✅ | 多线程下保证变量的可见性 |
| 序列化 | ||||
transient | ❌ | ❌ | ✅ | 变量不参与序列化 |
| 其他 | ||||
native | ❌ | ✅ | ❌ | 方法用 C/C++ 实现 |
strictfp | ✅ | ✅ | ❌ | 保证浮点计算符合 IEEE754 |
| 修饰符组合 | 适用 | 示例 | 典型用途 |
|---|---|---|---|
public static final | 变量 | public static final double PI = 3.14; | 常量定义,所有类可访问,不可修改 |
private static | 变量/方法 | private static int count; | 类级别的私有数据或工具方法(单例模式常用) |
protected abstract | 方法 | protected abstract void work(); | 父类定义模板,子类必须实现 |
public abstract | 类/方法 | public abstract class Shape {} | 抽象类或方法,约束子类 |
public final | 类/方法/变量 | public final class String {} | 类不能继承;方法不能重写;变量变常量 |
private final | 变量 | private final int id; | 私有常量,构造方法里赋值一次 |
synchronized + 访问修饰符 | 方法 | public synchronized void add() {} | 保证多线程安全 |
volatile | 变量 | private volatile boolean flag; | 多线程共享变量,避免缓存不一致 |
transient | 变量 | private transient String cache; | 序列化时跳过该字段 |
// 工具类:方法全是静态
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
// 常量池:公共常量
public class Config {
public static final String APP_NAME = "StudentSystem";
}
// 单例模式:私有静态变量
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
// 抽象类 + 抽象方法
public abstract class Animal {
public abstract void sound(); // 子类必须实现
}
// 线程安全的方法
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
面向对象的难点
1. 继承 (extends) 的细节
-
单继承:Java 一个类只能继承一个父类,但可以实现多个接口。
-
构造方法不继承,但子类会默认先调用父类的无参构造。
-
方法重写要符合规则(参数列表相同,返回值相同或更窄,访问权限不能变小)。
-
class Person { String name; public void work() { System.out.println("工作"); } } class Teacher extends Person { @Override public void work() { System.out.println("教书"); } }
**难点:**父类引用可以指向子类对象(多态),但只能访问父类定义的内容。
2. 多态的真实价值
-
向上转型:
Person p = new Teacher(); -
运行时决定方法执行版本(动态绑定)。
-
好处:解耦,扩展性强,符合开闭原则。
例子:
void doWork(Person p) {
p.work(); // 传 Teacher 就是教书,传 Student 就是学习
}
3. 抽象类 vs 接口
-
抽象类:
abstract class,可以有成员变量、构造方法、非抽象方法,适合“is-a”关系。 -
接口:
interface,只能定义常量和抽象方法(Java 8+ 可有默认方法、静态方法),更强调“can-do”能力。
例子:
abstract class Animal { abstract void sound(); }
interface Flyable { void fly(); }
class Bird extends Animal implements Flyable {
void sound() { System.out.println("叽叽喳喳"); }
public void fly() { System.out.println("鸟会飞"); }
}
4. static 与 对象成员的区别
-
static属于类,所有对象共享,不依赖实例。 -
非
static属于对象,每个实例独立。
例子:
class Counter {
static int total = 0; // 所有对象共享
int id; // 每个对象独立
public Counter(int id) {
this.id = id;
total++;
}
}
5. final 的三种用法
-
final class:类不能被继承(如String)。 -
final method:方法不能被重写。 -
final variable:变量是常量,必须初始化一次,不能再改。
6. 对象比较
-
==比较内存地址。 -
equals()默认也是比较地址,但很多类(如String)重写了,变成内容比较。

被折叠的 条评论
为什么被折叠?



