Объекты и классы Java

Как объектно-ориентированный язык программирования, Java поддерживает следующие основные концепции:

1, Класс:

  • Шаблон, который определяет объекты, включая атрибуты и методы.
  • Пример:public class Car { ... }

2. Объект:

  • Экземпляр класса, обладающий состоянием и поведением.
  • Пример:Car myCar = new Car();

3. Наследование:

  • Класс может наследовать атрибуты и методы другого класса.
  • Пример:public class Dog extends Animal { ... }

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

  • Сделайте состояние объекта (поля) приватным, а доступ к нему осуществляйте через публичные методы.
  • Пример:
    private String name; 
    public String getName() { return name; }

5. Полиморфизм:

  • Объекты могут появляться в нескольких формах, что в основном реализуется через перегрузку методов и переопределение методов.
  • Пример:
    • Перегрузка методов:public int add(int a, int b) { ... }иpublic double add(double a, double b) { ... }
    • Переопределение методов:@Override public void makeSound() { System.out.println("Meow"); }

6. Абстракция:

  • Используйте абстрактные классы и интерфейсы для определения методов, которые должны быть реализованы, без предоставления конкретных реализаций.
  • Пример:
    • Абстрактный класс:public abstract class Shape { abstract void draw(); }
    • Интерфейс:public interface Animal { void eat(); }

7. Интерфейс:

  • Определяет методы, которые класс должен реализовать, поддерживая множественное наследование.
  • Пример:public interface Drivable { void drive(); }

8. Метод:

  • Определяет поведение класса; функции, содержащиеся в классе.
  • Пример:public void displayInfo() { System.out.println("Info"); }

9. Перегрузка методов:

  • Один и тот же класс может иметь несколько методов с одинаковым именем, но разными параметрами.
  • Пример:
    public class MathUtils {
        public int add(int a, int b) {
            return a + b;
        }
    
        public double add(double a, double b) {
            return a + b;
        }
    }
    

В этом разделе мы сосредоточимся на понятиях объектов и классов.

  • Объект: объект — это экземпляр класса (объект — это не про поиск девушки), и у него есть состояние и поведение.
  • Класс: класс — это шаблон, который описывает поведение и состояние типа объектов.

На рисунке нижемальчик、девочка— этокласс, и каждый конкретный человек являетсяобъект:

На рисунке нижеавтомобиль— этокласс, и каждый конкретный автомобиль — этоавтомобильобъекткласса, и объект содержит цвет, марку, название автомобиля и т. д.


Объекты в Java

Теперь давайте глубже разберёмся, что такое объект. Посмотрите на реальный мир вокруг вас; вы найдёте множество объектов вокруг, таких как машины, собаки, люди и так далее. Все эти объекты имеют собственное состояние и поведение.

Возьмём собаку в качестве примера: её состояние включает имя, породу и цвет, а поведение включает лай, виляние хвостом и бег.

Сравнивая объекты реального мира с программными объектами, они очень похожи.

Программные объекты также имеют состояние и поведение. Состояние программного объекта — это его атрибуты, а поведение отражается через методы.

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

Классы в Java

Класс можно рассматривать как шаблон для создания объектов Java.

Создайте простой класс, как показано на рисунке выше, чтобы понять определение класса в Java:

public class Dog { String breed; int size; String colour; int age; void eat() { } void run() { } void sleep(){ } void name(){ } }

Класс может содержать следующие типы переменных:

  • Локальные переменные: Переменные, определённые в методах, конструкторах или блоках операторов, называются локальными переменными. Объявление и инициализация переменной происходят в методе, и когда метод завершается, переменная автоматически уничтожается.
  • Переменные-члены: Переменные-члены — это переменные, определённые в классе, но вне тел методов. Такие переменные создаются при создании объекта. К переменным-членам могут обращаться методы, конструкторы и блоки операторов конкретного класса.
  • Переменные класса: Переменные класса также объявляются в классе, вне тел методов, но они должны быть объявлены как static.

Класс может иметь несколько методов. В примере выше eat(), run(), sleep() и name() — все они являются методами класса Dog.


Методы-конструкторы

У каждого класса есть конструктор. Если для класса конструктор не определён явно, компилятор Java предоставит для этого класса конструктор по умолчанию.

При создании объекта должен быть вызван как минимум один конструктор. Имя конструктора должно совпадать с именем класса, и класс может иметь несколько конструкторов.

Ниже приведён пример конструктора:

public class Puppy{ public Puppy(){ } public Puppy(String name){ //Этот конструктор имеет только один параметр: name } }

Создание объектов

Объекты создаются из классов. В Java для создания нового объекта используется ключевое слово new. Создание объекта включает следующие три шага:

  • Объявление: Объявите объект, включая имя объекта и тип объекта.
  • Создание экземпляра: Используйте ключевое слово new для создания объекта.
  • Инициализация: Когда объект создаётся с помощью new, вызывается конструктор для инициализации объекта.

Ниже приведён пример создания объекта:

public class Puppy{ public Puppy(String name){ //Этот конструктор имеет только один параметр: name System.out.println("Имя щенка:" + name ); } public static void main(String[] args){ //Следующий оператор создаст объект Puppy Puppy myPuppy = new Puppy( "tommy" ); } }

Скомпилируйте и запустите приведённую выше программу, и она выведет следующий результат:

小狗的名字是 : tommy

Доступ к переменным экземпляра и методам

Доступ к переменным-членам и методам-членам через созданный объект, как показано ниже:

/*Создание экземпляра объекта*/ Object referenceVariable = new Конструктор(); /*Доступ к переменным в классе*/ referenceVariable.variableName; /*Доступ к методам в классе*/ referenceVariable.methodName();

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


Пример

В следующем примере показано, как получить доступ к переменным экземпляра и вызывать методы-члены:

Код файла Puppy.java:

public class Puppy { private int age; private String name; //Конструктор public Puppy(String name) { this.name = name; System.out.println("Имя щенка:" + name); } //Установить значение age public void setAge(int age) { this.age = age; } //Получить значение age public int getAge() { return age; } //Получить значение name public String getName() { return name; } //Метод Main public static void main(String[] args) { //Создать объект Puppy myPuppy = new Puppy("Tommy"); //Установить age с помощью метода myPuppy.setAge(2); //Вызвать другой метод, чтобы получить age int age = myPuppy.getAge(); System.out.println("Возраст щенка:" + age); //Вы также можете обращаться к переменным-членам напрямую (через методы-геттеры) System.out.println("Значение переменной:" + myPuppy.getAge()); } }

Скомпилируйте и запустите вышеприведённую программу, получив следующий результат:

小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2

Правила объявления исходного файла

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

  • Исходный файл может содержать только один public-класс
  • Исходный файл может содержать несколько классов, не являющихся public
  • Имя исходного файла должно совпадать с именем public-класса. Например, если public-класс в исходном файле называется Employee, то исходный файл должен называться Employee.java.
  • Если класс определён в пакете, то оператор package должен быть первой строкой исходного файла.
  • Если исходный файл содержит операторы import, они должны располагаться между оператором package и определением класса. Если оператора package нет, операторы import должны находиться в самом начале исходного файла.
  • Операторы import и оператор package действуют для всех классов, определённых в исходном файле. В одном и том же исходном файле нельзя задавать разным классам разные объявления package.

Классы имеют несколько уровней доступа, а также делятся на разные типы: абстрактные классы, final-классы и так далее. Они будут рассмотрены в главе «Управление доступом».

Помимо перечисленных выше типов, в Java также есть некоторые специальные классы, например:Внутренние классы、Анонимные классы。


Пакеты Java

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

Инструкции import

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

Например, следующая командная строка даст компилятору указание загрузить все классы по пути java_installation/java/io.

import java.io.*;

Простой пример

В этом примере мы создаём два класса:EmployeeиEmployeeTest。

Сначала откройте редактор кода, вставьте в него следующий код и сохраните файл какEmployee.java。

Класс Employee имеет четыре переменные-члены: name, age, designation и salary. Этот класс явно объявляет метод-конструктор, который имеет только один параметр.

Код файла Employee.java:

import java.io.*; public class Employee { private String name; private int age; private String designation; private double salary; //Конструктор класса Employee public Employee(String name) { this.name = name; } //Установите значение age public void setAge(int age) { this.age = age; } //Получить значение age public int getAge() { return age; } //Установить значение designation public void setDesignation(String designation) { this.designation = designation; } //Получить значение designation public String getDesignation() { return designation; } //Установить значение salary public void setSalary(double salary) { this.salary = salary; } //Получить значение salary public double getSalary() { return salary; } //Вывести информацию public void printEmployee() { System.out.println(this); } //Переопределите метод toString @Override public String toString() { return "Имя:" + name + "\n" + "Возраст:" + age + "\n" + "Должность:" + designation + "\n" + "Зарплата:" + salary; } }

Все Java-программы начинают выполнение сmain-метода. Чтобы запустить эту программу, необходимо включить метод main и создать объект-экземпляр.

Ниже приведён класс EmployeeTest, который создаёт два экземпляра класса Employee и вызывает методы для установки значений переменных.

Сохраните следующий код в файле EmployeeTest.java.

Код файла EmployeeTest.java:

import java.io.*; public class EmployeeTest { public static void main(String[] args) { //Используйте конструктор для создания двух объектов Employee empOne = new Employee("EXAMPLE1"); Employee empTwo = new Employee("EXAMPLE2"); //Вызовите методы-члены этих двух объектов empOne.setAge(26); empOne.setDesignation("Senior programmer"); empOne.setSalary(1000); empOne.printEmployee(); empTwo.setAge(21); empTwo.setDesignation("Novice programmer"); empTwo.setSalary(500); empTwo.printEmployee(); } }

Скомпилируйте эти два файла и запустите класс EmployeeTest, и вы увидите следующий результат:

$ javac EmployeeTest.java Employee.java
$ java EmployeeTest 
名字:EXAMPLE1
年龄:26
职位:高级程序员
薪水:1000.0
名字:EXAMPLE2
年龄:21
职位:Example程序员
薪水:500.0
Другие расширения