美文网首页
二、静态方法和非静态方法

二、静态方法和非静态方法

作者: maololo | 来源:发表于2018-07-18 17:23 被阅读59次

一、生命周期

静态方法(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的时候运行,并且只会被服务器调用一次,类似于Sercletinti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

5、被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

相关文章

网友评论

      本文标题:二、静态方法和非静态方法

      本文链接:https://www.haomeiwen.com/subject/sogopftx.html