java 类方法和实例方法 调用关系

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.实例方法没有上述限制

显然通过实例方法和类方法分配内存的先后顺序显然知道

参考文献:https://blog.csdn.net/mhady/article/details/51377579

你可能感兴趣的:(java 类方法和实例方法 调用关系)