java的static和this

1>static:静态修饰符
    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也能够造成静态static代码块,可是Java语言中没有全局变量的概念。
    被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的全部实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。所以,static对象能够在它的任何对象建立以前访问,无需引用任何对象。
    用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的全部实例共享同一个static变量。
 
    static变量前能够有private修饰,表示这个变量能够在类的静态代码块中,或者类的其余静态成员方法中使用(固然也能够在非静态成员方法中使用--废话),可是不能在其余类中经过类名来直接引用,这一点很重要。实际上你须要搞明白,private是访问权限限定,static表示不要实例化就可使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
 
 
    static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,能够直接经过类名来访问,访问语法为:
类名.静态方法名(参数列表...) 
类名.静态变量名
 
        用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处很是大)。
 
一、static变量
   按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另外一种是没有被static修饰的变量,叫实例变量。
二者的区别是:
   对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程当中完成静态变量的内存分配,可用类名直接访问(方便),固然也能够经过对象来访问(可是这是不推荐的)。
    对于实例变量,没建立一个实例,就会为实例变量分配一次内存,实例变量能够在内存中有多个拷贝,互不影响(灵活)。
 
二、静态方法
   静态方法能够直接经过类名调用,任何的实例也均可以调用,所以静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。由于实例成员与特定的对象关联!这个须要去理解,想明白其中的道理,不是记忆!!!
    由于static方法独立于任何实例,所以static方法必须被实现,而不能是抽象的abstract。
 
 
 
三、static代码块
   static代码块也叫静态代码块,是在类中独立于类成员的static语句块,能够有多个,位置能够随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,若是static代码块有多个,JVM将按照它们在类中出现的前后顺序依次执行它们,每一个代码块只会被执行一次。例如:
 
 
public class Test5 { 
        private static int a; 
        private int b; 

        static { 
                Test5.a = 3; 
                System.out.println(a); 
                Test5 t = new Test5(); 
                t.f(); 
                t.b = 1000; 
                System.out.println(t.b); 
        } 

        static { 
                Test5.a = 4; 
                System.out.println(a); 
        } 

        public static void main(String[] args) { 
                // TODO 自动生成方法存根 
        } 

        static { 
                Test5.a = 5; 
                System.out.println(a); 
        } 

        public void f() { 
                System.out.println("hhahhahah"); 
        } 
}
 

  

 
 
 
运行结果:3
hhahhahah
1000
4
利用静态代码块能够对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候能够直接调用而不用建立实例。
 
2>this:表明当前的对象

1、this关键字主要有三个应用:java

      (1)this调用本类中的属性,也就是类中的成员变量; 程序员

      (2)this调用本类中的其余方法; this

      (3)this调用本类中的其余构造方法,调用时要放在构造方法的首行。spa

 

Public Class Student 
{ 
    String name; 
    //定义一个成员变量name 
    private void SetName(String name) 
        { 
           //定义一个参数(局部变量)
           name this.name=name; 
           //将局部变量的值传递给成员变量 
          } 
}

 

  

 

 

 应用一:引用成员变量 翻译

    如上面这段代码中,有一个成员变量name,同时在方法中有一个形式参数,名字也是name,而后在方法中将形式参数name的值传递给成员变量name,虽然咱们能够看明白这个代码的含义,可是做为Java编译器它是怎么判断的呢?究竟是将形式参数name的值传递给成员变量name,仍是反过来将成员变量name的值传递给形式参数name呢?也就是说,两个变量名字若是相同的话,那么Java如何判断使用哪一个变量?此时this这个关键字就起到做用了。this这个关键字其表明的就是对象中的成员变量或者方法。也就是说,若是在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。为此在上面这个代码中,this.name表明的就是对象中的成员变量,又叫作对象的属性,然后面的name则是方法的形式参数,代码this.name=name就是将形式参数的值传递给成员变量。这就是上面这个代码的具体含义。 对象

    通常状况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即便在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量,这主要是从便于代码的阅读考虑的。一看到这个this关键字就知道如今引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提升了代码的阅读性。不过话说回来,这是this关键字在Java语言中的最简单的应用。从这个应用中,咱们能够看出this关键字其表明的就是对象的名字。 其实若是是局部变量的话,也是相同的道理。如在上面的代码中,name不是形式参数,而是一个局部变量。此时Java也会遇到相同的疑惑,即变量名name表明的究竟是局部变量仍是形式参数?name=name到底表明的是什么含义?根据局部变量的做用域,在方法内部,若是局部变量与成员变量同名的话,那么是以局部变量为准。但是在name=name这个赋值语句中,将局部变量的值赋值给本身,显然并非很合适。根据代码的含义,原本的意思应该是将局部变量赋值给成员变量。为了更清晰的表达这个含义,为此最好采用以下的书写格式this.name=name。这里的this关键字含义就是对象名student,为此this.name就表示student.nameblog

应用二:调用类的构造方法 内存

  

public class Student {
   //定义一个类,类的名字为student。
public Student() 
{
  //定义一个方法,名字与类相同故为构造方法 
    this(“Hello!”); }
 public Student(String name) 
{ //定义一个带形式参数的构造方法 } 
}

 

  

 

this关键字除了能够调用成员变量以外,还能够调用构造方法。在一个Java类中,其方法能够分为成员方法和构造方法两种。构造方法是一个与类同名的方法,在Java类中必须存在一个构造方法。若是在代码中没有显示的体现构造方法的话,那么编译器在编译的时候会自动添加一个没有形式参数的构造方法。这个构造方法跟普通的成员方法仍是有不少不一样的地方。如构造方法一概是没有返回值的,并且也不用void关键字来讲明这个构造方法没有返回值。而普通的方法能够有返回值、也能够没有返回值,程序员能够根据本身的须要来定义。不过若是普通的方法没有返回值的话,那么必定要在方法定义的时候采用void关键字来进行说明。其次构造方法的名字有严格的要求,即必须与类的名字相同。也就是说,Java编译器发现有个方法与类的名字相同才把其看成构造方法来对待。而对于普通方法的话,则要求不可以与类的名字相同,并且多个成员方法不可以采用相同的名字。在一个类中能够存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不一样。Java语言就凭形式参数不一样来判断调用那个构造方法。 作用域

    在上面这段代码中,定义了两个构造方法,一个带参数,另外一个没有带参数。构造方法都不会有返回值,不过因为构造方法的特殊性,为此没必要要在构造方法定义时带上void关键字来讲明这个问题。在第一个没有带参数的构造方法中,使用了this(“Hello!”)这句代码,这句代码表示什么含义呢?在构造方法中使this关键字表示调用类中的构造方法。若是一个类中有多个构造方法,由于其名字都相同,跟类名一致,那么这个this究竟是调用哪一个构造方法呢?其实,这跟采用其余方法引用构造方法同样,都是经过形式参数来调用构造方法的。如上例中,this关键字后面加上了一个参数,那么就表示其引用的是带参数的构造方法。若是如今有三个构造方法,分别为不带参数、带一个参数、带两个参数。那么Java编译器会根据所传递的参数数量的不一样,来判断该调用哪一个构造方法。从上面示例中能够看出,this关键字不只能够用来引用成员变量,并且还能够用来引用构造方法。 编译器

    不过若是要使用这种方式来调用构造方法的话,有一个语法上的限制。通常来讲,利用this关键字来调用构造方法,只有在无参数构造方法中第一句使用this调用有参数的构造方法。不然的话,翻译的时候,就会有错误信息。这跟引用成员变量不一样。若是引用成员变量的话,this关键字是没有位置上的限制的。若是不熟悉这个限制的话,那么仍是老老实实的采用传统的构造方法调用方式为好。虽然比较麻烦,可是至少不会出错。

应用三:返回对象的值

    this关键字除了能够引用变量或者成员方法以外,还有一个重大的做用就是返回类的引用。如在代码中,可使用return this,来返回某个类的引用。此时这个this关键字就表明类的名称。如代码在上面student类中,那么代码表明的含义就是return student。可见,这个this关键字除了能够引用变量或者成员方法以外,还能够做为类的返回值,这才是this关键字最引人注意的地方。

相关文章
相关标签/搜索