以前做的总结:
首先、它是一个修饰符,只能修饰成员(成员变量和成员函数)
被static修饰的成员变量的数据,可以被所有的对象们共享。
被静态修饰的成员多了一种调用方式,就是除了被对象调用以外,还可以被类名直接调用,类名.静态成员。
静态之所可以被类名调用,那是因为静态成员是随着类的加载而加载进内存的。非静态的特点随着对象的加载而加载。
静态优先于对象加载进内存,所以不能访问对象的内容,但是对象可以访问它的内容。
被静态修饰的成员为共有数据,对象里面自身村存储的是特有数据。
Eg:饮水机是共有的,但是喝水的杯子是特有的。
静态的使用注意事项:
静态成员函数只能访问类中的静态成员,不能访问非静态的。非静态方法可以访问静态方法。
静态方法中不可能定义this spuer关键字,因为This代表的是对象,但是静态加载的时候都没有对象存在。
主函数是静态的。
实现代码:
Eg:class MainDemo
{
int x=4;
public static void main(String[] args)//String[] args=new String[0];
//public : 因为主函数是被JVM调用、权限必须足够大。
//static :
//void :没有返回值。不用返回值给JVM;
//main:比较特殊,jVM只能识别它,
//(String[] args):参数列表,数组类型。arguments
{
sop(args);//[Ljava.lang.String;@c17614 输出的数组实体地址。
//new MainDemo().show();//创建一个对象即可。
}
public static void main()//是可以存在的,重载。
{
}
void show()
{
sop(x);
}
}
编译失败:
被修饰后的成员具备以下特点:
class Person
{
String name;
static String country='CN';//每个对象都有国籍,都相同我们可以单独拿出来。
static void show()
//如果被静态修饰。name是不能被访问的。
//函数被静态修饰只能访问被静态修饰的成员,非静态成员不能访问。
{
Sop(country+name);//country之前省略了Person类,Person.country
}
}
class StaticDemo
{
public static void main(String[] args)
{
Person p=new Person();
p.name="zhangsan";
p.show();
Person p=new Person();
p.name="lisi";
p.show();
System.out.println(Person.country);被类名直接调用。
Person.show();
//直接调用show方法,说明自始至终在堆内存中没有name这个成员。
//当show方法进行输出语句的时候访问conutry和name,但是name
//是没有的,访问不到。
}
}
成员变量和静态变量的区别:
成员变量只能被对象所调用,静态成员变量除了可以被对象调用还可以被类名调用
成员变量也称为对象变量或者实列变量。因为成员变量是被对象使用的变量。静态变量也称为类变量。
成员变量是随着对象的出现而出现,随着对象的回收而消失。静态变量随着类的加载而加载,随着类的消失而消失。
一个代码中一个静态都不写是可以的,不写静态是因为静态的生命周期特别长,但是我们要考虑到代码的严谨性是需要写一些静态的。
什么时候使用静态?
成员变量:如果该变量的数据值每个对象都一样。就将其静态修饰,否则就是非静态。
成员函数:如果功能中没有访问到对象中的特有数据,那么就需要将该函数定义成静态,因为创建对象调用除了浪费堆内存空间没有意义。
实现代码:
Class Demo
{
Ststic int num=5;
String name;
Static Strng country="CN";
Void show()
{
Sop(this..name);
}
Static void show2()//为什么要静态修饰?
//因为这个方法在对象在堆内存创建的时候,被调用到了,但是至于它的执行语句并没有访问到任何对象中的属性,只是执行一个输出语句,如果不加static,当对象创建的时候再堆内存进行分配空间,默认初始化,以及分配地址值,这系列动作却没有任何指向引用它,它在堆内存中就相当于垃圾。这样做就没有任何意义了,所以我们用static来修饰它。
{
Sop("show run");
}
Static void show3()//因为访问到了静态成员变量num;
{
Sop(num);
}
} |