static方法
1.在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的其它非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象
2.静态方法不能以任何方式引用this和super关键字,与上面的道理一样,因为静态方法在使用前不用创建任何实例对象。当静态方法被调用时,this所引用的对象根本没有产生。
3.静态方法只能访问类的静态成员。但非静态方法却可以访问类中的所有成员,包括静态成员
//本程序证明了A类的多个对象共用一个static属性
class A{
public static int i=10;
public void show()
{
System.out.printf("%d\n",i);
}
}
class M
{
public static void main(String[] args)
{
A aa1 = new A();
A aa2 = new A();
aa1.i = 20;
aa2.show();
}
}
--------++++++++++++++++++++++++++++++++------
//本程序证明了static属性i是属于类本身。或者讲,没有对象。我们仍可以直接通过类名的方式访问类内部的static属性
class A
{
public static int i=10;
}
}
class TestStatic2
{
public static void main(String[] args)
{
System.out.printf("%d",A.i);
}
}
------+++++++++++++++++++++++++++++++++-------
//static属性和方法虽然属于类本身,虽然可以通过类名的方式访问,但是static属性和方法很明显属性类对象,当然也可以通过类对象名的方式访问
class A
{
public static int i=10;
public static void f()
{
System.out.printf("djskfs\n");
}
}
class TestStatic3
{
public static void main(String[] args)
{
A aa = new A();
aa.f();
System.out.printf("%d\n",aa.i);
}
}
--------++++++++++++++++++++++++++++++++-------
//只有非私有的成员才可以通过类名的方式访问
//static只是表明了该成员具有了可以通过类名访问的潜在特征,但是否可以通过类名访问,还必须满足一个条件该成员必须是一个非private
class A
{
protected static int i=10;
private static void f()//非私有才可以访问
{
System.out.printf("djskfs\n");
}
}
class TestStatic4
{
public static void main(String[] args)
{
//A.f();//错误
A.i = 22;
}
}
-------+++++++++++++++++++++++++++++++++++-------
class A
{
private static int i=10;
public static void f()
{
//g();//静态方法不能访问非静态成员
//j = 22;//错误
System.out.printf("ggg\n");
}
public void g()
{
//f();//ok,说明非静态方法可以访问静态方法
System.out.printf("gggg\n");
}
}
class TestStatic5
{
public static void main(String[] args)
{
A aa= new A();
aa.g();
}
}
++++++++++++++++++++++++++++++++++++++
典例
1.计算对象的个数
class A
{
private int i;
private static int cnt = 0;
public A()
{
++cnt;
}
public A(int i)
{
this.i = i;
++cnt;
}
public static int getCnt()
{
return cnt; //返回的是A对象的个数
//静态属性不能加this 如:return this.cnt;
}
}
public class TestStatic_1
{
public static void main(String[] args)
{
System.out.printf("当前时刻A对象的个数:%d\n",A.getCnt());
A aa1 = new A();
System.out.printf("当前时刻A对象的个数:%d\n",A.getCnt());
A aa2 = new A();
System.out.printf("当前时刻A对象的个数:%d\n",A.getCnt());
}
}
2.只生成一个对象
class A
{
public int i = 20;
private static A aa = new A();//aa是A对象的属性,不能省略,静态的不能访问非静态的
private A()//就不可以new一个事物
{
}
public static A getA()//static 一定是不能省略的
{
return aa;
}
}
public class TestStatic_2
{
public static void main(String[] args)
{
A aa1 = A.getA();
A aa2 = A.getA();
aa1.i = 99;
System.out.printf("%d\n",aa2.i);
if(aa1 == aa2)
System.out.printf("aa1和aa2相等");
else
System.out.printf("aa1和aa2不相等");
//A aa1 = new A();如果A类的构造方法是private,则new A()就报错
//A aa2 = new A();
}
}