一.static
static是 Java 中的一个关键字,用于修饰类的成员(变量、方法、代码块)和内部类,它的核心作用是将成员与类本身关联,被 static 修饰的成员属于类级别,而不是实例级别。它由该类的所有实例共享,不依赖于某个具体对象。可以直接通过类名访问,无需创建类的实例。在类加载时就会被初始化,早于对象的创建。下面介绍一些常见用法:
1.修饰变量
class Student {
static int totalCount; // 静态变量:所有学生共享的总人数
String name; // 实例变量
}
public class Test {
public static void main(String[] args) {
Student.totalCount = 0; // 直接通过类名访问
Student s1 = new Student();
s1.name = "张三";
Student.totalCount++; // 总人数+1
System.out.println(Student.totalCount);
}
}
被static修饰的变量是所有对象共享同一份的静态变量,一个对象修改后,其他对象访问的是修改后的值。可以直接通过类名访问。
2.修饰方法
class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
public class Test {
public static void main(String[] args) {
int sum = MathUtil.add(3, 5); // 直接通过类名调用,无需创建对象
System.out.println(sum);
}
}
被static修饰的方法属于类,可通过类名.方法名直接调用,无需创建对象。注意不能直接访问类中的非静态成员。
3.修饰代码块(变为静态代码块)
class Config {
static String appName;
// 静态代码块:初始化静态变量
static {
appName = "MyApp";
System.out.println("静态代码块执行:初始化appName");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Config.appName); // 首次访问类,触发静态代码块执行
// 输出:静态代码块执行:初始化appName → MyApp
}
}
类加载时自动执行,且只执行一次(无论创建多少对象)。多个静态代码块按定义顺序执行。static修饰的方法在main方法之前先入栈。
注意static不能和this和super一起使用。
二.this
this代指当前对象。Java 中为解决变量的命名冲突和不确定性问题,引入关键字 this 代表其所在方法的当前对象的引用。
this.属性名称 代表当前对象调用某一变量。
this.方法名 代表当前对象调用某一方法。
this() 指this访问构造方法,使用时要注意:
1.不能在普通方法当中使用,只能在构造方法当中使用。
2.在构造方法当中必须是第一条语句。
3.不能和super()一起使用。
1.对于构造方法和普通方法:
class Person {
String name; // 成员变量
// 构造方法:参数name与成员变量同名
public Person(String name) {
this.name = name; // this.name 指向成员变量,name 指向参数
}
// 普通方法:局部变量与成员变量同名
public void setName(String name) {
this.name = name; // 用this区分,将参数值赋值给成员变量
}
}
2.对于调用方法:
class Dog {
public void bark() {
System.out.println("汪汪叫");
}
public void play() {
this.bark(); // 调用当前对象的bark()方法,等效于 bark()
System.out.println("玩耍");
}
}
三.super
super代表父类,调用父类当中的方法和变量。super()若使用,必须放在构造方法第一行,并且依赖继承,只有子类中才能使用。
1.对于访问父类的成员变量:
class Animal {
String name = "动物"; // 父类成员变量
}
class Cat extends Animal {
String name = "猫咪"; // 子类成员变量(与父类同名)
public void printName() {
System.out.println(name); // 访问子类自己的name:输出 "猫咪"
System.out.println(super.name); // 访问父类的name:输出 "动物"
}
}
2.对于调用父类的成员方法:
class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
class Dog extends Animal {
// 重写父类的eat()方法
@Override
public void eat() {
super.eat(); // 调用父类的eat()方法:输出 "动物吃东西"
System.out.println("狗吃骨头"); // 子类自己的逻辑
}
}
3.对于调用父类的构造方法:
class Person {
String name;
// 父类有参构造
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
int score;
// 子类构造方法
public Student(String name, int score) {
super(name); // 调用父类的有参构造(必须在第一行)
this.score = score;
}
}
1424

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



