免费个人微网站,免费 flash网站源码,网上营业执照申请,韩国建筑网站this 关键字 如果有两个同类型的对象#xff0c;分别叫作a 和b#xff0c;那么您也许不知道如何为这两个对象同时调用一个 f()方法#xff1a; class Banana { void f(int i) { /* ... */ } }
Banana a new Banana(), b new Banana();
a.f(1);
b.f(2); 若只有一个名叫f()的… this 关键字 如果有两个同类型的对象分别叫作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); // Cant call two!this.s s; // Another use of thisSystem.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()中我们发现编译器不让我们从除了一个构建器之外的其他任何方法内部调用一个构建器。 个人总结: this关键字必须写在构造方法内部 在构造函数中如果你不指定构造器之间的调用关系那么编译器会给你加上super目的是在初始化当前对象时先保证了父类对象先初始化。所以你指定了构造函数间的调用那么this必须在第一行以保证在执行任何动作前对象已经完成了初始化。 构造函数只能被构造函数调用因为对象只会初始化一次。 构造方法调用语句放在第一 为了避免构建出两个对象这种问题的出现Java在编译时对这种情况做了强校验用户不能再同一个方法内调用多次this()或super()同时为了避免对对象本身进行操作时对象本身还未构建成功(也就找不到对应对象),所以对this()或super()的调用只能在构造方法中的第一行实现防止异常。 在构造方法内部,只能调用一个构造方法 类似this()和super()这样的方法被称为构造方法顾名思义他的作用就是在JVM堆中构建出一个指定类型的对象如果你调用了两个这种形式的方法岂不是代表着构建出了两个对象。 非构造方法不能在方法内部调用构造方法 在普通的成员方法中如果调用super()或者this()你是想要重新创建一个对象吗抱歉Java为了保证自身对象的合理性不允许你做这样的操作。 参考文章 http://blog.csdn.net/lsly521/article/details/52243783 转载于:https://www.cnblogs.com/aotemanzhifu/p/9192425.html
相关文章: