this是链式编程的关键
static关键字是在类加载到jvm(虚拟机)的时候自动去执行的,而且只执行一次。
this关键字
我们来看下面一段代码
class Banana1{
void peel(int i){
System.out.println("剥第"+i+"个Banana");
}
}
public class BananaPell {
public static void main(String[] args) {
Banana1 banana0 = new Banana1();
Banana1 banana1 = new Banana1();
banana0.peel(1);
banana1.peel(2);
}
}
我们发现,我们用两个banana对象的引用去调用peel()方法。但是只有一个peel()方法,那么编译器是如何知道是哪个引用调用了peel()方法呢?原来,编译器在执行的时候偷偷的把所操作对象的引用也作为一个参数来传递给了peel()方法。为此我们用this关键字来表示。this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。<br />同样的我们也可以用this来返回当前对象的引用,所以我们就可以在一条语句中对一个对象执行多次操作,我们就就可以运用this去进行链式编程了。
class Leaf{
int i=0;
Leaf increment(){
i++;
return this;
}
void print(){
print("i的值为"+i)
}
public static void main(String []args){
Leat leaf=new Leat();
l.increment().print();
}
}
这里increment()方法通过return this 把返回了当前对象的引用
同样this也可以把当前对象传递给其他方法
class Person {
public void eat(Apple apple) {
Apple appled = apple.gePeeled();
System.out.println("111111");
}
}
class Peeler{
static Apple peel(Apple apple){
return apple;
}
@Override
public String toString() {
return "Peeler{}";
}
}
class Apple {
Apple gePeeled(){
System.out.println(this);
return Peeler.peel(this);
}
@Override
public String toString() {
return "Apple{}";
}
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}
这里Apple对通过this把自己传递给了eat()中。
在构造器中调用构造器也可以通过this来实现,是咧代码如下:
class Student{
Student(){
this("通过this调用有参构造器");
}
Student(String str){
System.out.println(str);
}
}
public class Test {
public static void main(String[] args) {
Student studnet = new Student();
}
this与static的区别:this属于实例,static属于类
在static方法中不可以调用非静态方法,但可以在非静态方法中去调用静态方法;
static在没有创建任何对象的前提下,只通过类本身来调用static方法或域