编程语言 | Java

来源:互联网 发布:上海雕塑培训班 知乎 编辑:程序博客网 时间:2024/06/06 08:41

1. Java可以做什么

  1. 基于Web的应用程序桌面应用程序(银行软件、商场结算软件)。
      完全可以做,但是并不擅长。
  2. 企业级应用(基于Web的应用程序的如:淘宝、京东等各种电商平台)。
      电信、移动、证券、企业信息化平台…;
      出于安全性要求、稳定性要求,高要求的企业应用,都不会使用Windows平台,而是选择Unix、Linux……此时会使用到Java。
  3. 移动互联网时代(Android平台的软件)。
      Android平台 :需要Java来开发软件。

2. Java的竞争对手及各自优势

  • C#:
      C#是专门为.NET程序框架而创造的语言。摒弃了C++中函数及其参数的const修饰、宏替换、全局变量和全局函数等。
      在继承上,采用了更易理解的单继承和多接口的实现方案。
      在源代码组织上,提出声明与实现于一体的逻辑封装。
      相对于Java语言,C#也有其独特的优势:Microsoft提供的visual Studio开发平台可以极好地提高C#程序的开发效率,而且Microsoft要比Java更善于利用Windows平台,当使用C#创建Windows服务、记录Windows事件日志、访问Windows注册表时,.NET确实更方便。Microsoft提供了Windows任务相关的大量基类,允许程序员通过向导、拖放等操作来快速开发应用,因此比较容易使用。
      但应用局限于Windows平台。

  • Ruby:
      简洁的解释性语言。纯粹的面向对象编程语言。完全跨平台、可以在任何操作系统上解释执行。
      相对于Java语言而言,Ruby语言最大的特征就是简洁。首先,他是一种弱类型的语言,变量无须声明,变量没有类型,因此Ruby的变量可以保存任何类型的数据;其次,它还提供了强大的正则表达式支持,并支持运算符重载;除此之外,Ruby也提供了许多额外的便捷功能,比如闭包、代码块、迭代器和集合等。
      2004年,Ruby语言中出现了一个优秀的MVC框架:Ruby On Rails,这个开发框架被宣传成现有企业框架的一个替代品。Ruby On Rails框架是一个真正意义上的敏捷开发框架,它提供了大量代码生成器,通过使用这些代码生成器可以极好地提高应用的开发效率。
      相对于Java领域的众多开发框架而言,Ruby On Rails提供了一个“一站式”的解决方案,Ruby On Rails框架提供了Web层的MVC框架、持久层的ORM等解决方案。借助Ruby这种动态语言的优势,整个应用的代码相当简洁,因而使得Ruby On Rails应用的开发非常快速。
      Rails平台:简洁性、易用性 ——>>中小型应用
      Java EE平台:更加全面 ——>>有复杂要求的大型企业级应用

  • Python:
      面向对象的解释型编程语言。
      Python语言是基于ABC教学语言的,ABC语言非常优雅和强大,专门为非专业程序员设计的,但是,ABC语言并没有被广泛应用。但是Python加强了和其他语言(C、C++、Java等)的结合性。
      简洁而清晰的语法,适合完成各种高层任务,几乎可以在所有的主流操作系统上运行。
      两大特色:可扩展性、清晰的语法。

3. 编译型与解释型的语言的运行机制

  1. 编译型的语言:C、C ++、Objective-C、Pascal…
      1)编译生成的程序,只能在特定的平台上运行。
      2)它可以针对特定平台进行优化,因此性能可以得到改善。
      编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。
      有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行性程序,通过这种方式实现低层次的代码复用。
      因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较高;但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行性程序通常无法移植到其他平台上运行;如果需要移植,则必须要将源代码复制到特点平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。
    编译型语言

  2. 解释型的语言:Ruby、Python
      1)需要为不同的平台提供解释器。通常他们可以跨平台运行。
      2)由于每次运行时,都需要经过一次解释(转换为机器指令),性能略差。
      解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于编译型语言中的编译和解释过程混合到一起同时完成。
      可以认为:每次执行解释型语言的都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台的解释器负责将源程序解释成特定平台的机器指令即可。解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。
    解释型语言

  3. 除此之外,还有一种伪编译型语言,如:Visual Basic…
      它属于半编译型语言,并不是真正的编译型语言。它首先被编译成P-代码,并将解释引擎封装在可执行程序内,当运行程序时,P-代码会被解析成真正的二进制代码。表面上看起来,Visual Basic可以编译生成可执行的EXE文件,而且这个EXE文件也可以脱离开发环境,在特定平台上运行,非常像编译型语言。实际上,在这个EXE文件中,既有程序的启动代码,也有链接解释程序的代码,而这部分代码负责启动Visual Basic解释程序,再对Visual Basic代码进行解释并执行。

4. Java程序的运行机制

  Java比较特殊,由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此可以认为:Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。Java程序的执行过程必须经过先编译、后解释两个步骤。
  Java既需要编译,避免每次运行都要重新解释,性能得到提高。运行时依然保留解释,这样可以保证Java程序能跨平台。
Java语言

5. Java的虚拟机机制

  保证Java程序的跨平台特性
    Java程序的解释,由JVM(Java Virtual Machine,Java虚拟机)完成。如果需要运行Java程序,一定要为该平台安装Java虚拟机。
    Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。
    当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。不同平台上的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间的转换器才可以实现,JVM就是这个转换器。
    JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。
    可以通俗的认为:JVM分为向上和向下两个部分,所有平台上的JVM向上提供给Java字节码程序的接口完全相同,但向下适应不同平台(Windows/Linux…)的接口则互不相同。

6. Java的垃圾回收机制

  保证Java程序更安全、更高效
    如果一些分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。

  显式进行垃圾回收主要有两个缺点:
    1、程序忘记及时回收无用内存,从而导致内存泄漏,降低系统性能。
    2、程序错误地回收程序核心类库的内存,从而导致系统崩溃。

  与C/C++程序不同,Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(Garbage Collection,GC)。通常JRE会提供一个后台线程来进行检测和控制,一般都是在CPU空闲或内存不足时自动进行垃圾回收,而程序员无法精确控制垃圾回收的时间和顺序等。

  垃圾回收能自动释放内存空间,减轻编程的负担。这使Java虚拟机具有两个显著的优点:
    1、垃圾回收机制可以很好地提高编程效率。
    2、垃圾回收机制保护程序的完整性,垃圾回收是Java语言安全性策略的一个重要部分。

  当编写Java程序时,一个基本原则是:对于不需要的对象,不要引用它们。如果保持对这些对象的引用,垃圾回收机制暂时不会回收该对象,则会导致系统可用内存越来越少;当系统可用内存越来越少时,垃圾回收执行的频率就越来越高,从而导致系统的性能下降。

7. 开发Java的准备

  安装JDK、配置环境变量

  JDK的全称是Java SE Development Kit,即Java标准版开发包,提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时的环境,以及常用的Java类库等。
Java运行时的环境全称是Java Runtime Environment,因此也被称为JRE,它是运行Java程序的必需条件。

  JRE与JVM的关系(JRE = JVM + 核心库):
    JRE包含JVM。JVM是运行Java程序的核心虚拟机,而运行Java程序还需要其他的类加载器、字节码校验器以及大量的基础类库。JRE除了包含JVM之外,还包含运行Java程序的其他环境支持。如果单纯只是运行Java程序,可以只安装JRE,无须安装JDK。

安装JDK:
  安装JDK时,包含:Development Tools、Source Code、Public JRE(无须安装此公共JRE)。
  1、Development Tools:这是JDK的核心,包括编译Java程序必需的命令工具。实际上,这个选项里已经包括了运行Java程序的JRE,这个JRE会安装在JDK安装目录的子目录里,这也是无须安装Public JRE的原因。
  2、Source Code:安装这个选项将会安装Java所有核心类库的源代码。
  3、Public JRE(公共JRE):无须安装,这是一个独立的JRE系统,会单独安装在系统的其他路径下。Public JRE会向IE浏览器和系统中注册Java运行时环境。通过这种方式,系统中任何应用程序都可以使用Public JRE。但在网页上执行Applet的机会越来越少,而且完全可以使用JDK目录下的JRE来运行Java程序,故无须安装。

安装完成后,可在JDK安装路径下看到如下的文件路径:
  1、bin:存放JDK的各种工具命令,如Javac、Java等。
  2、db:安装Java DB的路径。
  3、include:一些平台特定的头文件。
  4、jre:运行Java程序所必需的JRE环境。
  5、lib:存放JDK工具命令的实际执行程序。javac命令是使用Java编写的,这个类就是lib路径下tools.jar文件中sun\tools\javac路径下的Main类,JDK的bin路径下的javac.exe命令实际上仅仅是包装了这个Java类。不仅如此,bin路径下的绝大部分命令都是包装了tools.jar文件里的工具类。
  6、javafx-src.zip:存放Java FX所有的核心类库的源代码。
  7、src.zip:存放Java所有核心类库的源代码。
  8、README、LICENSE等说明性文档。

配置PATH环境变量
  把JDK的bin目录添加PATH环境变量中,保证用户无需输入绝对路径即可使用Javac、Java两个工具。
  PATH环境的作用,让操作系统能找到我们所使用的命令。即PATH环境变量与Java无关。

用户变量和系统变量的区别:
  用户变量和系统变量并没有太大的差别,只是用户变量只对当前用户有效,而系统变量对所有用户有效。为了减少自己所做的修改对其他人的影响,故设置用户变量避免影响其他人。只是系统变量的路径会排在用户变量的路径前面,即如果Path系统变量的路径里包含了java命令,而Path用户变量的路径也包含了java命令,则优先执行Path系统变量路径里包含的java命令。

8. Java程序的基本规则

  • Java程序的组织形式。
      Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
[修饰符] class [类名]{    /*程序代码*/}

  最简单的Java程序如Test.java,定义了一个Test类,但是这个类里面没有任何类成分,但是一个空类,但这个程序是完全正确的,可以通过javac命令进行编译。
程序代码如下:Test.java

//这是最简单的一个Java程序class Test{}

  但是使用java命令运行时会得到错误提示:
  在类Test中找不到main方法,请将main方法定义为:public static void main(String[] args)
  这只是表明:这个类不能被java命令解释执行,并不表示这个类是错误的。实际上,Java解释器规定:如需某个类能被解释器直接解释执行,则这个类里必须包含main方法,而且main方法必须使用public static void来修饰,且main方法的形参必须是字符串数组类型(String[] args是字符串数组的形式),也就是说。main方法的写法几乎是固定的。Java虚拟机就从这main方法开始解释执行,因此,main方法是Java程序的入口。
  也就是说,如果希望一个类是可运行的,该类中必须包含一个入口,告诉系统从哪里开始运行,该入口就是主方法:public static void main(String[] args)
  程序代码如下:HelloWorld.java

public class HelloWorld{    // Java程序的入口方法,程序将从这里开始执行    public static void main(String[] args)    {        // 向控制台打印一条语句        System.out.println("HelloWorld");    }}
  • Java源文件的命名规则。
      1)Java程序源文件的后缀必须是java。
      2)如果Java源文件中有public类,该源文件的文件名必须与public类名相同。
      3)如果源文件中没有public类,该源文件的主文件名可以是任意的。

  一个Java源文件只能有一个public类,普通的类可以有N个,一个源文件里面可以包含多个主类(包含main方法的类)。
类名,只要是一个合法的标识符即可。但是类名应该是一个或多个有意义的单词连缀而成,而且每个单词的首字母要大写。

  • 易错点。
      1)CLASSPATH环境变量的问题。
        CLASSPATH环境的作用:告诉JVM到哪里去找所运行的Java类。
        通常无需设置CLASSPATH环境变量。因为JDK会自动在当前路径下搜索类。但如果设置了CLASSPATH环境变量,那就需要在CLASSPATH环境变量中增加一个点号(.)代表当前路径。
        点击电脑→属性→高级→环境变量→用户变量点新建,变量名为:CLASSPATH,变量值为:.;存放*.class的路径(.;JDK安装目录\lib\dt.jar;JDK安装目录\lib\tools.jar)
        如果指定了CLASSPATH环境变量,必须在CLASSPATH环境变量中增加一点(.),一点代表当前路径,用以强制Java解释器在当前路径下搜索Java类。
      2)大小写问题。
        Java语言是严格区分大小写的语言。
      3)路径里包含空格的问题。
        尽量避免安装JDK以及Java相关程序、工具等到包含空格的路径下。
      4)main方法的问题。
        必须写成public static void main(String[] args)形式,main方法必须使用public和static修饰,必须使用void声明该方法的返回值,且该方法的参数类型只能是一个字符串数组,而不是其他形式的参数。对于main方法而言,前面的public和static修饰符的位置可以互换,但其他部分则是固定的,切记单词字母的大小写。

9. 编译运行Java程序

  1. 编译Java源程序的命令
      javac –d [目录] [Java源文件] - 目录指定将生成的二进制文件放到哪个目录下。
      无需指定生成文件的文件名,该文件名总是:类名.class
      Java源文件中定义N个类,将会生成N个class文件,每个class对应一个类,每个Java源文件可以包含多个类。

  2. 运行java程序的命令
      java – cp [目录] [Java类名]- 目录指定JVM到哪个目录下去搜索Java类。
      如果没有指定– cp选项,java命令是根据CLASSPATH环境变量来搜索Java类。
      如果没有设置CLASSPATH环境变量,CLASSPATH环境变量的值是一点(.)
      但如果设置.CLASSPATH环境变量,以设置的CLASSPATH环境变量值为准。
      程序代码如下:HelloWorld.java

public class HelloWorld{    // Java程序的入口方法,程序将从这里开始执行    public static void main(String[] args)    {        // 向控制台打印一条语句        System.out.println("HelloWorld");    }}
原创粉丝点击