JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。 ) `3 ]# q! ^, \6 U2 u7 Y' n) }
- ?- H/ A( r8 a9 i$ E8 E此类中的方法可以使所的类均继承。
* K1 u9 J! E2 H6 R
2 q" @8 l" T0 u* P* b' S* `" f以下介绍的三种方法属于Object: - |, W4 A1 y# i/ t3 H5 v$ x
(1) finalize方法:当一个对象被垃圾回收的时候调用的方法。
5 Q' S0 b# _8 K1 X* d(2) toString():是利用字符串来表示对象。
8 ?5 Q V' e2 o h$ m O4 C- |) v当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。 % e* z' g' D0 Z' L" Z# L
可以通过子类作为一个toString()来覆盖父类的toString()。 1 J4 A2 o- P5 g; n
以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。 2 W9 U' ?9 Y3 w2 Q/ m
(3)equal ' @, _* ]9 C1 O V( w
首先试比较下例:
L$ `+ k0 b9 n* a0 W5 {. EString A=new String(“hello”); # r# P! U, [" |8 P* p* { D9 v9 A
String A=new String(“hello”);
9 Z, E. D. s/ b" j, c0 H1 MA==B(此时程序返回为FALSE)
8 a+ M0 n h* O) `7 A- a7 H因为此时AB中存的是地址,因为创建了新的对象,所以存放的是不同的地址。 9 o! K9 K! m) @
1 \7 S) F3 t2 `8 g. _% Z8 d
附加知识:
7 c \0 `9 U3 w% }字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复。因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到String a=”hello”时(注意没有NEW,不是创建新串),系统在字符串池中寻找是否有”hello”,此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将”hello”在字符串池中的地址返回a。如果系统再遇到String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回b,此时a与b为相同。 $ O* o7 G$ |& e {7 V" w
* m% |) X p/ c$ q/ L1 a# I1 Z# ^2 G. T
" z# K8 D, o% I
String a=”hello”;
' \* @8 V. y) B! F& R0 QSystem.out.println(a==”hello”);
y) r" s/ y6 f( _9 |& Q2 [系统的返回值为true。
7 ?8 E- T, @+ K* c8 s( l * T/ N1 G2 a! Q2 p
故如果要比较两个字符串是否相同(而不是他们的地址是否相同)。可以对a调用equal: c& K( a V" T Q1 }1 W
System.out.println(a.equal(b));
/ T/ u* X2 @( V. T: l. l& `1 Uequal用来比较两个对象中字符串的顺序。 ; D8 j# ^- |6 Z4 [. E. L
a.equal(b)是a与b的值的比较。 8 z; b8 `4 L9 o6 [& {! u, H2 P
1 r3 A, w$ @8 P ! y& f$ D$ r' r1 Z6 M# w
注意下面程序: : Q3 w0 I7 [6 d1 P2 c3 w
student a=new student(“LUCY”,20);
: |+ r& C1 \, \' C0 j! ostudent b=new student(“LUCY”,20);
4 v* b8 D' E- MSystem.out.println(a==b);
6 K/ b# h- I8 m; GSystem.out.println(a.equal(b)); 4 D0 ^" x- U! d2 s
此时返回的结果均为false。 7 C9 g: Z/ P$ R! X$ K: Q- F
4 z# v# D1 _7 K; A, @
以下为定义equal(加上这个定义,返回ture或false)
8 O8 k* M5 z6 Lpublic boolean equals(Object o){ 0 v- m7 ^. l! L5 ^( a
student s=(student)o; % C* ^" T, B4 V2 E" U9 ^
if (s.name.equals(this.name)&&s.age==this.age)
( D% x/ i1 o# v) I, J' ]5 M" [else return false; 3 u& I4 S: C$ T5 \1 v2 T( C _; n4 [/ z
}如果equals()返回的值为
) U% M1 d; O- `# }
$ [' ^" O' g, N7 d* H$ \' ^% S4 \以下为实现标准equals的流程:
+ b+ m: K. _$ x2 Zpublic boolean equals(Object o){
3 W1 L+ s/ L- e/ A3 E if (this==o) return trun; //此时两者相同 ! q- A2 q* i: g
if (o==null) return false;
1 j6 ]3 @7 ^5 x- n if (! o instanceof strudent) return false; //不同类
5 a% u( W. A7 e3 B/ O7 t) B studeng s=(student)o; //强制转换 3 A$ X( Y& ]) k6 U7 o! L
if (s.name.equals(this.name)&&s.age==this.age) return true; 5 j! e8 Y! y" Q$ e/ X
else return false;
, A0 w9 Z0 n3 \& R$ u}
& p+ D( S. n( R0 F: K % b( a8 [, W g4 W! R
以上过程为实现equals的标准过程。 - e* L* X2 J3 H3 n* c/ |- f
8 n4 l7 v( u# q" n 练习:建立一个employee类,有String name,int id,double salary.运用get和set方法,使用toString,使用equals。 |