一、生命周期
静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到
JVM
关闭。
非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被
JVM
回收之后,也跟着消失。
二、线程安全
静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
三、要点
静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在。
四、实例
1、在一个类的静态成员中去访问其非静态成员,因为类的静态成员先于类的非静态成员存在,访问一个内存中不存在的东西会出错。
2、非静态方法可以引用静态变量,因为静态变量是存储在静态内存单元内,可以直接用类进行调用,也可以用实例化的对象对其引用。
实现静态方法调用非静态方法
package com.hn.lz.util;
import com.hn.lz.model.Dep;
import com.hn.lz.model.User;
import com.hn.lz.service.DepService;
import com.hn.lz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class BeanUtil {
@Autowired
private UserService userService;
@Autowired
private DepService depService;
private static BeanUtil beanUtil;
@PostConstruct
public void init() {
beanUtil = this;
beanUtil.userService = this.userService;
beanUtil.depService = this.depService;
}
/**
* 根据ID获取用户名称
* @param id
* @return
*/
public static String getUserNameById(String id){
User data = beanUtil.userService.query(id);
return data != null ? data.getName() : "";
}
/**
* 根据ID获取部门名称
* @param id
* @return
*/
public static String getDepNameById(String id){
Dep data = beanUtil.depService.query(id);
return data != null ? data.getName() : "";
}
}
3、Servlet
增加了两个影响Servlet
生命周期的注解(Annotation)@PostConstruct
,@PreConstruct
这两个注解被用来修饰一个非静态的void()
方法,而且这个方法不能有抛出异常声明。在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring
容器初始化的时候执行该方法。
4、被@PostConstruct
修饰的方法会在服务器加载Servlet
的时候运行,并且只会被服务器调用一次,类似于Serclet
的inti()
方法。被@PostConstruct
修饰的方法会在构造函数之后,init()
方法之前运行。
5、被@PreConstruct
修饰的方法会在服务器卸载Servlet
的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()
方法。被@PreConstruct
修饰的方法会在destroy()
方法之后运行,在Servlet
被彻底卸载之前。
网友评论