欢迎光临
我们一直在努力

JAVA中几个易混淆关键词的理解-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

行为规范了你能对对象发出的请求。你的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++程序员最头疼的事情。所以,你选择吧,是要安全还是要效率。

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » JAVA中几个易混淆关键词的理解-JSP教程,Java技巧及代码
分享到: 更多 (0)