a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 195|回复: 2

[专业语言] JAVA认证:Javathis及super的用法详解

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便 可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非 super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。     在一般方法中
) n8 Z6 }) Z; r9 {/ y: T8 m    最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:3 I% Q- x7 w/ n" k
    public class DemoThis{
2 ^( U+ ?8 `6 x* V    private String name;
9 p9 t( z& K6 T6 p    private int age;& Z2 C2 q- t4 K  }1 R6 \
    DemoThis(String name,int age){- I0 A/ ^9 h+ H5 q, X& {
    setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的) `: P! p* f! w' P
    setAge(age);
; ^- R" m+ m. Z, Z) U/ B    this.print();6 ]5 L: n3 \1 H3 i( G0 ]* o
    }' ~+ ~" n# Y5 g, u
    public void setName(String name){/ C& X/ E- n2 ?& M! |' ^
    this.name=name;//此处必须指明你要引用成员变量* |4 E6 {  g+ t  e% S- J$ Q7 l
    }
2 e. P) b& c& R3 w  l    public void setAge(int age){) Q+ M7 ^8 w. C  Q/ t
    this.age=age;
! m( @* q: {% A    }  Y3 W* `1 V0 Z; e& J3 p
    public void print(){$ i9 t8 |. J; j# B( b2 Z
    System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西  ^) F  o: k5 O# E
    }
) P! j' P: I- o9 u' F    public static void main(String[] args){
/ z' J) d, i- `- D/ y    DemoThis dt=new DemoThis("Kevin","22");  Y2 D# K  |8 k: Q; B+ f
    }
% F& E, u+ U7 P5 V
, \! e+ A) }+ K. t% m5 b* {    }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:Javathis及super的用法详解

</p>    这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。: Q7 |4 Q. h0 F- p7 w
    class Person{$ l8 M5 ]( H4 `/ z0 G) H5 y+ h
    public int c;4 Q0 Z" q0 b; Q4 y, W; X( G
    private String name;6 F1 e5 r0 a+ \) X) z  ^  c
    private int age;$ U# d8 l& c' H9 O& F5 [
    protected void setName(String name){
, i& U( ^' c' A, K5 r    this.name=name;. K1 h& ]7 \% z; ~9 y& ]4 t
    }2 C& A. t1 g! B$ n' G
    protected void setAge(int age){' t/ g6 @4 i/ H& M' H( U
    this.age=age;
8 B! M1 q- i/ E8 |' Z    }9 y# q( Y# t& ^# j
    protected void print(){
* U8 F% W4 X: _) M9 o. i% n    System.out.println("Name="+name+" Age="+age);
0 o7 B) i9 ]8 a/ _' A+ i; y    }
7 o- ~: L* k0 Y! E" I    }
  D3 X7 {& z5 b2 e    public class DemoSuper extends Person{
9 t" J' `/ b+ w3 R8 G& _    public void print(){- a" `( \: \& Z' L
    System.out.println("DemoSuper:");
  s+ I% E5 x* Y6 C- Y    super.print();
3 k( X, }; {4 K* W% I- h" Z    }
4 G, y4 q% b- B  F    public static void main(String[] args){
5 U: D. n! f; _  v. }    DemoSuper ds=new DemoSuper();
/ i: q5 |3 l9 U# B  }/ U0 \    ds.setName("kevin");
$ p& M0 c( x# z( C: V' d+ F( Z    ds.setAge(22);: h/ j/ E! u5 X# n
    ds.print();
. |5 i: Y* Q0 C    }
+ j8 T! L1 w; N: `& t5 j2 @    }
- }  u$ u' h! I5 c# C' i    在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。输出结果说明了这一点:
% B: }1 B; V. W+ q, R0 Z    DemoSuper:
6 m) k( t6 j1 {5 x) u- H& b    Name=kevin Age=22- s) O$ o1 T, ~6 S6 n, O8 \
    这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。% V3 f4 }, G3 O( a: z' y/ V
    在构造函数中
8 L# \; x" c7 O! P9 @    构造函数是一种特殊的方法,在对象初始化的时候自动调用。在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:
. a/ v1 o. s/ @# F    class Person{
! d6 c1 E- U2 k- O/ N    public static void prt(String s){
$ B' b  E  f8 V$ P0 k$ F& j4 i    System.out.println(s);1 |7 H* T4 K( p
    }
2 U7 K- {% L9 z8 X& R    Person(){5 Y, Z% q) ^) k- w( N+ B( J. T
    prt("A Person.");
8 f1 @: k4 \' i2 T: |8 I, F- ]    }3 h1 ]7 Z: }6 W/ V
    Person(String name){
0 b- c' b* Q: p    prt("A person name is:"+name);% g$ O% E# P4 V: n, y) D
    }4 g$ w* w4 s' e, v2 d6 O
    }& F8 A- q3 U& U! j
    public class Chinese extends Person{
% ]* R0 [+ R+ S! `    Chinese(){6 F  Y5 h, [3 b' ?# L
    super();  //调用父类构造函数(1)
7 {% Q0 B2 K# B2 n$ e    prt("A chinese.");//(4)$ M' }4 q0 W& \# W. h9 q0 T' D
7 C) Q, X9 I1 |+ h  s2 J( T. i
    }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:Javathis及super的用法详解

</p>    Chinese(String name){- `) ~! U2 f( p" {
    super(name);//调用父类具有相同形参的构造函数(2)
' {" R9 H$ x- R5 y1 n2 x    prt("his name is:"+name);
  v  f4 P: b# x5 f0 M: _! y    }) _  X3 {1 s5 P1 T6 x/ w! G( ~- o
    Chinese(String name,int age){
' w) I2 t) w4 N    this(name);//调用当前具有相同形参的构造函数(3)
+ E. ]' f4 D) n0 ~+ W, N    prt("his age is:"+age);1 }, h) O4 o- N9 A0 K
    }
! R/ F$ r& L  P( _: L% U    public static void main(String[] args){
, e6 s! G+ r: {. |    Chinese cn=new Chinese();7 l/ a% m* L' m6 F
    cn=new Chinese("kevin");* N: Q" G$ g" R& o
    cn=new Chinese("kevin",22);  E' ~4 J+ A) G% o
    }
- X& {  L5 C8 N/ e2 H7 Y' [+ Q    }+ t$ C% N9 R) u( ]$ s9 F3 k+ N
    在这段程序中,this和super不再是像以前那样用“。”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。 super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在 Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它 继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道 了。
$ V; D4 N( j) ]7 n2 x4 U. E" ^    最后,写了这么多,如果你能对“this通常指代当前对象,super通常指代父类”这句话牢记在心,那么本篇便达到了目的,其它的你自会在以后的编程实践当中慢慢体会、掌握。另外关于本篇中提到的继承,请参阅相关Java教程。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-8 09:29 , Processed in 0.222013 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表