欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析Java的JVM以及类与对象的概念

程序员文章站 2024-03-05 19:58:07
java虚拟机(jvm)以及跨平台原理 相信大家已经了解到java具有跨平台的特性,可以“一次编译,到处运行”,在windows下编写的程序,无需任何修改就可以在linu...

java虚拟机(jvm)以及跨平台原理
相信大家已经了解到java具有跨平台的特性,可以“一次编译,到处运行”,在windows下编写的程序,无需任何修改就可以在linux下运行,这是c和c++很难做到的。

那么,跨平台是怎样实现的呢?这就要谈及java虚拟机(java virtual machine,简称 jvm)。

jvm也是一个软件,不同的平台有不同的版本。我们编写的java源码,编译后会生成一种 .class 文件,称为字节码文件。java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的jvm,就可以运行字节码文件,运行我们编写的java程序。

而这个过程中,我们编写的java程序没有做任何改变,仅仅是通过jvm这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。

jvm是一个”桥梁“,是一个”中间件“,是实现跨平台的关键,java代码首先被编译成字节码文件,再由jvm将字节码文件翻译成机器语言,从而达到运行java程序的目的。

注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过jvm翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由jvm翻译成的机器码却不一样。

所以,运行java程序必须有jvm的支持,因为编译的结果不是机器码,必须要经过jvm的再次翻译才能执行。即使你将java程序打包成可执行文件(例如 .exe),仍然需要jvm的支持。

注意:跨平台的是java程序,不是jvm。jvm是用c/c++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的jvm。
解析Java的JVM以及类与对象的概念
关于jvm的执行效率

java 推出的前几年,人们有不同的看法,解释字节码肯定比全速运行机器码慢很多,牺牲性能换来跨平台的优势是否值得?

然而,jvm 有一个选项,可以将使用最频繁的字节码翻译成机器码并保存,这一过程被称为即时编译。这种方式确实很有效,致使微软的 .net 平台也使用了虚拟机。

现在的及时编译器已经相当出色,甚至成了传统编译器的竞争对手,某些情况下甚至超过了传统编译器,原因是jvm可以监控运行时信息。例如,即时编译器可以监控使用频率高的代码并进行优化,可以消除函数调用(即“内嵌”)。

但是,java 毕竟有一些c/c++没有的额外的开销,关键应用程序速度较慢。比如java采用了与平台无关的绘图方式,gui程序(客户端程序)执行要慢;虚拟机启动也需要时间。
客户端市场的折戟

java 的gui库称不上出色,界面不算友好,大部分用户不太习惯;java 的客户端资源消耗也比较大,大数据量的应用和功能复杂的应用性能堪忧。

更加不能接受的是,微软因自身利益和sun分家后,windows 便不再预装jvm了,用户安装你的程序之前,必须要安装jvm并正确设置,你可以要求普通用户安装你的软件,但是你能期望他了解jvm的有关知识并正确安装设置吗?

虽然你可以将jvm集成在你的程序中,自动安装并设置,不让用户干预,但是你希望附带一个比你的程序还要大好多的jvm吗?一个软件这样做或许可以接受,成千上万个软件都这样做,那用户要安装多少个jvm?磁盘空间要浪费多少?

所以,直接投放市场的面向普通用户的客户端程序,用java开发的很少,大部分java开发的客户端是给企业内部员工使用,员工领到电脑时,技术部已经给配置好了。如果你希望从事客户端开发,建议学习 c/c++ 和 .net,它们在window客户端开发方面有较大的优势。

种种原因,注定了java客户端不利于推向市场,让普通用户接受。不过话又说回来,客户端开发也不是java的初衷,java最初是面向嵌入式的,却随着互联网的兴起而快速成长,在web开发上大显身手。

java类和对象的概念
java是一门面向对象的编程语言,理解java,首先要理解类与对象这两个概念。

java中的类可以看做c语言中结构体的升级版。结构体是一种构造数据类型,可以包含不同的成员(变量),每个成员的数据类型可以不一样;可以通过结构体来定义结构体变量,每个变量拥有相同的性质。例如:

#include <stdio.h>
int main(){
  // 定义结构体 student
  struct student{
    // 结构体包含的变量
    char *name;
    int age;
    float score;
  };
  // 通过结构体来定义变量
  struct student stu1;
  // 操作结构体的成员
  stu1.name = "小明";
  stu1.age = 15;
  stu1.score = 92.5;
 
  printf("%s的年龄是 %d,成绩是 %f\n", stu1.name, stu1.age, stu1.score);
  return 0;
}

运行结果:

小明的年龄是 15,成绩是 92.500000

java中的类也是一种构造数据类型,但是进行了一些扩展,类的成员不但可以是变量,还可以是函数;通过类定义出来的变量也有特定的称呼,叫做“对象”。例如:

public class demo {
  public static void main(string[] args){
    // 定义类student
    class student{ // 通过class关键字类定义类
      // 类包含的变量
      string name;
      int age;
      float score;
      // 类包含的函数
      void say(){
        system.out.println( name + "的年龄是 " + age + ",成绩是 " + score );
      }
    }
    // 通过类来定义变量,即创建对象
    student stu1 = new student(); // 必须使用new关键字
    // 操作类的成员
    stu1.name = "小明";
    stu1.age = 15;
    stu1.score = 92.5f;
    stu1.say();
  }
}

运行结果:

小明的年龄是 15,成绩是 92.5

在c语言中,通过结构体名称就可以完成结构体变量的定义,并分配内存空间;但是在java中,仅仅通过类来定义变量不会分配内存空间,必须使用new关键字来完成内存空间的分配。

可以将类比喻成图纸,对象比喻成零件,图纸说明了零件的参数及其承担的任务;一张图纸可以生产出具有相同性质的零件,不同图纸可以生产不同类型的零件。

在java中,使用new关键字,就可以通过类来创建对象,即将图纸生产成零件,这个过程叫做类的实例化,因此也称对象是类的一个实例。

注意:类只是一张图纸,起到说明的作用,不占用内存空间;对象才是具体的零件,要有地方来存放,才会占用内存空间。

类所包含的变量和函数都有特定的称呼,变量被称为属性(通常也称成员变量),函数被称为方法,属性和方法统称为类的成员。
面向对象编程(object oriented programming, oop)

类是一个通用的概念,java、c++、c#、php等很多编程语言中都有类,都可以通过类创建对象。可以将类看做是结构体的升级版,c语言的晚辈们看到了c语言的不足,尝试加以改善,继承了结构体的思想,并进行了升级,让程序员在开发或扩展大中型项目时更加容易。

因为java、c++等语言都支持类和对象,所以使用这些语言编写程序也被称为面向对象编程,这些语言也被称为面向对象的编程语言。c语言因为不支持类和对象的概念,被称为面向过程的编程语言。

实际上,面向对象只是面向过程的升级。

在c语言中,可以将完成某个功能的重复使用的代码块定义为函数,将具有一类功能的函数声明在一个头文件中,不同类型的函数声明在不同的头文件,以便对函数进行更好的管理,方便编写和调用。

在java中,可以将完成某个功能的代码块定义为方法,将具有相似功能的方法定义在一个类中,也就是定义在一个源文件中(因为一个源文件只能包含一个公共的类),多个源文件可以位于一个文件夹,这个文件夹有特定的称呼,叫做包。
解析Java的JVM以及类与对象的概念

上面是c++,而java则为:
解析Java的JVM以及类与对象的概念
面向对象编程在软件执行效率上绝对没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路,带来编程思想上的革新。