static

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();
 
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值