a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 111|回复: 2

[其他] JAVA技巧:Javathis及super的用法详解

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便 可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非 super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。     在一般方法中- j3 @0 G. }4 x3 t" ?) R. q/ @
    最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:
0 P- s. C& V) i2 o- c    public class DemoThis{: O4 }7 d- l4 ], N
    private String name;( I' p, y# x8 S
    private int age;) X- u$ }( s2 `% S* r+ ^
    DemoThis(String name,int age){- N) W) t( E' F
    setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
6 O/ }9 S( o# Q1 Q9 r5 s    setAge(age);
% ]* r3 x1 T6 z1 `    this.print();
0 ^8 @" P: \# z; q    }$ R' O  U7 p& m: W
    public void setName(String name){
4 t1 |& T8 J0 D5 X    this.name=name;//此处必须指明你要引用成员变量
7 t, n+ I# I6 h8 W8 v9 W    }
) Y/ Y* z, `( t2 E9 Q  q# [: Q; a    public void setAge(int age){2 E" {1 Y, F5 H, w8 W. q" h
    this.age=age;, P) J& q' f  j9 {, v, u4 Y

' b  W0 |" E/ T8 @$ K  T& s    }
回复

使用道具 举报

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

JAVA技巧:Javathis及super的用法详解

</p>    public void print(){
4 b0 v& ?( [& ?, }/ a; G6 S6 }    System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西
' q- \! C2 D$ i4 d1 Q2 Q5 i    }; ?- X; J5 ?2 N
    public static void main(String[] args){
2 J9 {. c7 ]+ G* Q: @" |    DemoThis dt=new DemoThis("Kevin","22");0 x( K2 R* _5 ?7 t, c% d, s
    }
/ N- E/ x1 c% B2 c" g8 O; N    }. x! _, Y' r6 n: Z( I9 h0 V* e
    这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。
  {9 l) X3 C  d5 Z9 _    class Person{+ d+ m, C, z% T7 v# U1 H6 G' ]
    public int c;1 K4 X/ m7 j9 v
    private String name;8 A( K* m& e( k3 S# i
    private int age;; t" G9 o( i( ]( B  q8 S
    protected void setName(String name){
1 p" [: r: x/ J) I2 j6 F    this.name=name;
1 N/ b) w5 i$ H( m% {    }/ x! Z  o8 M: a# R! ?
    protected void setAge(int age){4 H& y% R" _( W; r+ v( y9 V. N
    this.age=age;
4 f: d& o* M9 _1 X. S1 l( Y: E    }) Y% K: ?1 K' _0 n* @6 A* c( B" w1 ?  s& O
    protected void print(){
2 X8 T+ r. ]! U5 u, e  G' R) }    System.out.println("Name="+name+" Age="+age);
, z; I( j4 Z7 d1 J2 i    }6 F4 Y  B% M4 W! C
    }. ~7 f, G# P3 X2 @1 U6 e7 t
    public class DemoSuper extends Person{
2 V9 @% u5 N5 u. w; V+ D) w    public void print(){" S3 L3 P. y; o2 r: [' [/ t: e6 v: F9 |
    System.out.println("DemoSuper:");7 N3 V' w  U: W
    super.print();
( \1 m0 |& s- B* D# Z    }
% i) B3 l" c$ s( m: B    public static void main(String[] args){! V  R8 J5 `" l- C
    DemoSuper ds=new DemoSuper();
( s' L: G8 w5 e% n2 X! d    ds.setName("kevin");6 s* }! l. K+ H2 ~
    ds.setAge(22);2 q4 u) q* S! |7 J
    ds.print();
6 k% ^" K- D/ Z4 p    }
: f% m; u/ s- a* m2 m" b    }. [" |, H- W& w8 C3 p; k- h
    在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。输出结果说明了这一点:( M" y' |; s9 |5 W/ `9 }# b. G
    DemoSuper:: `0 @6 u5 X& P  N
    Name=kevin Age=226 @6 ?0 _0 ~# s8 ?
    这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。
+ O1 A/ ^  O( \& ?. k% o, A    在构造函数中$ w, n, Y% H4 \. E2 X/ K
    构造函数是一种特殊的方法,在对象初始化的时候自动调用。在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:* m" H+ M" T& M% K& X: N2 B
    class Person{" @: \# a2 X: ~. X  [; t
    public static void prt(String s){2 p; v1 H6 Z6 v. k6 {5 v
    System.out.println(s);
' H  s2 D5 C- \: k1 a& Z
( T/ Y' ?: `6 A; u/ ~    }
回复 支持 反对

使用道具 举报

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

JAVA技巧:Javathis及super的用法详解

</p>    Person(){
- U. [2 {" ]" |. L    prt("A Person.");2 Q' j$ [0 I8 O( x# F( r( X
    }, S& E# ~; `, U' Y* \
    Person(String name){
& e( f5 \2 ~- L1 W    prt("A person name is:"+name);: ~1 ]/ {# K8 d% P
    }
4 _4 _' [% C$ b$ D7 S    }
2 t% w% `3 f8 A3 h( r' [    public class Chinese extends Person{3 g7 ]  a$ i7 \  _, b) ^5 B; i
    Chinese(){
8 z9 m- E- m: z" v; y/ |    super();  //调用父类构造函数(1)( \# g  v" P# r! I, X
    prt("A chinese.");//(4)
; L/ r7 G$ A& v. D. e: W  t    }* [4 f, U5 K* g0 z
    Chinese(String name){
3 u4 n' f* P" B1 Z3 N    super(name);//调用父类具有相同形参的构造函数(2)/ g5 o8 m# r8 f4 }4 H* y
    prt("his name is:"+name);
% o1 P  w+ i: c) u    }* j- q( o4 ]+ \3 r7 J5 Y
    Chinese(String name,int age){) Z1 ^: o7 J1 g( K. A
    this(name);//调用当前具有相同形参的构造函数(3); x& q% ~+ P3 c" j8 z2 ]/ x
    prt("his age is:"+age);3 Z1 Q; Q7 s9 i( c$ D* V$ t6 a' W  T
    }0 L2 F& Z3 u9 J/ x
    public static void main(String[] args){
( E; ?% }3 }) {! _9 P- m    Chinese cn=new Chinese();  A3 }2 Q4 x4 l/ t: T" {
    cn=new Chinese("kevin");% a: v- N- e2 Y4 z2 d, T) [
    cn=new Chinese("kevin",22);3 ]' y" n) p9 v/ j& ?0 d
    }
" B6 R; f4 U% U6 |* w/ m- @    }
* W( `: s/ h& m2 D4 E5 _    在这段程序中,this和super不再是像以前那样用“。”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。 super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在 Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它 继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道 了。7 f" G+ T4 Y3 W+ b6 U
    最后,写了这么多,如果你能对“this通常指代当前对象,super通常指代父类”这句话牢记在心,那么本篇便达到了目的,其它的你自会在以后的编程实践当中慢慢体会、掌握。另外关于本篇中提到的继承,请参阅相关Java教程。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 06:58 , Processed in 0.207371 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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