原理:大话面向对象(六):静态与非静态
作者:强哥   类别:PHP开发    日期:2017-12-05 10:13:43    阅读:936 次   消耗积分:0 分

在类当中,我们可以定义静态属性(成员变量)或行为(方法),也可以定义非静态属性或行为。但是在调用方式上,是有区别的。所谓“静态”是指该属性或行为不会随着类的实例化而在实例的内存空间中生成对应的对象。本文主要给大家聊一聊关于静态与非静态的问题。


1. 先定义一个类Top:

package com.woniuxy.java.oop;
 
public class Top {
    // 定义类级属性value,类型为int
    private int value = 1000;
 
    public int getValue() {
       return value;
    }
 
    public void setValue(int value) {
       this.value = value;
    }
}


2. 再实例化Top类:

public static void main(String[] args) {
    Top t1 = new Top();
    Top t2 = new Top();
    System.out.println("t1实例的值:" + t1.getValue());
    System.out.println("t2实例的值:" + t2.getValue());
    t1.setValue(2000);
    t2.setValue(3000);
    System.out.println("t1实例的值:" + t1.getValue());
    System.out.println("t2实例的值:" + t2.getValue());
}


如预期一样,输出结果为:

静态与非静态-1.png

上述结果不难理解,当我们实例化类的时候,类的所有属性都会在每一个实例中生成一份拷贝,所以我们通过不同的实例修改不同的值。




3. 使用static将属性value设置为静态:

public class Top {
    // 定义类级属性value,类型为int
    private static int value = 1000;
}

再运行上述代码,结果如下:

静态与非静态-2.png

之所以会有上述的结果,是因为如果类属性被设置为static后,这个属性的值将长驻在类的内存空间中,而不会随着实例化的过程,而将属性的值复制到实例内存中。所以任何一个实例去修改该静态属性,都会直接修改到同一个内存地址,进而导致类属性保存的是最后一次的值。


4.  使用static定义静态行为:

只需要在行为前添加一个关键字static即可,如:

public static void setValue(int value) {
    this.value = value;
}

则调用该静态行为时,只需要使用类名称直接调用即可。


5. 静态与非静态之间的调用规则:

类别

本类静态

(方法或变量)

本类非静态

版权所有,转载本站文章请注明出处:蜗牛笔记, http://www.woniunote.com/article/23
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}