В этой статье я собираюсь обсудить некоторые ключевые различия между Java и C/C++.
- 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++. Спасибо за чтение.