1.static语法规则
static修饰符用于修饰成员变量和成员方法,其需要注意的有以下几点:
- 用static修饰后表示该成员(属性或方法)是静态成员;
- 静态成员属于类本身,而不属于某个具体的对象;
- 静态成员在内存中只存在一个,该类的所有对象共用这一个静态成员,即访问同一块内存;
- 静态成员可以直接通过类名.静态变量名直接访问,也可以通过对象访问;
- 如果静态成员是私有的,外部依然不能直接(通过类名)访问。
关于静态成员和静态属性的访问关系如下:
- 非静态方法可以静态属性、方法;
- 静态方法不可以访问非静态属性、方法;
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』。