thinking in java (四) ----- static与this关键字

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局限

  1. 只能调用static变量
  2. 只能调用static方法
  3. 不能引用super this
  4. static变量在定义时,要进行初始化,且初始化时间在类加载时候

总结无论是变量,方法,还是代码块,只要用static修饰,就是在类被加载时就已经"准备好了",也就是可以被使用或者已经被执行,都可以脱离对象而执行。反之,如果没有static,则必须要依赖于对象实例。

this关键字

  1.  this调用本类的属性,也就是类中的成员变量
  2. this调用本类中的其他方法
  3. 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还可以作为类的返回值。

参考: http://www.cnblogs.com/chenssy/

猜你喜欢

转载自blog.csdn.net/sinat_38430122/article/details/82983680