В этой статье я собираюсь обсудить некоторые ключевые различия между Java и C/C++.

  1. C/C++ имеет статическое распределение памяти, а Java – динамическое.

Так что же здесь означает статика и динамика? Статическое выделение памяти означает, что выделение памяти происходит во время компиляции (c/c++). Динамическое означает, что выделение памяти происходит во время выполнения программы (Java).

2.C/C++ зависят от платформы. Java не зависит от платформы.

Независимость от платформы означает, что мы можем написать исходный код в одной операционной системе и выполнить его в другой операционной системе (написать один раз, запустить где угодно). Например, если вы пишете программу Java в операционной системе Windows, вы можете запустить ее в другой ОС (Linux или Mac OS) без изменения исходного кода. Платформо-зависимые средства компиляции и выполнения должны выполняться в одной и той же операционной системе.

Так почему же Java не зависит от платформы, а C/C++ зависит от платформы? Потому что программа Java не запускается непосредственно на компьютере. Он работает поверх машины под названием JVM (виртуальная машина Java). Исходный код Java компилируется в байт-код Java. Этот байт-код не зависит от платформы. (Это не зависит от ОС.) JVM выполняет этот байт-код в файл .exe. Здесь JVM зависит от платформы. Поскольку этот байт-код не зависит от платформы, мы говорим, что Java не зависит от платформы.

Но в c/c++ исходный код напрямую компилируется в файл .exe. Здесь нет промежуточного файла, как в Java. Компилятор напрямую преобразует его в файл .exe для конкретной ОС.

3. C++ поддерживает множественное наследование, но Java не поддерживает множественное наследование.

Наследование — одна из основных концепций объектно-ориентированного программирования. C следует парадигме процедурно-ориентированного программирования, а C++ и Java следуют парадигме объектно-ориентированного программирования. Поскольку C следует парадигме процедурно-ориентированного программирования, мы не можем говорить о наследовании в C. Проще говоря, наследование означает передачу свойств (переменных и методов) суперкласса его подклассу.

Так почему же Java не поддерживает множественное наследование? Давайте посмотрим на этот пример.

public class A {
    // variables
    int number1 = 10;
    int number2 = 20;

    // Method
    public void displayNumber() {
        System.out.println("Summation is: " + number1 + number2);
    }
}
public class B {
    // variable
    int number1 = 10;
    int number2 = 20;

    // Method
    public void displayNumber() {
        System.out.println("The division is: " + number1/number2);
    }
}
public class C extends A,B {
}

Если вы попытаетесь наследовать один подкласс от нескольких суперклассов, это называется множественным наследованием. В Java это невозможно, потому что, как в этом примере, если суперклассы имеют тот же метод, что и displayNumber(), возникнет неопределенность относительно того, какой метод следует унаследовать. по подклассу. Разработчикам языка Java необходимо было уменьшить сложность и упростить язык. Вот почему Java не поддерживает множественное наследование.

4. В C/C++ используются механизмы передачи параметров как по значению, так и по ссылке. Java использует только механизм передачи параметров по значению.

а) вызов по значению в c

#include <stdio.h>

// Function that uses call by value
void increment(int num) {
    num = num + 1;
}

int main() {
    int x = 5;
    printf("Before increment: x = %d\n", x);
    increment(x);
    printf("After increment: x = %d\n", x);
    return 0;
}

Здесь вывод

Before increment: x = 5
After increment: x = 5

б) вызов по ссылке в c

#include <stdio.h>

// Function that uses call by reference
void incrementByReference(int *num) {
    *num = *num + 1;
}

int main() {
    int x = 5;
    printf("Before increment: x = %d\n", x);
    incrementByReference(&x);
    printf("After increment: x = %d\n", x);
    return 0;
}

Здесь вывод

Before increment: x = 5
After increment: x = 6

Здесь мы передаем переменную-указатель в функцию incrementByReference(). Это означает, что мы передаем в функцию переменную-указатель, и это не просто обычная переменная. Затем внутри функции происходит увеличение на единицу переменной x внутри основного метода. Но в примере a) приращение происходит к локальной переменной с именем num в функции increment().

в) вызов по ссылке в Java

public class CallByValueExample {

    // Method that uses call by value
    public static void increment(int num) {
        num = num + 1;
        System.out.println("Inside method: num = " + num);
    }

    public static void main(String[] args) {
        int x = 5;
        System.out.println("Before increment: x = " + x);
        increment(x);
        System.out.println("After increment: x = " + x);
    }
}

Выход:

Before increment: x = 5
Inside method: num = 6
After increment: x = 5

Когда мы передаем параметр методу в Java, мы передаем копию значения фактического аргумента. Любые изменения параметра внутри метода не влияют на исходный аргумент.

Тогда почему Java не использует механизм передачи параметров по ссылке? Потому что в Java не используется концепция указателей. Таким образом, нет переменных-указателей. По этой причине в Java невозможно сохранить фактическое местоположение переменной в памяти.

Надеюсь, у вас есть идеи по поводу Java и C/C++. Спасибо за чтение.