JAVA中几个易混淆关键词的理解

原创 2004年12月31日 15:00:00
         行为规范了你能对对象发出的请求。你的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);
  }
}
该代码运行的结果是:

诱惑GG!!!
好羞涩哦....

我们看到由MM衍生出来有好色MM(HaoseMM),本分MM(BenMM),MM们都可能会看到帅哥,但是好色MM和本分MM看帅哥的眼神是不一样的,如程序中定义。在爱(Love)这个类里,我们定义一个方法loveGG,我们给它传递一个参数,是基类(base class)MM,然后toSeeGG()。通过本文最开头的描诉,我们知道,HaoseMM和BenMM与MM的关系是is a的关系,所以我们在用到loveGG(mm1)和loveGG(mm2)时候编译器不会出错。我们看到,程序自动各自执行了haoseMM和BenfenMM的toSeeGG(),而不是打印出“xxx”。这就是多形性。之所以会如此神奇,是因为JAVA运行时环境提供了动态绑定技术。动态绑定会让你产生的MM在JAVA运行时环境里按照你的指示分别作出行为。OK,我们不需要知道动态绑定是怎么运做的,我们只要知道这是什么,因为我们还在第一章。上溯造型(upcasting)这个概念也在这里被提出来了。在loveGG(MM i)这个方法里,方法接受的是MM,可是loveGG也接受HaoseMM和BenfenMM,这个特性就叫上溯造型。

        我们在上面的程序中看到了一句没有用的代码,就是在MM类里的System.out.println("xxx");。没有人关心基类MM是怎么看帅哥,因为它只是一个模版,所以我们干脆就不要这句代码,而且我们连{}也不要了,直接改写这个方法为public abstract void toSeeGG();,那么这个方法称做抽象方法(abstract method)。基类MM对我们来说没有实现的必要,于是我们把class MM{...}改写为abstract class MM{...},那么这个类叫做抽象类(abstract class)。我们不禁要问,那么抽象类能不能含有非抽象的函数呢。答曰:可以。但是这在实际中没有什么用处,唯一用到的地方是:1,main()函数,用来测试你的类;2,考试中。那么我们还要问,子类可以不覆写父类中抽象方法行不行?答曰:如果子类也是abstract,那么可以,否则不行。
        
        比抽象类做的更彻底的是接口(注意,这里的接口是JAVA中真正意义的接口,非上文一开始的接口,也既行为)。接口被设计出来的目的就是要让你继承的。等………,这是第一章,只让大家知道一些概念就行了,上面我们说的太多了。
        
BRUCE是个彻底的NN大师,我们接下来看到他把JAVA的低效率问题说的是那么的理所当然,以至于我们看完后情不自禁也要说:
恩,JAVA就应该这样做,让C++见鬼去吧。面向对象,于是所有东东都是对象,有对象便有对象的产生和毁灭。程序运行的时候,对象产生在内存中。内存分配有三种策略,分别是静态的,栈式的(stack),和堆式的(heap)。C++使用前两种策略,JAVA仅使用后者。两者有什么区别呢?喜欢寻根究底的朋友请参考本站JSP/JAVA分坛的“栈存储(stack)和堆存储(heap)的区别 ”,我们只要记住,后者在内存中的寻址要花更长的时间,因此JAVA的效率低。但是JAVA提供了根据heap特点产生的垃圾回收机制。垃圾回收机制完成这样的任务,当你的对象不在使用的时候它会自动察觉并消灭。你不用再担心发生内存泄露了。而这是每个C++程序员最头疼的事情。所以,你选择吧,是要安全还是要效率。

其实第一章接下来讲的东西对于初学者来说已经并不重要了,以上你的知识你明白了之后,在接下来的学习上你会轻松很多。我建议你不要看的那么清晰了。我想我们应该开始,马上进入第二章了。

Java易混淆概念与重点知识积累 第三篇

String、StringBuffer和StringBuilder对比 String类是不可变类,任何对String的改变都会引发新的String对象的生成;StringBuffer则是可变类,任何对...
  • songkai320
  • songkai320
  • 2016年07月04日 20:29
  • 791

几个易混淆概念

【编者按】本文来自CMU的博士,MIT的博士后,vision.ai的联合创始人Tomasz Malisiewicz的个人博客文章,阅读本文,你可以更好的理解计算机视觉是怎么一回事,同时对机器学习是如何...
  • a519781181
  • a519781181
  • 2017年01月22日 23:27
  • 89

C++基础知识易错点和易混淆总结汇总(不定时更新)

以下是我本人不定时更新的易错点汇总,如需转载,请注明出处。 1、对指针的引用 int a = 10; int *p = &a; //初始化指针p。 int* &pa = p; //这个是对指针p...
  • u013923131
  • u013923131
  • 2015年02月12日 17:08
  • 475

python 混淆点一

参考资料: 廖雪峰教程 list 和 tuple list和tuple是Python内置的有序集合,一个可变,一个不可变 list是一种有序的集合,可以随时添加和删除其中的元素。 索引正数从0...
  • wshlp123456
  • wshlp123456
  • 2016年03月21日 10:19
  • 229

几个易混淆概念(2)

(原标题:人工智能、机器学习和深度学习之间的区别和联系) 有人说,人工智能(AI)是未来,人工智能是科幻,人工智能也是我们日常生活中的一部分。这些评价可以说都是正确的,就看你指的是哪一种人工智能...
  • a519781181
  • a519781181
  • 2017年01月23日 00:49
  • 151

软考网络工程师易混淆的知识点汇总

网络工程师考试是全国计算机技术与软件水平考试的一项中级资格考试,通过考试的合格人员能根据应用部门的要求进行网络系统的规划、设计和网络设备的软硬件安装调试工作,能进行网络系统的运行、维护和管理,能高效、...
  • cpongo1
  • cpongo1
  • 2016年05月26日 16:38
  • 672

个人 易混淆 高频 高级单词

1, courageously  [kə'reidʒəsli] adv. 勇敢地 2, provisionally  [prə'vɪʒənəli] adv. 临时地,暂时地 3, pitche...
  • w18767104183
  • w18767104183
  • 2013年07月13日 20:07
  • 7383

java 易混淆知识点

1、css样式中的类标签中的值不能以数字和下划线开头,必须为字母; 2、try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执...
  • u012272186
  • u012272186
  • 2015年06月21日 10:01
  • 415

java基础易错、难理解、易混淆知识点复习

以下为学习java基础语法与原理过程中发现的一些与以往感觉不同、或者是不熟悉的地方,特此列出。只是提纲所以不是很详细,有些地方为了通俗易懂可能不是很严谨,尽请指正与补充。1、 java命令行编译与运...
  • qq_32623363
  • qq_32623363
  • 2017年12月27日 16:38
  • 101

形象理解计算机网络里的各种抽象概念

简介在计算机网络里有很多抽象的概念难以理解,还有一些相似的概念很容易混淆。比如什么是IP地址,什么又是MAC地址,他们之间又有什么区别和联系;再比如什么是路由器,什么又是路由表,它们又是用来干什么的?...
  • MBuger
  • MBuger
  • 2017年07月01日 12:02
  • 507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA中几个易混淆关键词的理解
举报原因:
原因补充:

(最多只允许输入30个字)