java 类方法和实例方法
1. 类方法
也可称静态方法,使用static修饰的类中方法;
2.实例方法
非静态方法,没有用static修饰的方法。
3.测试案例
public class Test {
private int a = 5;
private static int b = 10;
public static void yiStatic()
{
// a = 10;//静态方法无法访问非静态成员变量
System.out.println("yiStatic");
}
public void yiInstance()
{
a = 10;
b = 5;//非静态方法可以访问静态变量
System.out.println("yiInstanc");
}
public void yiInstance2()
{
yiStatic();//非静态方法可以访问非静态方法
yiInstance();//非静态方法可以访问静态方法
System.out.println("yiInstance2");
}
public static void yiStatic2()
{
yiStatic();//静态方法可以访问静态方法
// yiInstance();//静态方法不可以访问非静态方法
System.out.println("yiStatic2");
}
}
通过这么测试我们发现,实例方法即非静态方法可以访问类中的任何变量和方法(包
括静态和非静态的),而静态方法中只能访问静态变量和静态方法。
究其原因,我们可以从jvm层面来理解实例方法和静态方法的区别:
实例方法
在jvm加载类的字节码文件到memory中时,并没有把类的所有方法都立即分配入口地址,例如实例方法即非静态方法,只有当我们创建对象时,类的实例方法才会被分配访问地址。同时,只要创建类的第一个对象时,类的实例方法的入口地址就会被分配,之后再创建此对象时不再给实例方法的分配新的地址,而是共享第一个对象被创建时分配的实例方法的入口地址,并且,只有当类的最后一个实例对象被销毁时才会将地址回收。
类方法(静态方法)
在jvm加载类的字节码文件到memory中时,类方法就会被分配入口地址,所以,类方法可以通过类来直接访问,而不需要对象创建后才能访问,而且由此知道,类方法的入口地址分配比实例方法要早,由此就可以解释上述程序中,为什么静态方法无法访问非静态变量和实例方法:
a.类方法中不能访问非静态变量和实例方法
因为非静态成员变量跟实例方法一样,只有在对象创建时才分配入口地址,而静态方法的入口地址分配又比实例方法早,导致此时非静态成员变量和实例方法还没有被分配到内存,所以无法访问
b.类方法中也不能访问super和this关键字
显然,我们知道this是指代本类的对象,super是出现继承时指向父类的对象,显然两者都依托于类的实例对象的创建,因为,静态方法中不能访问。
c.实例方法没有上述限制
显然通过实例方法和类方法分配内存的先后顺序显然知道