Java与C++有什么不同?

  • Post category:Java

Java和C++都是常用的编程语言,但它们之间有一些不同之处。下面是Java与C++不同之处的详细讲解。

1. C++是一种编译型语言,Java是一种解释型语言

在C++中,程序必须首先被编译成机器代码,然后才能执行。在Java中,程序是由Java虚拟机(JVM)解释执行的。这意味着Java程序可以在任何平台上运行,而C++程序需要重新编译才能在新平台上运行。

例如,下面是用C++编写的程序:

#include <iostream>

int main() {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}

要将此程序从源代码编译为可执行文件,您需要使用编译器(如g++),如下所示:

$ g++ -o hello-world hello-world.cpp

然后,要运行程序,您需要在命令行中运行它:

$ ./hello-world

然而,在Java中,您只需要编写以下内容的程序:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}

要运行程序,只需在命令行中键入以下命令:

$ java HelloWorld

2. 内存管理不同

C++需要手动管理内存,这意味着要动态地分配和释放内存。这会导致一些问题,例如内存泄漏和野指针。Java则通过垃圾回收器来管理内存,该程序会自动在不使用的对象周围回收内存。

例如,考虑以下C++程序:

#include <cstdlib>

int main() {
  int* array = new int[10];
  array[0] = 0;
  delete[] array;

  // Accessing deleted memory causes undefined behavior
  array[0] = 1;

  return 0;
}

该程序会分配一个10个元素的整数数组,然后在使用完该数组后将其删除。但是,如果程序尝试再次访问删除的数组,就会出现未定义的行为。这种情况在Java中是不可能发生的:

public class Main {
  public static void main(String[] args) {
    int[] array = new int[10];
    array[0] = 0;

    // No need to manually free memory
  }
}

示例1:

考虑以下C++程序:

#include <iostream>
#include <vector>

int main() {
  std::vector<int> numbers;
  numbers.push_back(1);
  numbers.push_back(2);
  numbers.push_back(3);

  for (int i = 0; i < numbers.size(); i++) {
    std::cout << numbers[i] << std::endl;
  }

  return 0;
}

该程序使用C++标准库中的vector来存储整数,并将1、2和3添加到该vector中。然后,程序遍历vector 并输出其元素。

等效的Java程序是:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    List<Integer> numbers = new ArrayList<Integer>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);

    for (int i = 0; i < numbers.size(); i++) {
      System.out.println(numbers.get(i));
    }
  }
}

该程序使用Java标准库中的ArrayList来存储整数,并将1、2和3添加到该List中。然后,程序遍历List并输出其元素。

示例2:

考虑以下C++程序:

#include <iostream>

class Shape {
public:
  virtual void draw() = 0;
};

class Circle : public Shape {
public:
  void draw() {
    std::cout << "Drawing a circle" << std::endl;
  }
};

int main() {
  Shape* shape = new Circle();
  shape->draw();
  delete shape;

  return 0;
}

该程序定义了一个抽象基类Shape和一个派生类Circle。Circle覆盖了Shape中的抽象函数draw。在主函数中,程序创建一个Circle对象,将其强制转换为其基类Shape的指针,并调用draw函数。

等效的Java程序是:

abstract class Shape {
  public abstract void draw();
}

class Circle extends Shape {
  public void draw() {
    System.out.println("Drawing a circle");
  }
}

public class Main {
  public static void main(String[] args) {
    Shape shape = new Circle();
    shape.draw();
  }
}

该程序定义了一个抽象基类Shape和一个派生类Circle。Circle覆盖了Shape中的抽象函数draw。在主函数中,程序创建一个Circle对象,将其强制转换为其基类Shape的引用,并调用draw函数。

以上就是Java与C++的不同之处的详细讲解,其中包含了两个示例说明。