JAVA中this

来源:互联网 发布:php支付接口开发demo 编辑:程序博客网 时间:2024/05/18 03:53

今天学习Servlet中牵扯到了this这个关键字,下面做个笔记,也给大家一起参考学习一下。
首先this是指当前运行类实例对象。当你创建一个对象并调用该对象的方法的时候其实下面这样的:

Person p = new Person();  p.show(String name);

其实在编译之后编程机器语言是p.show(p , name);第一个参数是本类的对象的引用。而在这个show方法中怎么来用这个引用呢?其实就是用this来代替这个引用。也就是当前运行类实例对象。
而静态方法就是没有this的方法,也就是静态的方法中不能使用this,因为静态方法编译成机器语言之后,并没有在参数中加入本类对象的引用,也就是 p.show(String name)和原来一样。这就是this的由来。

下面说一下this的一些使用

public class Father {    public void fun(){        System.out.println("this is Father's fun");        this.show();    }    public void show(){        System.out.println("father's show : ");    }}public class Son extends Father {    public void fun(){        System.out.println("this is Son's fun()");        super.fun();    }    public void show(){        System.out.println("Son's show() ");    }    public static void main(String[] args) {        Son son = new Son();        son.fun();    }}

在看到结果之前大家可以先猜一下是不是和自己想象的结果一样,结果如下:

this is Son's fun()this is Father's funSon's show() 

有些人对this理解不深的可能会产生疑问,为什么结果会是这样。我在前面已经说过:”this是指当前运行类实例对象”,所以,要看是谁调用了这个方法。这里写图片描述
在父类中又通过this调用了show()方法,因为show方法是子类继承自父类的。而且,此时的this是指当前的调用者,图中已经说过,当前的调用者是son,所以此时的this也是son所以调用的show方法也就是子类的show方法了。

那么下面再给大家看一段代码:

public class Father {    public String name ="father";    public void fun(){        System.out.println("this is Father's fun :"+this.name);    }}public class Son extends Father {   public String name="son";    public void fun(){        System.out.println("this is Son's fun() :" + this.name);        super.fun();    }    public static void main(String[] args) {        Son son = new Son();        son.fun();    }}

仍然希望大家先猜一下结果。
结果如下:

this is Son's fun() :sonthis is Father's fun :father

是不是觉得很诡异。
这里我解释一下。前面的例子中show方法时子类继承并覆盖了父类的方法,所以调用的是子类的show方法,如果子类没有重写父类的方法的话,其实仍旧调用父类的方法的(大家可以在父类中添加一个方法,用this调用一下试试。此处不在举例),但是字段不能覆盖,谁的就是谁的,子类继承了父类,字段在子类中就变成了 编译时类型的字段了(可以看一下我的上一篇博客又介绍),所以此时的this是调用自己的属性了,举个例子:

  public static void main(String[] args) {        Son son = new Son();        System.out.println(son.name);        Father f = new Son();        System.out.println(f.name);    }

这里的运行结果就是:

sonfather

这就牵扯到了多态。多态的特点是,成员变量编译时看左边,成员方法编译看左边,运行看右边

大家要记住方法是谁运行看谁,字段是谁的就是谁的。

0 0
原创粉丝点击