理解Java中静态函数和非静态函数的区别
Java中,静态函数和非静态函数是基于函数的调用方式和功能特点来区分的。简单说,静态函数和非静态函数是针对类而言的。在类中,可以定义一些特殊类型的函数,其中静态函数和非静态函数都包含了不同的特点和优缺点。
那么,这两种函数具体有什么不同呢?我们来深入了解一下:
1. 静态函数
静态函数又称作类函数或者类方法,是指在类加载时就被加载到内存中,其生命周期和这个类的生命周期一样。可以通过类名而非实例来访问它们,也就是说,静态函数的调用不需要实例化对象。
static 关键字用来定义静态函数。例如,
public class MyClass {
public static void myStaticMethod() {
//静态函数体
}
}
在表达式中,我们可以直接通过类名来调用这个静态函数:
MyClass.myStaticMethod();
静态函数常用于在不需要创建对象时对数据执行操作或者为所有对象共享某些数据。比如:
public class Car {
private static int numberOfCars;
public static int getNumberOfCars() {
return numberOfCars;
}
public Car() {
numberOfCars++;
}
}
在上面的代码中,numberOfCars 是静态属性,每次 new 一个 Car 对象时都会使 numberOfCars 加 1。getNumberOfCars 是一个静态方法,它可以无需实例化就获取到 numberOfCars 的值。
静态函数的特点:
1)不需要实例化对象就可以访问
2)在内存中只有一份,节省内存空间
3)不需要知道对象的具体信息,可以直接调用
4)静态函数不能访问非静态成员
5)静态函数只能调用静态函数和静态成员
6)静态函数类似于全局函数
2. 非静态函数
非静态函数也叫成员函数、实例函数或对象方法。非静态函数必须使用对象来调用,而不能直接使用类名调用。非静态函数属于对象实例的,每次创建对象时,都会在内存中为它分配一段堆内存。
通常,非静态函数使用 this 函数或 super 函数来访问其子类和父类的成员。例如:
public class Vehicle {
protected String brand = "Ford";
public void honk() {
System.out.println("Tuut, tuut!");
}
}
public class MyCar extends Vehicle {
private String modelName = "Mustang";
public static void main(String[] args) {
MyCar myCar = new MyCar();
myCar.honk();
System.out.println(myCar.brand + " " + myCar.modelName);
}
}
在上面的代码中,honk()是一个非静态方法。它无需传递参数,其它类可以使用这个方法来鸣笛。在 MyCar 类的 main() 函数中,我们创建了 MyCar 类的对象 myCar,并使用它来调用 honk() 方法。
非静态函数的特点:
1)必须实例化对象才能访问
2)在内存中为每个对象分配一份
3)需要知道对象的具体信息,才可以调用
4)非静态函数可以访问静态和非静态成员
5)非静态函数可以调用任意函数和成员
6)非静态函数属于对象实例,可用于实现接口和重写方法等操作
总结:
静态函数和非静态函数有很多的相同点和不同点。静态函数在类中只有一份,可以直接通过类名进行调用,它被用于执行与对象无关的功能,比如获取所有对象数量等等。而非静态函数需要使用对象来调用,该方法依赖于对象实例,常被用于和对象直接发生交互的操作。
在实际的开发中,应该根据不同的场景选用不同的函数类型。静态函数适用于不依赖于对象的情景,而非静态函数适用于与对象直接发生交互的场景。
