Java基础 第一天
第零章 为什么要写本文
自己的基础太差,已经上了这么多年学,还是很水。浑浑噩噩过了一个半学期,觉得自己不可以这么下去了,所以才决定开始重新学习。而想要记住自己学的知识,最好的方式,就是复述。当自己能把一样东西讲出来,那么自己就一定懂了。
本文主要参考孙鑫老师很早以前的视频,加上自己的理解和网络上的一些资料。
其实,现在还写这种东西,还是有点不好意思的。希望每天都能写一点,督促自己好好学习。
就说这么多了,下面开始吧!
第一章 相关内容
我们从最基础的说起:JDK与JRE。
什么是JDK?
JDK是Java Develop Kit的缩写,翻译过来就是Java开发工具包。
什么是JRE?
JRE是Java Runtime Environment的所以,翻译过来是Java运行环境。
如果我们仅仅是想在电脑是运行Java程序,我们只需要下载JRE就行了。而我们显然不能仅仅下载这个,我们需要是JDK,只有拥有了Java的开发工具包,我们才可以对软件进行开发,所以我们要下载JDK,现在JDK的版本已经到1.7了。JDK安装程序中已经包含了JRE,所以如果我们下载了JDK就不需要单独的再去下载JRE了。
下面一堆字主要介绍一些Java的基本知识,不想看的可以直接跳过,新手也可以跳过。
1.1 Java的起源
简单的说,就是Sun公司在很早以前曾经有一个叫做Green的项目,这个项目是干嘛的,是做家电嵌入式的,一开始准备用C++,但是呢,这个太复杂了,于是他们就基于C++开发了一个新语言Oak,不过Oak被SGI打败了,很可怜的,不过后来这个开发团队的成员受到了别人的启发,原地满血复活,于是对Oak改进改进就成为我们现在的Java。简单来说就是这样。
所以,如果看官有了C++或者C语言的开发经验,那么Java对于您来说,就是小菜一碟了。可是对于本菜鸟,哎,都是眼泪。
1.2为什么要用Java
这个能理解最好,在理解的基础上背背也是挺好的,毕竟你用这个东西,还是应该知道为什么我要用它吧。本菜鸟就是直接背的,在背了之后理解消化。孙鑫老师的课上是这个标题,但是我觉得改成Java特性介绍更好,至于为什么,看完后面就会知道了。
回到主题,我们来回答一下标题:
因为Java的这些特性,让我们用Java:简单的、面向对象的、健壮的、安全的、解释的、与平台无关的、多线程的和动态的语言。
1.2.1 简单的
所谓的简单并不是真的简单,不然不用确学了,起码本菜鸟还是觉得挺麻烦的。说一样东西简单一定要有一个标准,相比较C++而言,Java的的确确要简单多了。
首先,Java的代码风格与C和C++很类似,所以对于学习过这两种语言的同学会觉得很简单;
其次,Java中摒弃了C++中容易引发程序错误的一些特性,如指针啊,结构啊,枚举啊以及内存管理等等。其实小菜感受最明显的是内存管理和指针,C++中如果new了一个对象,一定要自己记得释放这个对象的空间,还有让人头疼的指针。
好在Java中没有这些东西,不过,没有这些东西不代表就没东西让人头疼了,Java中的引用机制也够烦的。总之,本菜鸟是相当的怕麻烦。
最后不得不提的是,Java中给我们提供了丰富的类库,这一点很棒,有了这些类库,我们可以很方便的开发Java程序啦。
1.2.2 面向对象的
Java是面向对象的,这也是Java非常重要的一个特性。而且,Java是完全面向对象的,这与C++不同,C++是面向对象的同时也支持面向过程的程序。
怎么来理解呢,我们在写Java程序的时候,哪怕是最简单的一个Hello Word,我们是不是也要写一个类来完成,而类是什么?是对一类对象的抽象。所以这已经是面向对象了。
在Java中,所有的文件都是以类或者接口的形式存在。所以,在Java中,不支持面向过程。就算你的Java程序里面只有一个类,然后在这个类里面全是用函数来完成你的逻辑,你还是用到了面向对象,这个程序也是面向对象的程序。
但是,我不明白的是,这怎么就成为我一定要用Java的理由了。之所以这段,是因为,这的的确确是Java与众不同的地方,但是这并不能成为我一定用它的理由(这只是自己的观点)。
1.2.3 健壮的
什么是健壮的?这个词首先让我想到的是肌肉男。好吧,脑子里面依然是肌肉男。那我们来看肌肉男的特点,身体健康,不会轻易被打垮。
那么对于Java写的程序,也就是不会轻易的崩溃掉。我们来想一下,程序怎么样会崩溃呢?有可能是内存出了问题,也有可能是指针出了问题,乱指导致误操作的发生,如果有C++的开发经验,那么对于这一点应该是深有体会吧。而在Java当中,你完全不用考虑指针和垃圾回收的问题。首先Java中压根没有指针,是不是很爽,而且就算你产生了很多垃圾,没关系,在内存不足的时候,JVM自动就把这些垃圾给回收了,所以,你的程序不会轻易的出问题的。
而且除此之外,Java中还提供了异常处理机制,我们在编写程序的时候,可能已经知道哪些地方会出问题,比如说:你想读一个文件,但是这个文件不存在,或者你想联网,但是网连不上去,这些都是提前有可能知道会出错,所以呢,我们可以在这里提前处理,如果出现了上面的情况,也就是发生了异常,那么我们就捕获这个异常,然后进行处理,一个牛逼人写的程序,基本上可以处理所有的运行时错。好吧,前提是很牛逼,呵呵。
但是无论如何,有了异常处理机制,还是给Java大大的加分了。
另外呢,Java还是强类型的语言,说到这个还是要解释一下,什么是强类型的语言呢?我们将Java跟C++比,在C/C++ 中你能把浮点型值赋给一个整数,在Java 中则不能(比如double类型的对象赋值给int类型的对象就会出错)。另外,C语言中,在一个参数和一个自变量之间没有必然的强制的类型检查。在Java 中则有。起初你可能发现Java 的强制类型检查有点繁烦。但是要记住,从长远来说它将帮助你减少程序出错的可能性。
1.2.4 安全的
什么是安全的?它有两个含义:1)使用安全2)语言特性上的安全。
语言特性上的安全比较好理解,就是在Java语言中删除了指针和释放内存等以前在C++中存在的功能,从而避免了非法的内存操作,给程序的执行提供了很好的安全性,这一点已经反复提到多次了吧。
另一个是使用上的安全,教材里是这样说:Java的安全体系架构来确保Java代码的安全性。当我们从网上下载Java代码在本地执行时,Java的安全架构能确保恶意的代码不能随意访问我们本地计算机的资源,例如:删除文件,访问本地网络资源等操作都是被禁止的。
其实,我没看懂,哎,太菜。后来想想(我没有老师问,因为没脸问,就自己看看想想),应该是这个意思:从网上下载的Java代码,应该指的的是Applet程序,如果是这样的话就很好理解了,applet的行动被限制于它的“沙盒”,applet可以在沙盒里做任何事情,但不能读或修改沙盒外的任何数据,沙盒可以禁止不安全程序的很多活动。“沙盒”模型的思想是在信任的环境中运行不信任的代码,这样即使用户不小心引入了不安全的applet,applet也不会对系统造成破坏。
1.2.5 解释的、与平台无关的
这两条我想放在一起讲比较好吧。Java是一种解释型语言(好吧,我老觉得是编译+解释才说的过去),C++是编译型语言。怎么理解呢?C++的程序代码直接被编译成本地机器指令,比如在Windows平台下,直接被编译成exe了,然后就可以执行了,但是如果换一个平台就需要重新编译以前的代码,所以说,C++不是平台无关的。而Java呢,确实是解释执行的,是由JVM解释并且执行的,解释执行的是啥呢,是字节码,也就是.class文件,而我们创建的则是.java文件,class文件是java文件被编译后才生成的,所以我认为Java怎么说也应该是两个混合在一起才对(因为我是突击学习,看的时间比较短,也许别的书上说它是混合的也不一定,反正我是这么认为的),正因为java编译出来的是字节码,所以它可以放在任何平台上被解释执行而不需要重新编译了,因为JVM读进来的就是字节码。
我们通常会将.class文件生成jar包,这样放在windows下可以执行,放在Linux也可以执行,很棒的。(有时候也会有问题,以前写过plugin程序,在Linux下还是需要调整一下才行)
1.2.6 多线程的
我只想说,这个也算我必须用的理由?C++也有多线程吧。但是这个却可以算上是Java的一个特性,不多介绍了,这个很好理解的,多线程可以提高效率。
1.2.7 动态的
这个倒是挺好的,Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是我们采用C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一个成员函数后, 引用该类的所有子类都必须重新编译,否则将导致程序崩溃,而Java则不需要。
Java从以下几个方面采取措施来解决这个问题。
Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。
一个在存储器中生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。
解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。
在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。
Java还简化了使用一个升级的或全新协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,Java能自动下载你所需要的功能程序。
1.3 Java解释器的执行过程
这个还是挺重要的,可是大学问,这里我只能说,知道皮毛的皮毛的皮毛。
运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。
装入代码的工作由“类装载器”(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其它类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。
随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转换等多种错误。通过校验后,代码便开始执行了。
小结:
通过这一章的学习,可以对Java有一个感性的认识吧。它为什么来,有哪些特性,与C++比有什么区别等。但是知道这些,只是为了后面更好的学习。
想要告别菜鸟的称号,还是需要coding啊。
(文章地址:http://www.cnblogs.com/njuduyu/archive/2013/05/23/3095934.html)

浙公网安备 33010602011771号