1.static定义属性
!!!!static属性和方法可以在没有实例化的情况下直接由类名称调用!!!!
staic属性保存在全局数据区!!!!!
内存区一共分为四个:栈内存(存地址),堆内存(存普通属性),全局数据区(存放static数据),全局代码区(存放所有方法)。
一旦在属性定义上使用了static之后,只要有一个对象修改了属性的内容,那么其所有的对象对应的属性内容也随之改变。
static属性与普通属性(非static属性)最大的区别就是保持的内存区域的不同。
static属性和非static属性最大的区别:所有的非static属性必须产生实例化对象之后才可以访问,但是static属性不受实例化对象的控制,也就是说,在没有实例化对象产生的情况下,依然可以使用static属性。
static定义属性的一个特征:虽然定义在类结构里面,但是并不受到对象的控制,是独立于类存在的。
Q:那么什么时候使用static属性?什么时候不使用static属性?
A:在你编写类的过程中,你所选择的首要的修饰符一定不是static(大部分情况下),如果需要描述出共享信息的时候再使用static(可以方便集体修改,避免重复开辟内存空间)。
2.static定义方法
对于类中的方法则可分为static方法和非static方法。这两组方法间的访问也将受到限制:
static方法不能直接访问非static属性或方法,只能够调用static属性或者方法。
非static方法可以访问static属性或方法,不受任何的限制。
Q:那为什么会存在以上的限制呢?
A:所有的非static定义的结构,必须在类已经明确的产生了实例化对象才会分配堆内存空间,才可以使用。
A:所有的static定义的结构,不受实例化对象的控制,即可以在没有实例化对象时候访问。
3.主方法
实在是有点长..............
public:主方法是程序的开始,所以这个方法对任何的操作都是可见的,那么就用public(公共)描述。
static:证明此方法是由类名称调用的。
void:主方法是一切的执行的开始点,既然是所有的开头,那么就不能够回头,执行完毕为止。
main:是一个系统规定好的名次,不能被修改。
String[] args:指程序运行时传递的参数
4.static的实际应用
1.实现类实例化对象个数的统计
希望每当实例化一个类的对象的时候都可以打印一个信息:产生的第x个实例化对象
class Took{
private static int num=0;
public Took() {
num++;
System.out.println("这是第"+num+"个产生的对象");
}
}
public class Test2 {
public static void main(String[] args) {
new Took(); new Took(); new Took();
new Took(); new Took(); new Took();
}
}
2.实现属性的自动设置
例如:某一个类有一个无参构造方法,一个有构造方法,有参构造主要的目的是传递一个title属性,但是希望不管调用的是无参的还是有参的构造,都可以为title设置内容(尽量不使用重复的内容设置)
class Took{
private String title;
private static int num=0;
public Took() {
this("NOTITLE-"+num++);
}
public Took(String title) {
this.title=title;
}
public String getTitle() {
return this.title;
}
}
public class Test2 {
public static void main(String[] args) {
System.out.println(new Took("Java开发").getTitle());
System.out.println(new Took().getTitle());
}
}
此时就算没有设置title属性的内容那么结果也不会为null