static
static代表什么
static表示“全局”或者“静态”的意思,用来修饰成员变量或者方法,也可以修饰代码块。被static修饰的成员会在类加载的时候进行初始化与空间分配,被设置为静态后,成员会被存放在静态存储空间,全局共享一个值。因此访问被static修饰的成员时,可以使用className直接调用。
被static修饰的不依赖于对象,因为他先与对象生成,但是可以被对象共享,所有对象的引用指向的都是同一个地方,任何一个实例对象对其进行的修改都会导致其他实例的变化。
public class User {
private static int userNumber = 0 ;
public User(){
userNumber ++;
}
public static void main(String[] args) {
User user1 = new User();
User user2 = new User();
System.out.println("user1 userNumber:" + User.userNumber);
System.out.println("user2 userNumber:" + User.userNumber);
}
}
------------
Output:
user1 userNumber:2
user2 userNumber:2
可以看到user1输出的值也是2,是因为在new user2的时候,对静态变量userNumber进行了修改。
static如何使用
static可以用来修饰成员变量和成员方法,称之为静态变量和静态太方法,可以直接通过类名访问,也可以通过对象实例访问
static修饰的代码块是静态代码块,当类进行加载的时候,就会执行静态代码块。有的代码块比较适合用在静态代码块中。
static变量
静态变量和实例变量的区别:
静态变量是随着类加载时,完成初始化的,在内存中仅仅存在一个,且JVM只会为他分配一次内存,同时类的实例都是共享静态变量,可以直接通过类名,也可以通过对象实例访问。
实例变量是便随对象实例生成的,与对象实例同生共死。
所以一般在以下情况下使用静态变量:常量,对象之间共享数据,访问方便
static方法
非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员;
非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。静态方法不能用到this super等关键字,引用静态方法时,可以用类名.方法名或者对象名.方法名的形式。
static代码块
被static修饰的代码块,我们称之为静态代码块,静态代码块会随着类的加载一块执行,而且他可以随意放,可以存在于该了的任何地方。
static局限
- 只能调用static变量
- 只能调用static方法
- 不能引用super this
- static变量在定义时,要进行初始化,且初始化时间在类加载时候
总结:无论是变量,方法,还是代码块,只要用static修饰,就是在类被加载时就已经"准备好了",也就是可以被使用或者已经被执行,都可以脱离对象而执行。反之,如果没有static,则必须要依赖于对象实例。
this关键字
- this调用本类的属性,也就是类中的成员变量
- this调用本类中的其他方法
- this调用本类中的其他构造,并且只能放在构造方法的首行
调用本类成员变量
Public Class Student {
String name; //定义一个成员变量name
private void SetName(String name) { //定义一个参数(局部变量)name
this.name=name; //将局部变量的值传递给成员变量
}
}
这是一段最常见的代码,有一个成员变量name,在set方法中,将形参name传递给成员变量name。问题来了,编译器是如何判断是将形参name赋值给成员name,还是成员name传给形参name。这时候就是this起作用了,this这个关键字就是代表的是对象中的成员变量或者方法 ,也就是说只要加上this,变量指的就是这个对象的成员变量或者方法,而不是形参或者局部变量,因此上面代码就是指的将形参name,赋值给this.name(成员变量)。
一般情况下,引用成员变量或者成员方法的时候,都是以对象名.成员变量(成员方法)的方式。不过在考虑代码易读性的情况下,可以使用this关键字来区分现在引用的变量是成员变量,方法,而不是局部变量。可以理解为,this就是代表对象的名字。
调用本类构造方法
public class Student { //定义一个类,类的名字为student。
public Student() { //定义一个方法,名字与类相同故为构造方法
this(“Hello!”);
}
public Student(String name) { //定义一个带形式参数的构造方法
}
}
this除了能够调用成员变量和方法,还能调用构造函数。在上面的代码中定义了俩构造函数,在其中一个调用了另外一个构造函数this("hello")。在构造方法中调用this关键字 表示调用其他的构造函数,具体调用哪个是根据形参来决定的。
调用构造函数有一个限制,一般来说this关键字调用构造方法,只能方法构造方法的第一句。
返回对象的值
除了可以用来调用成员变量和方法之外,this关键字还有一个最大的作用是返回类的reference,在代码中,可以使用return this来返回某类的引用,这时候this关键字代表;类的名称。如果在代码上面student类中,那么代码的含义就是return student。课件,this还可以作为类的返回值。