行为规范了你能对对象发出的请求。你的CLASS,也就是对象,也就是MM,你把她设计出来了,而且你很BT,只给她设计了两个行为:爱我()和MAKE爱与我()。那么她便不可能接受其它客户端class(某个帅哥?)的请求,如果在某个class里,你写成了MM.爱F4(),那么编译器就会出错。
你理所当然把MM的属性设成美,你不希望别人来改变这个事实,那么,你就要把这个属性定义为private,这样MM便不会在第二天醒来成为传说中的KL。这在第一章里标题为:被隐藏的实施细节。一个属性,有四种修饰符,public,private,protected,空(默认,friendly)。分别代表的意思是任何对象可以访问,本对象内部可以访问,本对象(class)的继承者可以访问,同一个包(package)的其它对象可以访问。
我们总是想尽可能地让自己的代码变的简洁,这便需要重复运用实现码。JAVA提供了这种方式,其途径有两种:组合和继承,假设有一个类为A,A有一个行为doSomething(),还有一个类B,不也想do something,那么你可以在B里产生一个方法doSomethingToo( A.doSomething(); )。这叫做组合。继承是另外一种方法,你可以直接用关键词extends,让B继承自A,那么你不用特殊额外表达,B在外界看来也是有doSomething的能力的。那么我们要问,我们什么时候要组合,什么时候用继承呢?BRUCE讲,当B is a A的时候我们用继承。这不太好理解,我们再举个MM的例子。MM具备吃饭(eatYou( 进食;消化))的行为,MM衍生开来有好色的MM、爱打屁的MM等,但她们都是MM,也就是is a的关系,这个时候你要设计好色的MM的时候就用继承,用extends。而GG不是MM,但是GG is like a MM,因为GG也可以吃饭。这个时候我们就不用再去写eatYou()这个方法了,直接在GG这个类里写eatYou( MM.eatYou(); )那么,GG也具备了进食、消化的功能。其实我们要常常用到组合,在程序里,用继承的地方是比较少的。
在继承当中,有两个特殊行为需要我们关注:覆写(overriding)和重载(overloading)。现在你只需记住:如果base class和derive class的某个方法名称相同,引数相同,则为覆写(overriding),名称相同,引数相同,则为重载(overloading)。
面向对象一个显著的优点就是多形(多态)性。我本来是不想在这第一部分写代码的,但是似乎这个问题用语言表达不够直观,所以就写了个最简单的能说明多形性的问题。看代码先。。。
//Love.java
class MM{
public void toSeeGG(){
System.out.println(\"xxx\");
}
}
class HaoseMM extends MM{
public void toSeeGG(){
System.out.println(\"诱惑GG!!!\");
}
}
class BenfenMM extends MM{
public void toSeeGG(){
System.out.println(\"好羞涩哦....\");
}
}
public class Love{
public static void loveGG(MM i){
i.toSeeGG();
}
public static void main(String[] args){
MM mm1 = new HaoseMM();
MM mm2 = new BenfenMM();
loveGG(mm1);
loveGG(mm2);
}
}
该代码运行的结果是: