1、java
this关键字的四个用法:
(1)this调用本类中的属性,也就是类中的成员变量。程序员
详解:引用成员变量post
Public Class Student { String name; // 定义一个成员变量name private void SetName(String name) { // 定义一个参数(局部变量)name this.name=name; // 将局部变量的值传递给成员变量 } }
如上面这段代码中,有一个成员变量name,同时在方法中有一个形式参数,名字也是name,而后在方法中将形式参数name的值传递给成员变量name,虽然咱们能够看明白这个代码的含义,可是做为Java编译器它是怎么判断的呢?究竟是将形式参数name的值传递给成员变量name,仍是反过来将成员变量name的值传递给形式参数name呢?this
答:两个变量名字若是相同的话,那么Java如何判断使用哪一个变量?此时this这个关键字就起到做用了。this这个关键字其表明的就是对象中的成员变量或者对象中的成员方法。也就是说,若是在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者对象的成员方法,而不是指成员方法的形式参数或者局部变量!为此在上面这个代码中,this.name表明的就是对象中的成员变量,又叫作对象的属性!然后面的name则是方法的形式参数,代码this.name=name就是将形式参数的值传递给成员变量。这就是上面这个代码的具体含义。spa
通常状况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即便在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量,这主要是从便于代码的阅读考虑的。一看到这个this关键字就知道如今引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提升了代码的阅读性。不过话说回来,这是this关键字在Java语言中的最简单的应用。从这个应用中,咱们能够看出this关键字其表明的就是对象的名字!其实若是是局部变量的话,也是相同的道理。如在上面的代码中,name不是形式参数,而是一个局部变量。此时Java也会遇到相同的疑惑,即变量名name表明的究竟是局部变量仍是形式参数?name=name到底表明的是什么含义?根据局部变量的做用域,在方法内部,若是局部变量与成员变量同名的话,那么是以局部变量为准。但是在name=name这个赋值语句中,将局部变量的值赋值给本身,显然并非很合适。根据代码的含义,原本的意思应该是将局部变量赋值给成员变量。为了更清晰的表达这个含义,为此最好采用以下的书写格式this.name=name。这里的this关键字含义就是对象名student,为此this.name就表示student.name。翻译
(2)this调用本类中的成员方法。设计
详解:code
public class MyServlet1 extends HttpServlet { /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("Hello World" + new java.util.Date().toString()); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 通常开发人员习惯把doGet()和doPost()合二为一 this.doGet(request, response); } }
(3)this调用本类中的其余方法。orm
详解:调用类的构造方法server
public class Student { //定义一个类,类的名字为student。 public Student() { //定义一个方法,名字与类相同故为构造方法 this(“Hello!”); } public Student(String name) { //定义一个带形式参数的构造方法 } }
this关键字除了能够调用成员变量以外,还能够调用构造方法。在一个Java类中,其方法能够分为成员方法和构造方法两种。构造方法是一个与类同名的方法,在Java类中必须存在一个构造方法。若是在代码中没有显示的体现构造方法的话,那么编译器在编译的时候会自动添加一个没有形式参数的构造方法。这个构造方法跟普通的成员方法仍是有不少不一样的地方。如构造方法一概是没有返回值的,并且也不用void关键字来讲明这个构造方法没有返回值。而普通的方法能够有返回值,也能够没有返回值,程序员能够根据本身的须要来定义!不过若是普通的方法没有返回值的话,那么必定要在方法定义的时候采用void关键字来进行说明。其次构造方法的名字有严格的要求,即必须与类的名字相同。也就是说,Java编译器发现有个方法与类的名字相同才把其看成构造方法来对待。而对于普通方法的话,则要求不可以与类的名字相同,并且多个成员方法不可以采用相同的名字。在一个类中能够存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不一样。Java语言就凭形式参数不一样来判断调用那个构造方法。
在上面这段代码中,定义了两个构造方法,一个带参数,另外一个没有带参数。构造方法都不会有返回值,不过因为构造方法的特殊性,为此没必要要在构造方法定义时带上void关键字来讲明这个问题。在第一个没有带参数的构造方法中,使用了this(“Hello!”)这句代码,这句代码表示什么含义呢?
在构造方法中使this关键字表示调用类中的构造方法。若是一个类中有多个构造方法,由于其名字都相同,跟类名一致,那么这个this究竟是调用哪一个构造方法呢?其实,这跟采用其余方法引用构造方法同样,都是经过形式参数来调用构造方法的。如上例中,this关键字后面加上了一个参数,那么就表示其引用的是带参数的构造方法。若是如今有三个构造方法,分别为不带参数、带一个参数、带两个参数。那么Java编译器会根据所传递的参数数量的不一样,来判断该调用哪一个构造方法。从上面示例中能够看出,this关键字不只能够用来引用成员变量,并且还能够用来引用构造方法。
不过若是要使用这种方式来调用构造方法的话,有一个语法上的限制。通常来讲,利用this关键字来调用构造方法,只有在无参数构造方法中第一句使用this调用有参数的构造方法。不然的话,翻译的时候,就会有错误信息。这跟引用成员变量不一样。若是引用成员变量的话,this关键字是没有位置上的限制的。若是不熟悉这个限制的话,那么仍是老老实实的采用传统的构造方法调用方式为好。虽然比较麻烦,可是至少不会出错。
(4)this调用本类中的其余构造方法,调用时要放在构造方法的首行。
详解:返回对象的值
this关键字除了能够引用成员变量或者成员方法以外,还有一个重大的做用就是返回类的引用。如在代码中,可使用return this,来返回某个类的引用。此时这个this关键字就表明类的名称。如代码在上面student类中,那么代码表明的含义就是return student。可见,这个this关键字除了能够引用成员变量或者成员方法以外,还能够做为类的返回值,这才是this关键字最引人注意的地方。
2、
super的使用方法:(表明的是父类的对象)
super.成员变量//super.方法名
super([参数]);调用父类的构造方法
建立对象时(Person person=new Person();//Person person=new Person("张三");),在这两种状况下,不管父类有没有有参数的构造方法,系统都会默认地先调用父类的无参数的构造方法,再调用子类的无参数或有参数的构造方法。
super关键和this做用相似,使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,经过这两个类彻底演示了super的用法,如下是代码:
package org.leizhimin; public class Father { public String v="Father"; public String x="输出了Father类的public成员变量x!!!"; public Father() { System.out.println("Father构造方法被调用!"); } public Father(String v){ this.v="Father类的带参数构造方法!运行了."; } public void outinfo(){ System.out.println("Father的outinfo方法被调用"); } public static void main(String[] args) { // TODO 自动生成方法存根 } } package org.leizhimin; public class Son extends Father{ public String v="Son"; public Son() { super(); //调用超类的构造方法,只能放到第一行。 System.out.println("Son无参数构造方法被调用!"); //super(); //错误的,必须放到构造方法体的最前面。 } public Son(String str){ super(str); System.out.println("Son带参数构造方法被调用!"); } //覆盖了超类成员方法outinfo() public void outinfo(){ System.out.println("Son的outinfo()方法被调用"); } public void test(){ String v="哈哈哈哈!"; //局部变量v覆盖了成员变量v和超类变量v System.out.println("------1-----"); System.out.println(v); //输出局部变量v System.out.println(this.v); //输出(子类)成员变量v System.out.println(super.v); //输出超类成员变量v System.out.println("------2-----"); System.out.println(x); //输出超类成员变量v,子类继承而来 System.out.println(super.x); //输出超类成员变量v System.out.println("------3-----"); outinfo(); //调用子类的outinfo()方法 this.outinfo(); //调用子类的outinfo()方法 super.outinfo(); //调用父类的outinfo()方法 } public static void main(String[] args) { new Son().test(); } }
子类Son运行结果:
Father构造方法被调用!
Son无参数构造方法被调用!
------1-----
哈哈哈哈!
Son
Father
------2-----
输出了Father类的public成员变量x!!!
输出了Father类的public成员变量x!!!
------3-----
Son的outinfo()方法被调用
Son的outinfo()方法被调用
Father的outinfo方法被调用
说明:此例子仅仅为了说明super的用法,实际在设计类的时候通常都尽量私有(private)化。
经过上面的例子,下面总结一下super的用法:
第1、从构造方法的角度
在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第2、从成员变量的角度
当子类方法中的局部变量或者子类的成员变量与父类的成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类的成员变量。固然,若是父类的成员变量没有被覆盖,也能够用“super.成员变量名”来引用父类的成员变量,不过这是没必要要的。
第3、从成员方法的角度
当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有彻底相同的方法定义(但方法体能够不一样),此时,用“super.方法名(参数列表)”的方式访问父类的方法。