1.用在类中修饰成员(属性和方法),不能修饰构造方法
用static修饰的成员是属于类本身的(存放在数据存储区),而不是属于对象,被类的所有对象所共有。可以通过类名的方式或类对象名访问static属性的成员(通过类名访问的条件:静态非私有的成员)。
class A
{
static int i = 1;
public static void show()
{
System.out.println("嘿嘿");
}
}
class Test
{
public static void main(String[] args)
{
System.out.println("i = "+A.i);
A.show();
}
}
2.静态方法只能访问同类中的静态成员(变量和方法),不能访问非静态成员。非静态方法可以访问类中所有的成员,包括静态成员。
原因:非静态成员需要实例对象才能访问,而静态方法在使用前不用创建实例对象
class A
{
public int i = 1;
static void f()
{
g();//错误:静态方法不能访问非静态成员
i = 2;//错误,同样不能访问
}
public void g()
{
f();//OK,说明非静态方法可以访问静态成员
}
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
a1.g();
}
}
3.静态方法不能以任何方式引用this和super关键字。
因为静态方法在使用前不用创建实例对象,当静态方法被调用时,this所引用的对象还没产生。
4.static的例子
- 编写一个程序统计该类创建了多少个对象
class A
{
private int i;
private static int count = 0;//对象个数,因为Count是所以对象公用的,所以用static减少内存占用
public static int getCount() //获得该类产生的对象个数
{
return count;
}
public A()
{
++count;
}
public A(int i)
{
this.i = i;
++count;
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
A a1 = new A();
System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
A a2 = new A(1);
System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
}
}
当前时刻创建的A对象个数为:0
当前时刻创建的A对象个数为:1
当前时刻创建的A对象个数为:2
- 要求一个类只能创建一个对象
类中的成员可以是属性,方法,也可以是对象(其他类的对象或者自身的对象)
class A
{
public int i = 1;
private static A a1 = new A();//a是A的唯一一个对象,同时也是A的成员,static一定要有,否则后面的getA()无法访问
private A() //private保证外部无法new A的对象,只能在A的内部创建
{
}
public static A getA()//对外部提供的接口,只能是静态的;A说明该方法返回的是A的对象
{
return a1;
}
}
public class Test
{
public static void main(String[] args)
{
A a2 = A.getA();
A a3 = A.getA();
a2.i = 2;
System.out.println(a3.i);
if (a2 == a3)
{
System.out.println("a1和a2相等");
}
}
}
2 //说明a3和a2是同一个i
a1和a2相等