• Java中类方法与实例方法的区别


    一. 实例方法

    当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。

    二. 类方法

    当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。

    因为类方法的入口地址的分配要早于实例方法的入口地址分配时间,所有在定义类方法和实例方法是有以下规则需要遵循:

    1. 在类方法中不能引用实例变量

    实例变量的定义类似实例方法,没有用static修饰的变量,实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以在类方法中是不能引用实例变量的,因为这个时候实例变量还没有分配内存地址。

    2. 在类方法中不能使用super和this关键字

    这是因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建。

    3. 类方法中不能直接调用实例方法(mian方法中,怎么可以用对象调用实例方法)其他的类方法也可以调用实例方法))

    静态方法不能直接调用实例方法和变量,但可以间接调用(即在静态方法中创建类的实例,然后调用)

    原因同1。

    与类方法相比,实例方法的定义就没有什么限制了:

    1. 实例方法可以引用类变量和实例变量

    2. 实例方法可以使用super和this关键字

    3. 实例方法中可以调用类方法

    (1)实例方法可以直接访问实例变量,调用实例方法;

      (2) 实例方法可以直接访问类变量,调用类方法。但不推荐这么做,原因是不清晰,容易把类变量误认为是实例变量,把类方法误认为是实例方法(借助IDE,它会给出警告信息。);

      (3)类方法可以直接调用类变量和类方法;

    (4)类方法不能直接调用实例变量和实例方法;

      (5)类方法里面不能使用“this”关键字,因为没有实例存在,“this”不知道引用哪个实例。

  • 相关阅读:
    Spring IOC
    C++ 内存模型
    C++ 多态
    Java 多态
    Java 自动装箱与自动拆箱
    C++ priority_queue
    多个页面使用到一些名称类的同一个接口,借助vuex实现
    element-ui自定义表单验证
    vue项目中导出excel文件
    数组对象根据某个属性进行排序
  • 原文地址:https://www.cnblogs.com/Pjson/p/8627142.html
Copyright © 2020-2023  润新知