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

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

作者: 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