1 static关键字
-
可以修饰属性变量,方法和代码段
-
static修饰的属性称为静态属性或类属性, 在类加载时就在方法区为属性开辟存储空间,无论创建多少个对象,静态属性在内存中只有一份。
可以使用 类名.静态属性 的方式引用
-
static修饰的方法称为静态方法或类方法,在类加载时就在方法区中开辟存储空间,存储方法中信息,在调用静态方法时,不会默认传递this参数。
可以使用 类名.方法() 的方式引用
-
static修饰的代码段称为静态代码段,在类加载时就自动执行,且仅执行一次。
一般初始化操作可以写在静态代码段中。
-
1.1 对象属性与静态属性
对象属性:
class A{
int i ;
}
class Test{
main(){
A a= new A();
a.i = 10 ;
}
}
静态属性
class A{
static int i ;
}
class Test{
main(){
A.j = 20 ;
}
}
-
对象属性:只有创建对象,才能引用。
-
静态属性:可以通过类名直接引用。不需要创建对象。 通过对象也可以引用。
类加载时开辟存储空间, 只有一份, 可以数据共享。
1.2 对象方法与静态方法
特点1
无论是静态方法还是对象方法,都是在类加载的时候,就在方法区中分配了存储空间
无论创建多少个对象,方法在内存中只存储一次。
特点2
在使用上, 对象方法的使用,必须先创建对象,才能调用。
而静态方法,可以通过类名直接调用
特点3
尽然对象方法在内存中只有1份,怎么做到不同对象调用,可以访问不同对象的属性呢?
-
当通过对象调用对象方法时,会默认传递一个参数,这个实参就是当前对象的地址。这个形参就是this
-
当通过类调用类方法时,就不会传递对象地址(此时没有对象),静态方法也没有this这个默认参数
简单来说,对象方法和静态方法的区别就在于是否需要引用对象自己的属性变量。
扩展1
静态方法中,不能使用this关键字。(压根就没有)
静态方法中只能直接使用静态成员(属性和方法),不能直接使用非静态成员。
在对象方法中,可以使用对象成员,也可以使用静态成员。
扩展2
对象方法中会有一个默认的参数叫this,存储的是调用当前方法的那个对象的地址
所以可以通过this,访问指定对象的属性。
默认情况下,访问对象的属性和其他方法时,jvm会自动的根据this的地址访问,而不需要编码时必须使用this关键字
class A{
int i ;
public void t1(){
i = 20 ; //等价于 this.i = 20 ;
}
}
什么情况下必须写this呢?
-
局部变量与属性变量同名时,默认引用的是局部变量
-
调用重载的构造方法的时候
扩展3
方法到底是如何起作用的,以及有与属性同名的变量和没有同名变量的引用过程