Java基础_07 | static修饰符详解(统计出一个类总共产生了多少个对象、一个类只能生产一个对象的设计方法)

136 阅读3分钟

1.static语法规则

static修饰符用于修饰成员变量和成员方法,其需要注意的有以下几点:

  1. 用static修饰后表示该成员(属性或方法)是静态成员;
  2. 静态成员属于类本身,而不属于某个具体的对象;
  3. 静态成员在内存中只存在一个,该类的所有对象共用这一个静态成员,即访问同一块内存;
  4. 静态成员可以直接通过类名.静态变量名直接访问,也可以通过对象访问;
  5. 如果静态成员是私有的,外部依然不能直接(通过类名)访问。

关于静态成员和静态属性的访问关系如下:

  • 非静态方法可以静态属性、方法;
  • 静态方法不可以访问非静态属性、方法;

2.示例—— 统计出一个类总共产生了多少个对象

/**
 * @brief   使用static静态变量统计该类总共产生对象的数量
 * @author  mculover666
 * @date    2019/4/26
 * 
*/
class A
{
    /* private设置为私有的,防止外部访问 */
    private static int count = 0;

    public A()
    {
        //每次生成对象时count自加
        count++;
    }

    /**
     * 获取当前生成对象的数量
     * 1.静态方法,可以通过类名访问
     * 2.公有的,外部的任何地方都可以访问
     */
    public static int getCnt()
    {
        return count;
    }

}
class TestStatic1
{
    public static void main(String[] args) {

        /* 创建5个对象 */
        A aa1 = new A();
        A aa2 = new A();
        A aa3 = new A();
        A aa4 = new A();
        A aa5 = new A();

        /* 输出当前产生对象的数目 */
        System.out.println("A类产生了"+ A.getCnt() + "个对象.");
    }
}

运行结果如图:

3. 示例—— 一个类只能生产一个对象的设计方法

/**
 * @brief   使用static修饰符使一个类只能产生一个对象
 * @author  mculover666
 * @date    2019/4/26
 * 
*/
class A
{
    //为了后续测试是否只生成了一个对象
    public int i = 10;
    
    /**   
     * 1.使用默认构造函数产生一个对象;
     * 2.修饰为private,不可被外部访问;
     * 3.修饰为static,在内存中只能有一个该对象。 
     **/
    private static A aa = new A();

    /* 构造函数修饰为私有的,外部不能再使用new A()产生新对象 */
    private A()
    {
        System.out.println("一个A类对象被生成.");
    }

    /**
     * 1.对外部提供一个获取A类对象的方法;
     * 2.修饰为public,外部任何地方都可访问;
     * 3.修饰为static方法,因为其中的aa属性是静态的,只能由静态方法访问;
     * 4.返回值为A类型,返回A类对象aa的地址;
     */
    public static A getA()
    {
        return aa;
    }
}
class TestStatic2
{
    public static void main(String[] args) {
        
        /**
         * 1.默认构造函数A()是私有的,所以不能再使用new A()获取对象;
         * 2.使用类A提供的静态获取对象方法getA();
         */
        A a1 = A.getA();
        A a2 = A.getA();

        /**
         * 开始测试a1和a2是否引用的是同一个对象 
         * 1.i的值默认是10;
         * 2.修改a1对象i属性的值,看a2对象i属性的值是否改变
         */
        a1.i = 99;
        System.out.println("a1.i = " + a1.i);
        System.out.println("a2.i = " + a2.i);

    }
}

运行结果如图:

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』