用static修饰的方法。 由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容。 即类方法体有如下限制: 1.类方法中不能引用对象变量; 2.类方法中不能调用类的对象方法; 3.在类方法中不能调使用super,this关键字; 4.类方法不能被覆盖。
当一个类创建了一个对象后,这个对象就可以调用该类的方法(对象方法)。 1.实例方法中可以引用对象变量,也可以引用类变量; 2.实例方法中可以调用类方法; 3.对象方法中可以使用super,this关键字。
区别:类方法可以通过类名调用,实例方法不能通过类名调用
当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址
当该类创建对象后,类中的实例方法才分配入口地址,
从而实例方法可以被类创建的任何对象调用执行。
类方法在该类被加载到内存时,就分配了相应的入口地址。
从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。
类方法的入口地址直到程序退出时才被取消。
注意:
当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址。
也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。
在Java语言中,类中的类方法不可以操作实例变量,也不可以调用实例方法,
这是因为在类创建对象之前,实例成员变量还没有分配内存,而且实例方法也没有入口地址。
在java中静态方法就是类方法
import java.util.*; public class TestStatic { public static void main(String[]args){ System.out.println(S.getStatic());//使用类名加前缀访问静态方法 S s=new S(); System.out.println(s.getStatic());//使用实例化对象名访问静态方法 System.out.println(s.get()); } public static class S { private static int a; private int t=0; //静态初始器:由static和{}组成,只在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。 static{ a=10; } //静态方法只能访问静态数据成员 public static int getStatic() { return a; } public int getT() { return t; } //非静态方法可以访问静态方法和非静态方法 public int get() { getT(); getStatic(); t=a;//非静态方法可以访问非静态数据成员和静态数据成员 return t; } } }
在python用到两个装饰器 @classmethod和@staticmethod用来表示类方法和静态方法
classmethod:它的用法是定义操作类,而不是操作实例的方法。classmethod改变了调用方法的方式,因此此类低一个参数是类本身(cls),而不是实例(self)。classmethod方法最常见的用途是定义定义备选的构造方法
frombytes的return 使用参数cls构建了新实例 cls(*memv)。按照约定来类方法的第一个参数应该是cls但是python并不介意怎么命名
staticmethod装饰器也会改变调用方式,但是第一个参数不是特殊的值。其实静态方法就是普通的函数,只是碰巧在类定义体内部,而不是定义在模块层。
class Demo: @classmethod def klassmethod(cls): print("这是classmethod") pass @staticmethod def statmethod(): print("这是statmethod") pass Demo.klassmethod() Demo.statmethod()
这是classmethod
这是statmethod
class Demo: @classmethod def klassmethod(*args): return args @staticmethod def statmethod(*args): return args print(Demo.klassmethod()) print(Demo.statmethod()) # (<class ‘__main__.Demo‘>,) # () print(Demo.klassmethod(12)) print(Demo.statmethod(12)) # (<class ‘__main__.Demo‘>, 12) # (12,)
原文:https://www.cnblogs.com/wqbin/p/10389154.html