JavaSE面向对象(中)
Java 变量
Java 变量相当于“容器”,用来存储程序运行过程中的数据值。
- 数据类型分为2种:
基本数据类型和引用数据类型 - 按作用域可分为3类:
局部变量、成员变量(实例变量)、静态变量(类变量)
局部变量
在方法、构造方法或语句块中声明的变量。
特点:
- 只能在当前方法或代码块中使用
- 在方法执行时创建,方法结束时销毁
- 没有默认值,必须手动初始化
- 不能使用访问修饰符(如
public
、private
) - 存储在栈中
示例:
public class LocalVariable {public static void main(String[] args) {int a = 10;int b = 10;int c = a + b;System.out.println(c);}
}
成员变量
在类中声明,在方法外。
特点:
- 属于对象(实例),通过对象名访问
- 对象创建时分配内存,对象销毁时释放
- 可以使用访问修饰符
- 有默认值(0、false、null 等)
- 通常设置为
private
,通过方法访问
示例:
public class InstanceVariable {int a = 666;public static void main(String[] args) {InstanceVariable iv = new InstanceVariable();System.out.println(iv.a);}
}
静态变量
使用 static
关键字声明,属于类而非对象
特点:
- 所有对象共享同一份数据
- 可直接用“类名.变量名”访问
- 存储在静态区
- 在程序开始时创建,程序结束时销毁
- 默认值与实例变量相同
示例:
public class StaticVariable {static int data = 668;public static void main(String[] args) {System.out.println(StaticVariable.data);}
}
常量
定义:使用 final
关键字修饰的成员变量,值不可改变。
作用:
- 表示固定不变的数值
- 提高代码可读性和可维护性
- 常量名必须大写
类型 | 关键字 | 作用范围 | 是否有默认值 | 生命周期 | 存储位置 |
---|---|---|---|---|---|
局部变量 | 无 | 方法或代码块内部 | ❌ 否 | 方法执行期间 | 栈 |
成员变量 | 无 | 整个类(实例) | ✅ 是 | 对象存活期 | 堆 |
静态变量 | static | 整个类(共享) | ✅ 是 | 程序运行期 | 静态区 |
常量 | final | 类或实例 | ✅ 是 | 程序运行期 | 常量区 |
局部变量短命、成员变量随对象、静态变量随类、常量永不变。
以下是上文内容的核心提炼与结构化总结👇
Java 中的方法
- 方法是实现代码复用性的机制。
- 只在被调用时执行。
- Java 程序的入口是
main()
方法。 - 方法能提升可读性与维护性,通过封装逻辑来复用。
方法的声明组成
方法的定义包含多个部分:
部分 | 含义 |
---|---|
访问权限 | 控制可见性:public :所有类可访问private :仅类内可访问protected :同包或子类可访问默认(无修饰符):仅同包可见 |
返回类型 | 方法返回的数据类型(或 void 表示无返回值) |
方法名 | 最好是动词,小写开头,采用驼峰命名法,如:sum() 、stringComparison() |
参数 | 包括参数类型与名称,可有多个,用逗号分隔 |
方法签名 | 方法名 + 参数列表,用于区分方法(支持重载) |
方法体 | 花括号 {} 包裹的代码块,实现具体逻辑 |
方法的类型分类
(1)预先定义方法(标准库方法)
- Java 自带大量可直接使用的方法(如
println()
、length()
、equals()
等)。 - 提供于 JDK 的类库中,如
java.lang.String
、java.util.*
等。 - 优点:提高开发效率,减少重复造轮子。
public class PredefinedMethodDemo {public static void main(String[] args) {System.out.println("一成在成长");}
}
(2)用户自定义方法
- 当标准库方法不满足需求时,自行定义。
- 示例:判断数字奇偶性
public static void findEvenOdd(int num) {if (num % 2 == 0)System.out.println(num + " 是偶数");elseSystem.out.println(num + " 是奇数");
}
调用方式:
public class EvenOddDemo {public static void main(String[] args) {findEvenOdd(1);findEvenOdd(2);}
}
若方法为
static
,说明属于类的,不属于类实例,可直接通过类名调用,无需创建对象。
实例方法
- 没有
static
修饰的方法。 - 属于对象,调用前必须先创建实例。
public class InstanceMethodExample {public int add(int a, int b) {return a + b;}public static void main(String[] args) {InstanceMethodExample result = new InstanceMethodExample();System.out.println(result.add(1, 2));}
}
Getter / Setter 方法
- 用于访问私有变量(
private
修饰)。
public class Person {private String name;public String getName() {return name; }public void setName(String name) {this.name = name; }
}
静态方法
- 使用
static
修饰,属于类而非对象。 - 可直接通过类名调用。
- 常用于工具类(如 Hutool、Apache Commons)。
public class StaticMethod {public static int add(int a, int b) {return a + b;}public static void main(String[] args) {System.out.println(add(1, 2));}
}
静态方法可以简化调用、减少对象创建,是工具方法的常用模式
抽象方法
- 没有方法体,仅定义方法签名。
- 必须位于抽象类中,用
abstract
修饰。 - 子类必须重写抽象方法。
abstract class Abstract {abstract void display();
}public class MyAbstract extends Abstract {@Overridevoid display() {// 重写了抽象方法System.out.println("重写了抽象方法");}
}
类型 | 关键字 | 是否属于类 | 是否必须实例化调用 | 是否可重写 | 示例 |
---|---|---|---|---|---|
实例方法 | 无 | 否 | 是 | 是 | getName() |
静态方法 | static | 是 | 否 | 否 | Math.max() |
抽象方法 | abstract | 否(必须在抽象类中) | 需子类实现 | 必须重写 | display() |
方法是 Java 程序的“行为单元”,分为实例方法、静态方法、抽象方法三类
构造方法与普通方法的区别
对比项 | 构造方法(Constructor) | 普通方法(Method) |
---|---|---|
作用 | 用来创建对象并初始化成员变量 | 用来定义对象的行为(功能) |
名称 | 必须与类名完全相同 | 可以任意命名(遵循命名规范) |
是否有返回类型 | ❌ 没有返回类型,连 void 都不能写 | ✅ 必须有返回类型(可为 void 或具体类型) |
调用方式 | 在使用 new 创建对象时自动调用 | 通过对象名或类名显式调用 |
是否可继承/重写 | ❌ 不可继承、不可重写(但可重载) | ✅ 可继承,可重载或重写 |
修饰符限制 | 通常是 public 或 private (控制实例化权限) | 可以使用任何访问修饰符 |
是否属于类 | 属于类,但与静态方法不同,必须通过对象构造触发 | 可是实例方法或静态方法 |
构造方法负责造对象(初始化),普通方法负责**“让对象干活”**(执行行为)。
构造方法的示例
public class Person {private String name;private int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 普通方法public void sayHello() {System.out.println("你好,我是 " + name + ",今年 " + age + " 岁。");}public static void main(String[] args) {Person p = new Person("一成", ); // 调用构造方法p.sayHello(); // 调用普通方法}