Java笔记,方法(Method)

Java中,带static的方法与不带static方法的区别

  • 生命周期(Lifecycle):
      静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到方法区内存(Method area Memory),不自动进行销毁,会一直存在于方法区内存中,直到JVM关闭。
       非静态方法(Non-Static Method)又叫实例方法,属于实例对象,实例化(new)后会分配到堆内存中,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收机制(GC)回收之后,也跟着消失。

  • 在内存中存储位置
    静态方法和静态变量创建后始终使用同一块内存,是连续的。
    非静态方法会存在于内存的多个地方,是离散的。

  • 效率
    静态方法的使用效率比非静态方法的效率高。

  • 线程安全
    静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
    非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。

  • 使用范围
    静态方法:⒈ 有静态属性的类,一般会定义静态方法。⒉ 没有属性的类,一般会定义静态方法。⒊ 如果一个方法与他所在类的实例对象无关,那么它就应该是静态的。静态方法可以被继承但是不能被覆盖。

  • 总计
    如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。如果从线程安全、性能、兼容性上来看,选用实例化方法为宜。

静态方法是通过"类名.方法名"的方式来调用的,任何的实例也都可以调用。

这个执行过程中没有“当前对象”,因为带有static的方法是通过类名的方式访问的,不需要对象的参与。this代表的是当前正在执行这个动作的对象。
因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和成员方法。

非静态方法(实例方法)的调用:
首先,先实例化(new)一个对象,此时就会在堆内存中开辟一块空间,存储这个对象,然后通过“引用.方法名()” 的形式来调用。请看下面例子。

例如:

用户类:User.class

public class User(){
   // 实例方法
   public void login(){
   		System.out.println("用户正在登录...");
   }
}

测试用户类:TestUser.class

public class TestUser{
	pubblic static void main()(String[] args) {
		 User u1 = new User();
		 u1.login();  // 方法的调用
	}
}

代码解读:
实例化一个对象,把对象的地址赋值给 User类型的变量’u1’(u1可以叫做引用),
通过这个引用找到对象的地址,调用这个对象的login方法。
new User();// 实例化一个对象
u1 // 变量/引用
u1.login // 调用User对象的login方法

JVM内存结分析图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44630560/article/details/105749258