当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

java的this关键字[Java编程]

赞助商链接



  本文“java的this关键字[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
假若有两个同范例的对象,辨别叫作a和b,那么您大概不知道如作甚这两个对象同时调用一个f()办法:

class Banana { void f(int i) { /* ... */ } }
Banana a = new Banana(), b = new Banana();
a.f(1);
b.f(2);

若只有一个名叫f()的办法,它怎样才能知道自己是为a还是为b调用的呢?
为了能用简便的、面向对象的语法来书写代码——亦即“将消息发给对象”,编译器为我们完成了一些幕后工作.此中的奥秘就是第一个自变量传送给办法f(),并且那个自变量是预备操作的那个对象的句柄.所从前述的两个办法调用就变成了下面这样的情势:

Banana.f(a,1);
Banana.f(b,2);

这是内部的表达情势,我们并不能这样书写表达式,并试图让编译器承受它.但是,通过它可理解幕后到底发生了什么事情.
假定我们在一个办法的内部,并但愿获得当前对象的句柄.由于那个句柄是由编译器“奥秘”传送的,所以没有标识符可用.但是,针对这一目的有个专用的关键字:this.this关键字(注意只能在办法内部利用)可为已调用了其办法的那个对象生成呼应的句柄.可象对待其他任何对象句柄一样对待这个句柄.但要注意,假如预备从自己某个类的另一个办法内部调用一个类办法,就没必要利用this.只需简单地调用那个办法便可.当前的this句柄会自动利用于其他办法.所以我们能利用下面这样的代码:

class Apricot {
void pick() { /* ... */ }
void pit() { pick(); /* ... */ }
}

在pit()内部,我们可以说this.pick(),但事实上无此必要.编译器能帮我们自动完成.this关键字只能用于那些特别的类——需明确利用当前对象的句柄.比方,假如您但愿将句柄返回给当前对象,那么它常常在return语句中利用.

//: Leaf.java
// Simple use of the "this" keyword

public class Leaf {
  private int i = 0;
  Leaf increment() {
    i++;
    return this;
  }
  void print() {
    System.out.println("i = " + i);
  }
  public static void main(String[] args) {
    Leaf x = new Leaf();
    x.increment().increment().increment().print();
  }
} ///:~

由于increment()通过this关键字返回当前对象的句柄,所以可以便利地对同一个对象履行多项操作.

1. 在构建器里调用构建器
若为一个类写了多个构建器,那么常常都需求在一个构建器里调用另一个构建器,以避免写反复的代码.可用this关键字做到这一点.
普通,当我们说this的时刻,都是指“这个对象”大概“当前对象”.并且它本身会产生当前对象的一个句柄.在一个构建器中,若为其赋予一个自变量列表,那么this关键字会具有差别的含义:它会对与那个自变量列表符合的构建器举行明确的调用.这样一来,我们便可通过一条直接的途径来调用其他构建器.以下所示:

//: Flower.java
// Calling constructors with "this"

public class Flower {
  private int petalCount = 0;
  private String s = new String("null");
  Flower(int petals) {
    petalCount = petals;
    System.out.println(
      "Constructor w/ int arg only, petalCount= "
      + petalCount);
  }
  Flower(String ss) {
    System.out.println(
      "Constructor w/ String arg only, s=" + ss);
    s = ss;
  }
  Flower(String s, int petals) {
    this(petals);
//!    this(s); // Can't call two!
    this.s = s; // Another use of "this"
    System.out.println("String & int args");
  }
  Flower() {
    this("hi", 47);
    System.out.println(
      "default constructor (no args)");
  }
  void print() {
//!    this(11); // Not inside non-constructor!
    System.out.println(
      "petalCount = " + petalCount + " s = "+ s);
  }
  public static void main(String[] args) {
    Flower x = new Flower();
    x.print();
  }
} ///:~
此中,构建器Flower(String s,int petals)向我们揭暴露这样一个问题:固然可用this调用一个构建器,但不可调用两个.除此以外,构建器调用必须是我们做的第一件事情,不然会收到编译程序的报错信息.
这个例子也向大家展示了this的另一项用处.由于自变量s的名字以及成员数据s的名字是相同的,所以会呈现混合.为办理这个问题,可用this.s来引用成员数据.常常城市在Java代码里看到这种情势的利用,本书的大量地方也采取了这种做法.
在print()中,我们发现编译器不让我们从除了一个构建器之外的其他任何办法内部调用一个构建器.

2. static的含义
理解了this关键字后,我们可更完好地理解static(静态)办法的含义.它意味着一个特定的办法没有this.我们不可从一个static办法内部发出对非static办法的调用(注释②),固然反过来说是可以的.并且在没有任何对象的前提下,我们可针对类本身发出对一个static办法的调用.事实上,那恰是static办法最基本的意义.它就好象我们成立一个全局函数的等价物(在C语言中).除了全局函数不答应在Java中利用以外,若将一个static办法置入一个类的内部,它便可以拜候其他static办法以及static字段.

②:有大概发出这类调用的一种情形是我们将一个对象句柄传到static办法内部.随后,通过句柄(此时实际是this),我们可调用非static办法,并拜候非static字段.但普通地,假如真的想要这样做,只要制作一个普通的、非static办法便可.

有些人抱怨static办法并非“面向对象”的,因为它们具有全局函数的某些特点;操纵static办法,我们没必要向对象发送一条消息,因为不存在this.这大概是一个清楚的自变量,若您发现自己利用了大量静态办法,就应重新考虑自己的战略.但是,static的概念是非常实用的,很多时刻都需求用到它.所以至于它们能否真的“面向对象”,应当留给理论家去谈论.事实上,即便Smalltalk在自己的“类办法”里也有近似于static的东西.
  以上是“java的this关键字[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .