-
Сходства и различия между C++ и Java
1. Указатель ★★★★★
Указатели в C C++ обеспечивают большую гибкость, но гибкость также таит в себе опасности. Неправильная работа указателей может легко вызвать такие проблемы, как утечки памяти или зависание указателей.
Java отменяет указатели. Но на самом деле имя всех ссылочных типов данных, объявленных в Java, можно понимать как указатель. Имя хранится в памяти стека и указывает на пространство, открытое в памяти при вызове new.
нравиться:
массив int[] = новый int[10]
Массив имен целочисленного массива находится в памяти стека, а в кученой памяти открывается пространство размером 10*4 байта, и массив указывает на блок памяти.
Массив можно понимать как указатель, а хранящийся в нем адрес — это пространство, созданное new.
нравиться:
класс Человек {
…
}
Человек р = новый Человек ();
Имя объекта p открывается в памяти стека, и new используется для освобождения места в динамической памяти для объекта. Имя объекта p указывает на динамическую память.
Но на самом деле имя не похоже на указатель в C++, особенно при передаче параметров.
Java заявила, что передача параметров осуществляется по значению.
Но когда ссылочный тип данных используется в качестве параметра функции, при передаче объявленного объекта p1 фактически создается копия объекта p2. Этот p2 указывает на p1, поэтому при вызове членов от p1 до p2 он может это сделать. быть завершено, дождитесь завершения вызова функции и сохраните модификацию. нравиться:
класс Человек {
публичное имя строки;
общественный возраст;
public Person(String name,int age){
это.имя = имя;
this.age = возраст;
}
}
тест общественного класса {
public static void main(String[] args){
Человек p = новый Человек("Чжан Сан", 10);
System.out.println("До изменения -->Имя: "+ p.name+", Возраст: "+p.age);
ChangePro(p); //Передается объект p, и создается копия p. Предположим, что это p1, который указывает на p. //Через эту копию p1 можно вызывать члены p.
System.out.println("После модификации -->Имя: "+ p.name+", Возраст: "+p.age);
}
public static voidchangePro(Person p){ //Члены исходного объекта можно вызывать через копию
p.name = "李思";
стр.возраст = 30;
}
}
результат:
До внесения изменений --> Имя: Чжан Сан, возраст: 10 лет.
После внесения изменений --> Имя: Ли Си, возраст: 30 лет.
Но когда вы передаете p1, создается копия p2, а затем попытка изменить указание p1 на p2, очевидно, невозможна. В это время изменяется только указание p2. После завершения вызова функции указание. p1 остается неизменным. нравиться:
класс Человек {
публичное имя строки;
общественный возраст;
public Person(String name,int age){
это.имя = имя;
this.age = возраст;
}
}
тест общественного класса {
public static void main(String[] args){
Человек p = новый Человек("Чжан Сан", 10);
System.out.println("До изменения -->Имя: "+ p.name+", Возраст: "+p.age);
ChangeObj(p); //Передается объект p, который является копией p. Предположим, что это p1, который указывает на p. //В функции меняется только указатель этой копии.
System.out.println("После модификации -->Имя: "+ p.name+", Возраст: "+p.age);
}
public static Person newP = new Person("李思", 30);
public static voidchangeObj(Person p){
p = newP; //Попытка изменить указатель, но на самом деле меняется указатель копии.
//После завершения функции направление исходного объекта не изменится
}
}
результат:
До внесения изменений --> Имя: Чжан Сан, возраст: 10 лет.
После модификации --> Имя: Чжан Сан, возраст: 10 лет.
2. Динамическое распределение памяти.
В C++ команды new и delete используются для динамического выделения и повторного использования памяти. New — это освобождение места в куче памяти. После того, как память использована, для ее повторного использования необходимо использовать команду delete.
Пока в Java объявлен ссылочный тип данных, перед использованием необходимо использовать new, чтобы освободить пространство памяти. Но после смерти объекта нет необходимости вручную освобождать память. Собственный механизм переработки памяти Java автоматически перерабатывает объекты мусора (так называемые объекты мусора относятся к ранее открытой объектной памяти, на которую больше не ссылается память стека). Конечно, переработку вручную также можно выполнить с помощью метода System.gc().
3. Деструктор
Функция деструктора C++ (без параметров, без возвращаемого значения) заключается в освобождении динамически выделенного пространства памяти в конструкторе, то есть в вызове (этот вызов можно вызвать через объект. деструктор, либо система может автоматически дождаться, пока срок жизни объекта заканчивается. Вызов деструктора.
В Java нет деструктора, и объекты мусора автоматически перерабатываются с помощью механизма сбора мусора. Однако вы можете добиться того же эффекта, что и деструктор в C++, переопределив метод fanalize() в классе Object. Когда объект уничтожается вручную или автоматически, метод fanalize() будет вызван автоматически.
4. Содержимое пустых классов
Пустой класс C++ должен иметь 4 функции: конструктор по умолчанию, деструктор по умолчанию и конструктор копирования по умолчанию.
Пустые классы Java включают: конструктор по умолчанию, методы, унаследованные от класса Object, такие как
Атрибуты по умолчанию в классах В классах C++ существует три типа прав доступа к членам: общедоступный>защищенный>частный. Если не объявлено, разрешение по умолчанию является частным.
В классах Java существует четыре типа прав доступа к членам: общедоступный>защищенный>по умолчанию>частный. По умолчанию установлено разрешение по умолчанию.
5. Реализация функций-членов в классах
Это принято в C++. h Функция объявлена в классе заголовочного файла вне класса; Чтобы реализовать функцию в файле cpp, #include файл заголовка.
нравиться:
//demo.h
Класс Человек {
Общественный:
Void fun(); //Объявлено в классе
}
//demo.cpp
#include «demo.h»
Void Person::fun(){ //Реализация вне класса
. . . . //тело реализации
}
Java — это объявление + метод реализации в классе. Если оно не реализовано в классе, добавление ключевого слова Abstract является абстрактным методом.
нравиться:
класс Человек {
Public void fun(){//Объявление + реализация в классе
. . . . //тело реализации
}
}
6. Создание объектов
класс Человек {
частный:
средний возраст;
публика:
Человек(){}
Человек(int а){
возраст = а;
}
недействительное веселье(){….}
}
. . . . //Начало основной функции
Person p1 //Вызывается конструктор без параметров;
Person p2(18); //Вызов параметризованного конструктора
p1.fun(); //Вызов функции-члена
p2.fun();
Чтобы создать экземпляр объекта в Java, вы должны использовать новое ключевое слово.
класс Человек {
частное имя строки;
частный возраст;
публичный человек(){}
public Person (строковое имя, int age) {
это.имя = имя;
this.age = возраст;
}
public void fun() {…..}
}
. . . . . //Начало основной функции
Человек p1 = ноль;
p1 = new Person(); //Вы должны использовать ключевое слово new, чтобы освободить пространство памяти и вызвать конструктор без параметров.
Person p2 = new Person("Чжан Сан", 18); //Вызов параметризованного конструктора.
p1.fun(); //Вызов метода
p2.fun();
7. Это ключевое слово
В C++ он называется this указателем. При создании экземпляра объекта по умолчанию создается указатель this, указывающий на этот объект. Он используется компилятором для различения разных объектов одного и того же класса. То есть как объект. При использовании функции-члена вы узнаете, какой это объект, с помощью указателя this, и вызываете функцию-член для управления свойствами-членами объекта.
В Java это имеет три применения:
1. Представляет атрибуты или методы этого класса. Такой, как этот. Метод, это. свойство.
2. Представляет текущий объект.
3. Вызовите метод конструктора этого класса. Например, this(), this(параметр 1, параметр 2...).
[Функции использования 1 и 2 аналогичны указателю this в C++. 】
8. Вызов членов объекта
C++ передает объекты. Функция-член или указатель класса->функция-член для вызова.
В Java вы можете передавать только объекты. Вызов функции-члена.
Члены атрибута Static этих двух классов могут передаваться напрямую через имя класса. Функции-члены вызываются напрямую.
9. Подкласс -> Родительский класс, параметры, передаваемые конструктором, имеют кое-что общее: если конструктор в подклассе четко не указывает, какой конструктор родительского класса вызывать, система по умолчанию вызывает конструктор родительского класса без параметров. сорт. В то же время, если родительский класс определяет конструктор с параметрами, лучше всего определить конструктор без параметров.
класс Человек {
частный:
средний возраст;
публика:
Человек(){}
Человек(int а){
возраст = а;
}
}
Студент класса: публичный человек {
частный:
int оценка;
публика:
Student(int a, int s):Person(a){ //Переходим в конструктор родительского класса
оценка = с;
}
}
класс Человек {
частное имя строки;
частный возраст;
публичный человек(){}
public Person (строковое имя, int age) {
это.имя = имя;
this.age = возраст;
}
}
класс Student расширяет Person{
частный внутренний счет;
public Student (имя строки, int age, int оценка) {
super(name,age); //переходим к конструктору родительского класса
this.score = оценка;
}
}
10. Полиморфизм
Полиморфизм в C++ должен достигаться с помощью [виртуальной функции или чисто виртуальной функции + покрытия подклассов виртуальной функции или чисто виртуальной функции].
Виртуальные функции объявляются с помощью virtual,
нравиться:
virtual void fun(); //Объявление внутри класса
имя класса void: fun() {….}//реализация вне класса
Java использует подклассы для переопределения обычных методов в обычных родительских классах, подклассы для переопределения обычных методов или абстрактных методов в абстрактных классах и подклассы для переопределения абстрактных методов в интерфейсах. + Трансформация вверх.
Абстрактные методы объявляются как абстрактные и не имеют реализации контента.
нравиться:
абстрактное void fun(); //Нет реализации внутри класса
11. Абстрактные классы Ни один абстрактный класс не может создавать экземпляры объектов. Чистые виртуальные функции и абстрактные методы имеют схожие концепции и схожие функции.
Можно также сказать, что в C++ существуют абстрактные классы, классы с чисто виртуальными функциями.
Чистая виртуальная функция — это виртуальная функция без реализации содержимого и «=0», которая не может создавать экземпляры объектов.
нравиться:
virtual void fun() = 0 //Объявлен как =0 внутри класса, но не реализован вне класса.
Абстрактный класс в Java — это класс, объявленный с ключевым словом Abstract и содержащий абстрактные методы. Объект не может быть создан.
Интерфейс в Java — это специальный класс или специальный абстрактный класс. Он состоит из статических констант и абстрактных функций.
12. Права доступа
C++ использует три метода наследования для изменения прав доступа членов между подклассами и родительскими классами.
Студент класса: публичный человек {
публика:
. . . . . .
Частный:
. . . . . .
};
рабочий класса: защищенный человек {
публика:
. . . . . .
Частный:
. . . . . .
};
Класс фермер: частное лицо{
публика:
. . . . . .
Частный:
. . . . . .
};
Java реализует права доступа к членам разных классов через механизм пакетов.
Пакет орг.тьют.а
класс Человек {
частный…..
частный……
общественность…….
общественный…
}
пакет org.tuyt.b
класс Человек {
частный…..
частный……
общественность…….
общественный…
}
пакет org.tuyt.c
класс Человек {
частный…..
частный……
общественность…….
общественный…
}
13. Идея пакета предварительной обработки C++ и импорта Java одинакова: если вы хотите использовать класс, отличный от текущего класса,
В C++ используйте директиву прекомпиляции #include перед определением класса, чтобы включить подключаемую библиотеку классов.
Стандартные библиотеки классов используют угловые скобки < > без h. Используйте двойные кавычки "" с h в пользовательской библиотеке классов, и сначала он будет искаться по текущему пути.
нравиться:
#include <iostream>
#include «demo.h»
В Java, чтобы импортировать класс, который вы хотите использовать, используйте команду импорта и укажите пакет, в котором находится класс.
нравиться:
импорт Java. Ланг. *;
импортировать организацию. тют. *;