В этой статье мы рассмотрим основные концепции Java, которые каждый новичок должен знать для своих интервью. Мы рассмотрим такие темы, как JDK, JRE, JVM, переменные, ключевое слово this, чтение и отображение данных, инкапсуляция, полиморфизм (перегрузка/переопределение), наследование, ключевое слово super, абстракция/интерфейсы, ключевые слова static и final. Кроме того, следите за новостями в следующих статьях, в которых мы углубимся в более сложные темы, такие как структуры данных и обработка исключений.

1. Введение: JDK, JRE, JVM

  • ПОЧЕМУ язык Java не зависит от платформы?

Когда вы запускаете программу Java, исходный код сначала компилируется компилятором Java в байт-код. Этот байт-код представляет собой независимый от платформы код, который может выполняться на любой платформе с JVM (виртуальная машина Java). JVM отвечает за интерпретацию байт-кода и его перевод на собственный машинный язык, который затем выполняется ЦП. Это означает, что выполнение программы отправляется на JVM, а не непосредственно на машину, и, поскольку байт-код не зависит от платформы, код Java может выполняться на любой машине, на которой установлена ​​JVM, независимо от базовой операционной системы или оборудования. архитектура. Таким образом, способность Java работать на нескольких платформах без модификации делает его независимым от платформы языком.

  • JDK, JRE, JVM

JVM (виртуальная машина Java): среда для выполнения файлов байт-кода.

JRE (Java Runtime Execution): пакет программного обеспечения, состоящий из классов JVM + библиотеки. Это позволяет компьютерам выполнять программу Java.

JDK (комплект для разработки Java): он состоит из JRE и других компонентов, таких как компиляторы, отладчики и JavaDoc. Это позволяет разработчикам писать и выполнять код.

Таким образом, если вы хотите разработать Java-приложение/программу, у вас должен быть установлен JDK. Если вы хотите запустить только существующую Java-программу, вам просто нужна JRE.

2. переменные Java

  • Java чувствительна к регистру, что означает, что x и X — две разные переменные. В java имена переменных могут начинаться с: буквы, _, $, а затем комбинации букв, цифр и символов.
  • В Java переменные можно разделить на две широкие категории: примитивные типы и ссылочные типы.

Примитивные типы — это базовые типы данных, встроенные в язык Java, такие как int, double, boolean, char и т. д. Эти типы представляют простые значения, такие как числа, символы и значения true/false. Их называют «примитивными», потому что они не являются объектами и не имеют методов.

Ссылочные типы, с другой стороны, являются объектами, которые хранят ссылки на области памяти, где объекты фактически хранятся. Эти типы включают классы, массивы, строки, интерфейсы и перечисления. Ссылочные типы иногда также называют объектами, поскольку они являются экземплярами класса.

3. Это ключевое слово

Мы используем ключевое слово this в двух случаях:

  • Если мы хотим различать параметры метода/конструктора и переменные экземпляра с одинаковыми именами. В этом случае this относится к текущему объекту, экземпляру этого класса. В этом примере this.x относится к переменной x текущего объекта MyProgram, а x относится к параметру метода.
public class MyProgram{

 int x;
 int y;

 MyProgram(int x, int y){
  this.x=x;
  this.y=y;
 }

}
  • Если мы хотим вызвать один конструктор в другом конструкторе того же класса. В скобках мы указываем параметры вызываемого конструктора. В нашем случае мы вызываем конструктор по умолчанию.
public class MyProgram{

 MyProgram(){
  x=0;
  y=0;
 }

 MyProgram(int x, int y){
  if(x<0 && y<0){
   this(); // calling the constructor MyProgram()
 }else{
   this.x=x;
   this.y=y;
 }

}

4. Чтение данных/отображение данных

4.1 Чтение данных:

  • для чтения String мы используем next() / nextLine()
  • для чтения int мы используем nextInt()
  • для чтения double мы используем nextDouble()
  • для чтения float мыиспользуем nextFloat()
  • для чтения char мы используем next().chartAt(0)

Разница между next() и nextLine()

В Java next() и nextLine() — это методы, предоставляемые классом Scanner для чтения ввода из консоли или других входных потоков.

Основное различие между ними состоит в том, что next() считывает ввод до первого символа пробела (пробела, табуляции или новой строки), а nextLine() считывает ввод до конца строки.

4.2 Отображение данных

Печать каждого сообщения на новой строке:

System.out.println("Hello world 1");
System.out.println("Hello world 2");

Печать сообщений в одной строке:

System.out.print("Hello world 1");
System.out.print("Hello world 2");

Печать форматированных сообщений:

System.out.printf("The number is %d",3);

=› другой способ сделать это:

String message = String.format("The number is %d",3);
System.out.print(message);

5. Инкапсуляция

Инкапсуляция — это механизм объектно-ориентированного программирования, который позволяет нам назначать уровни видимости членам класса, чтобы определять привилегии доступа этих членов за пределами класса.

Важно понимать модификаторы доступа, используемые для этого:

  • public: применимо к классу, атрибутам (переменным класса), методам и конструкторам. «общедоступный» означает доступный где угодно за пределами класса.
  • private: применимо к атрибутам и методам. «Частный» означает доступ непосредственно внутри класса, где он только объявлен.
  • защищено: применимо к атрибутам и методам. «защищенный» означает доступ непосредственно внутри класса, в котором он объявлен, и его подклассов, независимо от того, находятся ли эти подклассы в одном пакете или нет.
  1. По умолчанию, если мы не указываем никаких модификаторов доступа для класса, переменной класса или метода, его видимость является «приватной для пакета». Это означает, что видимость ограничена классами в одном пакете.
  2. Обычно конструкторы делают «общедоступными», атрибуты — «приватными», а методы — «общедоступными» для достижения инкапсуляции и управления доступом к внутренностям класса.
  3. Мы можем определить несколько классов в одном и том же файле Java, но только один из них может быть объявлен как «общедоступный», и его имя должно совпадать с именем файла. Остальные классы должны иметь пакетный доступ.
  4. Если атрибут или метод виден за пределами своего класса, доступ к нему можно получить напрямую, используя имя класса, за которым следует имя атрибута или метода, например ClassName.attribute или ClassName.method.

6. Полиморфизм

Полиморфизм — это механизм объектно-ориентированного программирования, который позволяет методу иметь различное поведение в зависимости от того, где он реализован. Существует два уровня полиморфизма:

  1. Полиморфизм уровня компиляции, также известный как перегрузка:

В Java под перегрузкой понимается создание более одного метода с одинаковым именем в одном классе. Каждый метод имеет разные параметры, которые могут различаться по типу, количеству или тому и другому. Однако возвращаемый тип метода не учитывается при перегрузке методов. Если мы попытаемся создать один и тот же метод дважды с одним и тем же именем и параметрами, но с разными типами возвращаемого значения, компилятор выдаст ошибку, не позволяющую нам скомпилировать код.

Вот пример, иллюстрирующий это:

public class MyClass{

  public int countNumbers(int x, int y){
   // some code
  }

  public int countNumbers(int x, int y, int z){
   // some code
  }

  public double countNumbers(double x, double y){
   // some code
  }

  // not a polymorphism -- error 
  public void countNumbers(double x, double y){
   // some code
  }
}

2. Полиморфизм уровня выполнения, также известный как переопределение:

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

7. Наследование

В объектно-ориентированном программировании наследование — это механизм, который позволяет классу наследовать члены (атрибуты и методы) другого класса. Мы используем ключевое слово extends, чтобы указать, что класс наследуется от суперкласса.

public class ChildClass extends ParentClass{

}
  1. В Java подкласс может наследовать только не частные члены (атрибуты и методы) своего родительского класса. Однако он не может наследовать конструктор родительского класса.
  2. Переопределение метода в Java позволяет подклассу предоставлять собственную реализацию метода, унаследованного от его родительского класса. Подкласс также может присваивать новые значения унаследованным атрибутам, что дает ему гибкость с точки зрения реализации.
  3. В Java, когда метод объявляется абстрактным в родительском классе, он должен быть переопределен подклассами. Это связано с тем, что абстрактный метод не имеет реализации в родительском классе, а подкласс должен ее предоставить.
  4. В Java подкласс может наследовать только от одного родительского класса, используя ключевое слово «extends». Множественное наследование не поддерживается в Java, хотя класс может реализовывать несколько интерфейсов.
// this is wrong
public class A extends B, C{ 
}

8. супер ключевое слово :

Мы используем его в двух случаях.

  1. Когда подкласс переопределяет методы и переопределяет атрибуты родительского класса, но мы хотим вызвать исходный метод или атрибут родительского класса в его подклассе, мы можем использовать ключевое слово super. Например, мы можем использовать «super.method()» или «super.attribute» для ссылки на метод или атрибут родительского класса.
public class A{

 int x=2;
 
 public void display(){
   System.out.println("Hello from parent class");
 }
 
}

public class B extends A{

 int x =3;

 public void display(){
   System.out.println("Hello from subclass");
 }

 public void myTest(){
  
 System.out.println(x); // displays 3
 System.out.println(super.x);  // displays 2
 display(); // displays : Hello from subclass
 super.display; // displays : Hello from parent class

 }

 
}

2. Хотя конструкторы не могут наследоваться подклассами, их можно вызывать. Мы используем «super()» для вызова конструктора родительского класса. Важно отметить, что Java автоматически вызывает конструктор по умолчанию (либо тот, который Java имеет по умолчанию для объектов, если конструктор не был создан, либо непараметризованный конструктор, который мы создаем в родительском классе). Однако если мы создадим хотя бы один параметризованный конструктор в родительском классе, то мы должны явно вызвать его внутри конструктора дочернего класса с помощью «super()».

9. Абстракции/интерфейсы

9.1 Абстракция

  • абстрактные классы

Абстрактный класс — это класс, который не может быть создан. Поэтому мы не можем использовать ключевое слово new с этим типом класса. Мы объявляем класс как абстрактный с помощью ключевого слова abstract ииспользуем следующий синтаксис:

abstract public class A{

}

=› Абстрактный класс в Java может содержать абстрактные и неабстрактные методы и может содержать только постоянные переменные, объявленные с помощью ключевых слов «final» и «static».

=› Чтобы создать объект абстрактного класса, мы используем его подклассы следующим образом:

давайте предположим, что у нас есть абстрактный класс с именем A, у которого есть подкласс с именем C. Тогда мы можем сделать следующее:

  public void main(String[]args){
     A a = new C(); 
  
 /* We can always declare an object of type A but 
  we should assign it to an object of its subclass. */
  }
  • абстрактные методы

Абстрактные методы объявляются без тела.

В качестве примера:

abstract public class A{

abstract public void display(); // this is an abstract method

}

=› Если метод объявлен как абстрактный, он должен существовать в абстрактном классе.

=› Если метод является абстрактным, он должен быть переопределен во всех подклассах своего класса.

9.2 Интерфейсы

Мы объявляем интерфейс с помощью ключевого слова interface, используя синтаксис:

public interface MyInterface{

}

=› мы не можем создать экземпляр интерфейса в Java. Интерфейсы абстрактны и не имеют никакой реализации, поэтому нет объекта для создания экземпляра.

public class A {

public void main(String[] args){
 MyInterface i ; //right
 new MyInterface();  //wrong
}

}

В Java мы можем объявить переменную типа интерфейса и присвоить ее объекту класса, который реализует этот интерфейс. Например:

interface MyInterface {
    void myMethod();
}

class MyClass implements MyInterface {
    public void myMethod() {
        System.out.println("Hello world!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterface myObj = new MyClass();
        myObj.myMethod(); // prints "Hello world!"
    }
}

=› Интерфейс может содержать только абстрактные методы; по умолчанию все его методы являются общедоступными и абстрактными.

=› Интерфейс может содержать только постоянные атрибуты; по умолчанию все его атрибуты являются общедоступными статическими и окончательными, им всегда должно быть присвоено значение.

=› Класс наследует свойства интерфейса с помощью ключевого слова implements. Класс реализует один или несколько интерфейсов и должен переопределять все свои методы.

=› Интерфейс наследует свойства другого интерфейса с помощью ключевого слова extends. Интерфейс расширяет один или несколько интерфейсов.

10. Статическая/финальная

10.1 статическое ключевое слово

Мы используем ключевое слово static с переменными и методами:

  • статическая переменная: это переменная класса, одна копия этой переменной создается и используется всеми экземплярами класса. Его значение всегда одинаково для всех его экземпляров. Поскольку это переменная класса, мы можем вызвать ее вне класса, используя имя класса: «className.variable».
  • статический метод — это метод, объявленный с ключевым словом static. Он может вызывать только статические переменные и статические методы внутри своего тела. Мы можем вызвать его вне его класса напрямую, используя имя класса: «className.method».

10.2 final ключевое слово

Мы используем ключевое слово final с классами, переменными и методами:

  • конечный класс — это класс, у которого не может быть подклассов, наследующих его члены.
  • конечная переменная: это переменная, значение которой не может быть изменено после ее первого присвоения => константа.
  • окончательный метод — это метод, который нельзя переопределить.

Спасибо, что нашли время прочитать эту статью. Если вы нашли это полезным, не забудьте подписаться на меня, чтобы получать больше полезного контента по этой теме и не только. Будьте в курсе последних событий и лучших практик в мире программирования на Java.