静态方法和非静态方法区别?(优/缺点)
静态方法(类方法)和非静态方法(实例方法)的区别:
主要有以下三种方法:
1.构造函数
2.非静态方法(普通方法/实例方法)
3.静态方法(类方法)
一、静态方法和非静态方法的区别(调用对象和引用变量不同)
静态方法:是用关键字修饰的方法,也称为类方法。它属于类,而不属于对象。在实例化对象之前,可以通过类名调用静态方法。方法名称。(静态属性和静态方法属于类,可以通过类名直接调用)。
A. 在静态方法中,可以调用静态方法。
B. 在静态方法中,不能调用非静态方法。
C. 在静态方法中,可以引用类变量(即修饰变量)。
D. 在静态方法中,成员变量(即没有修饰的变量)不能被引用。
E. 在静态方法中,不能使用 super 和 this 关键字
非静态方法:是一种没有关键字修饰的普通方法,也称为实例方法和成员方法。属于对象,不属于类。(成员属性和成员方法属于对象,必须通过new关键字创建对象,然后通过对象调用)。
A. 在普通方法中,可以调用普通方法。
B. 在普通方法中,可以调用静态方法
C.在普通方法中,可以引用类变量和成员变量
D. 在普通方法中,可以使用 super 和 this 关键字
二、静态方法和非静态方法的区别(调用方法不同)
静态方法可以通过类名和对象直接调用。(类名。方法名/对象名。方法名)
但是非静态方法只能从对象中调用。(对象名。方法名)
三、静态方法和非静态方法的区别(生命周期不同)
静态方法的生命周期与对应的类一样长,静态方法和静态变量随着类的定义被分配和加载到内存中。在线程结束之前,静态属性和方法不会被销毁。(即静态方法属于类)
非静态方法的生命周期与类的实例化对象一样长。只有当类实例化一个对象时,才会创建非静态方法,而当对象被销毁时,非静态方法会立即被销毁。(即非静态方法属于对象)
总结:类方法可以通过类名直接调用。实例方法必须先实例化类,再初始化对象,再通过类的实例对象调用。
例子:
XYZ类{
public static void main(String[] str){
XYZ.testStatic(); //直接通过类调用
XYZ a = new XYZ(); //实例化,然后构造方法会初始化
a.testMethod(); //对象调用方法
}
public static void testStatic(){
System.out.println("This is static method");
}
public void testMethod(){
System.out.println("This is instance method");
}
}
静态变量/方法是在类加载时初始化的方法,在内存中只存在一份,所以可以看成是全局变量/方法。
优点属于类级别,不用创建对象就可以直接使用。它是全局唯一的,在内存中唯一,静态变量可以唯一标识某些状态。类加载时初始化,驻留在内存中方法,调用方便快捷。
应用场景:
1. 静态方法最适合工具类中方法的定义;如文件操作、日期处理方法等。
2. 静态方法适用于入口方法的定义;比如单例模式,因为无法从外部获取构造函数,所以需要定义静态方法来获取对象。
3. 静态变量适用于全局变量的定义。(例如,布尔静态成员变量用作控制符号)
缺点静态方法不能调用非静态方法和变量。(非静态方法可以任意调用静态方法/变量)不能使用this和super关键字(属于类级别,this/super不创建对象签名不可用)
摘自csdn