标签:
两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1)
或者b.fun(1)
如果按照更容易理解的角度来看的话,或许可以写成: Banana.fun(a,1)
这样就更符合OOP的”发送消息给对象”的原则了. 但是java帮助我们做了很多事情,在调用每个方法的时候,默认第一个传入的参数就是调用该方法的对象的引用. 让我们可以写成a.fun(1)
.
理解了函数调用的方法,那么对于this就很好理解了. this是一个特殊的引用. 它表示调用方法的那个对象.
在一个类的内部调用该类的其他方法,可是省略this,因为编译器会自动添加”this”
埃尔克,埃大爷说在一个类的内部调用该类的其他方法的时候,不建议写this. 因为编译器已经自动帮你做了这个事情,你还去写,你是不是傻. 但是,我还是觉得,至少看上去代码格式比较统一,而且我的eclipse的自动提示触发只保留了”.”,写this.
会自动提示…既然没有什么性能上的区别,这个就看个人风格了.
this代表调用方法的那个对象的引用. 理解了这一点this就可以用来做很多很神奇的事情.
返回该对象
比如下面这个例子这样,可以返回当前调用函数的对象.
public class Leaf {
int i=0;
public Leaf increment(){
i++;
return this;
}
public void print(){
System.out.println("i="+this.i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().increment().print();
}
}
this作为参数传入给一个方法
比如这个例子
class Person{
public void eat(Apple apple){
Apple peeled = apple.getPeeled();
System.out.println("eat apple...");
}
}
class Peeler{
public static Apple peel(Apple apple){
System.out.println("peeled...");
return apple;
}
}
class Apple{
public Apple getPeeled(){
return Peeler.peel(this);
}
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}
在构造方法中调用另外一个构造方法
在构造函数中可以去调用另外一个构造函数. 但是有一点需要注意,这种调用只能使用一次,而且必须写在起始行.
public class PersonTest {
private String name;
private int age=18;
public PersonTest() {
}
PersonTest(String name){
this.name = name;
}
public PersonTest(String name,int age) {
this(name);
this.age=age;
}
@Override
public String toString() {
return "PersonTest [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args) {
PersonTest pt1 = new PersonTest("tom");
PersonTest pt2 = new PersonTest("jim",20);
System.out.println(pt1);
System.out.println(pt2);
}
}
理解了this之后,static方法就很好理解. static方法又叫静态方法,有点像全局方法. 埃大爷的说,static方法就是没有this的方法. 也就是说不需要通过实例来调用的方法.
这个解释简直精辟到无以附加,对埃大爷的崇拜突然如滔滔江水连绵不绝. 因为没有this,所以无法调用非静态方法.前面说了实例方法调用的时候默认第一个形参传入的是this. static方法没有传入this,那么在其中是无法调用实例方法的. 同理也没有办法调用实例变量.
反证法,如果static方法可以调用实例方法和实例变量. 因为static方法是属于一个类的. 通过类名来调用. 那么在调用static方法的时候,很有可能根本就没有创建这个类的实例,那么问题来了. 既然没有实例,那么不可能调用到实例方法和实例变量. 所以static方法不能调用实例方法和实例变量.
一个正常的类不应该存在过多的static方法.这玩意儿更像是一个全局方法,java中是禁止全局方法的. 但是有个特例,工具类中的方法绝大部分都应该是static.
标签:
原文地址:http://www.cnblogs.com/thecatcher/p/5838406.html