Какой класс является суперклассом всех классов?
класс java.lang.Object является суперклассом для всех классов java. Вы можете увидеть с помощью следующего примера:
class test < public static void main(String a[])< System.out.println("hi this java"); >>
- output—
class test extends java.lang.Object
сама первая строка говорит, что по умолчанию она расширяет java.lang.Object.
Поделиться 03 января 2014 в 15:01
Я считаю, что это java.lang.Object
Поделиться 03 января 2014 в 14:42
java.lang.Object является суперклассом любого класса по умолчанию.
Также Класс Object является суперклассом для всех интерфейсов по умолчанию, например,
public interface ICommand < >class Test < ICommand c; Object o = c; //works fine >
Поделиться 03 января 2014 в 16:48
Object — это супер-класс всех других классов, которые вы используете, включая те, которые вы реализовали.
И вы увидите, что следующие методы наследуются от Object в каждом классе.
- equals(Object o)
- getClass()
- hashCode()
- notify()
- notifyAll()
- toString()
- wait()
- wait(long millis, int nanos)
- wait(long millis)
Вы можете найти это полезным
Поделиться 03 января 2014 в 14:49
Как уже сказали люди, Object — это класс, от которого каждый наследует. И, кстати, вы также можете переопределить методы, такие как «toString()», «equals()», чтобы подогнать ваши личные потребности в новом классе.
это хороший учебник для начала.
Поделиться 03 января 2014 в 16:20
Класс Object — это суперкласс всех классов. То же самое, что и Java
Поделиться 03 января 2014 в 14:42
Класс объекта — это суперкласс.
Корневой класс иерархии классов Java. Все не примитивные типы (включая массивы) наследуются либо напрямую, либо косвенно от этого класса.
Поделиться 03 января 2014 в 14:47
это корневой класс иерархии классов Java. Все непримитивные типы (включая массивы) наследуются либо напрямую, либо косвенно от этого класса. дополнительная информация на: http://developer.android.com/reference/java/lang/Object.html
Поделиться 03 января 2014 в 14:49
Класс объекта — это базовый класс или суперкласс всех классов. Он не является экземпляром объекта. Он является самым большим классом в Java
Класс в Java
Класс в Java — это описание или прототип объекта. Класс содержит свойства и методы объекта. В свойствах хранится состояние объекта, а методы описывают поведение объекта.
Возьмем простую строку из программы на Java:
Animal animal = new Animal();
Здесь создается объект animal класса Animal с помощью оператора new.
Давайте рассмотрим подробнее, из чего состоит класс.
Декларация класса
В простейшем случае класс Animal декларируется так:
public class Animal < // . >
Двойным слэшем обозначается комментарий. Между фигурными скобками находится тело класса — поля и методы.
Обычно класс декларируется в отдельном файле, и имя файла совпадает с именем класса и имеет расширение java. Например, класс Animal хранится в файле Animal.java.
Скомпилируется и несколько классов в файле, но не любых — два публичных класса (с модификатором public) не могут находиться в одном файле. Также имя публичного класса обязано совпадать с именем файла.
Модификаторы доступа рассмотрим позднее, но в данном случае public означает, что к классу Animal доступ возможен из любого места программы, в том числе из другого пакета.
Бывают еще внутренние классы — класс внутри класса — их рассмотрим позднее.
Также класс может наследоваться от другого класса или реализовывать интерфейс.
Тело класса
Тело класса — это то, что находится между фигурными скобками. Оно состоит из полей и методов. Также в нем может быть конструктор — один или несколько.
package ru.sysout.oklassah; public class Animal < // поле private int size; // конструктор public Animal() < >// конструктор public Animal(int size) < this.size = size; >// метод public int getSize() < return size; >>
В вышеприведенном классе Animal есть поле size, метод getSize() и два конструктора Animal() и Animal (int size).
Конструктор
Конструктор используется для создания объектов. То есть он выполняется при создании объекта с помощью оператора new.
Он отличается от метода тем, что его имя совпадает с именем класса и он не возвращает никакого типа. Тут у нас два конструктора, поэтому мы можем создавать объекты типа Animal двумя способами:
Animal animal = new Animal();
или с аргументом:
Animal animal = new Animal(5);
Учтите, что если в теле класса отсутствуют любые конструкторы, то компилятор сам подставляет конструктор без аргументов. То есть первый конструктор можно и не писать, если нужен только он. Но если уже написан конструктор с аргументами, и при этом пустой конструктор без аргументов тоже нужен, то его надо прописать, т.к. компилятор не добавит автоматически конструктор без аргументов при наличии хоть какого-то конструктора в классе.
Наследование
Создадим класс Cat, который наследуется от Animal:
public class Cat extends Animal < // . >
Смысл наследования в том, чтобы заново не создавать повторяющиеся поля и методы. Ясно, что кошка — это животное, у нее могут быть такие присущие всем животным свойства, как вес, размер. Допустим, у нас будет еще рыба, и она тоже имеет размер и вес. Чтобы не создавать эти свойства в каждом классе, мы их положим в Animal, а в Cat (и Fish) будем создавать только специфические для Cat (и Fish) свойства.
Animal считается суперклассом Cat. Вообще в Java у любого класса уже есть суперкласс, даже если он явно не прописывается, как для Animal. Это суперкласс Object, Animal под капотом наследуется от Object. Компилятор не требует прописывать это наследование в коде, но тем не менее любой объект уже обладает некоторыми свойствами и методами Object (носящими технический характер — например, методом для сравнения объектов), но об этом поговорим позднее.
Реализация интерфейса
Интерфейс — набор абстрактных методов. Реализуются эти методы в классах. (В Java 8 появились default-методы, которые реализуются прямо в интерфейсах, но обычно они не нужны).
Интерфейс — это контракт, который реализуется каждым классом по-своему. Рассмотрим пример. Создадим интерфейс Movable:
public interface Movable
В нем задекларирован метод move(), но не реализован. Предполагается, что любой класс, реализующий интерфейс Movable, по-своему реализует этот метод. Вот так его реализует Cat:
public class Cat extends Animal implements Movable < @Override public void move() < System.out.println("cat is running"); >>
А вот так его реализует Fish:
public class Fish extends Animal implements Movable < @Override public void move() < System.out.println("fish is swimming"); >>
Как показано выше, implements Movable означает, что класс реализует интерфейс Movable, то есть реализует все абстрактные методы, прописанные в интерфейсе.
Если класс реализует несколько интерфейсов, то они пречисляются через запятую.
Абстрактный класс
Есть еще один вариант задекларировать абстрактный метод move() — можно сделать это не в интерфейсе Movable, а в абстрактном классе — точнее, суперклассе Animal:
public abstract class Animal
Здесь мы помечаем метод move() ключевым словом abstract и не реализуем его. Также мы помечаем словом abstract сам класс Animal — любой класс, который содержит хотя бы один абстрактный метод, должен быть абстрактным.
Итоги
- Декларация класса выглядит так:
[ модификатор_доступа ] class ClassName [ extends SuperClassName ] [ implements InterfaceNames ]
В квадратных скобках выше перечислены необязательные элементы декларации.
- Публичный класс должен находиться в файле с таким же именем.
- Класс можно унаследовать от одного другого класса.
- Любой класс, который мы сами не наследуем от другого класса, является наследником Object.
- Класс может реализовывать несколько интерфейсов.
- Если класс содержит хотя бы один абстрактный метод, то он должен быть абстрактным.
Упражнения
задача 1
Ниже показано содержимое файла Car.java, почему файл не компилируется — найдите ошибку:
class Car < >public class Toyota extends Car
Задача 2
Скомпилируется ли такой файл Car.java?
class Nexia < >class Mazda
Задача 3
Скомпилируется ли Animal.java, если Movable и Eatable — корректно определенные в отдельных файлах интерфейсы:
class Animal implements Eatable, Movable
Задача 4
Скомпилируется ли Cat.java, если Animal и Feline — публичные, корректно определенные в отдельных файлах классы:
public class Cat extends Animal, Feline
Задача 5
Найдите ошибку компиляции:
class Animal < abstract public void move(); public void eat() <>; >
О модификаторах доступа public, private, protected читайте далее.
Автор sysout Опубликовано 02.10.2018 31.12.2020 Рубрики Core Java
Добавить комментарий Отменить ответ
Прошу прощения: на комментарии временно не отвечаю.
Какой класс суперкласс всех классов
На всех страницах документации по классу Android-документации показана иерархия наследования классов, и ее можно кликнуть.
Simon 03 янв. 2014, в 14:56
хорошо . я запутался для этого Throwable = Суперкласс всех классов, которые могут быть выброшены VM. Объект = корневой класс иерархии классов Java.
user3153149 03 янв. 2014, в 14:57
Хорошо . Спасибо всем экспертам ..
user3153149 03 янв. 2014, в 15:01
Нет путаницы. Все наследует от Object . Только Throwable исключения наследуются от Throwable . Все люди — хумнаны. Не все люди мужчины. Object=The superclass of all classes which can be thrown by the VM машиной, строго также верно, но это бесполезное утверждение, поскольку оно не является исключительным, например, TextView наследуется от Object но не является бросаемым.
Классы, объекты, методы
Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.
Шаблоном или описанием объекта является класс (class), а объект представляет экземпляр класса. Можно провести следующую аналогию. У нас у всех есть некоторое представление о машине — наличие двигателя, шасси, кузова и т.д. Есть некоторый шаблон auto — этот шаблон можно назвать классом. Реально же существующий автомобиль auto_solaris (фактически экземпляр данного класса) является объектом этого класса.
Определение класса
Класс определяется с помощью ключевого слова сlass. Вся функциональность класса представлена его членами — полями (полями называются переменные класса) и методами. Например, класс Book мог бы иметь следующее описание :
class Book < public String name; public String author; public int year; public void Info()< System.out.printf("Книга '%s' (автор %s) была издана в %d году \n", name, author, year); >>
Таким образом, в классе Book определены три переменных и один метод Info, который выводит значения этих переменных.
Кроме обычных методов в классах используются также и специальные методы, которые называются конструкторами. Конструкторы нужны для создания нового объекта данного класса и, как правило, выполняют начальную инициализацию объекта. Название конструктора должно совпадать с названием класса :
class Book < public String name; public String author; public int year; Book()< this.name = "неизвестно"; this.author = "неизвестно"; this.year = 0; >Book(String name, String author, int year) < this.name = name; this.author = author; this.year = year; >public void Info()
Класс Book имеет два конструктора. Первый конструктор без параметров присваивает «неопределенные» начальные значения полям. Второй конструктор присваивает полям класса значения, которые передаются через его параметры.
Так как имена параметров и имена полей класса в данном случае у нас совпадают — name, author, year, то мы используем ключевое слово this. Это ключевое слово представляет ссылку на текущий объект. Поэтому в выражении this.name = name; первая часть this.name означает, что name — это поле текущего класса, а не название параметра name. Если бы у нас параметры и поля назывались по-разному, то использовать слово this было бы необязательно.
Мы можем определить несколько конструкторов для установки разного количества параметров и затем вызывать один конструктор класса из другого :
public class Book < public String name; public String author; public int year; Book(String name, String author) < this.name = name; this.author = author; >Book(String name, String author, int year) < // вызов конструктора с двумя параметрами this(name, author); // определение третьего параметра this.year = year; >>
Вызов конструктора класса с двумя параметрами производится с помощью ключевого слова this, после которого в скобках указывается список параметров.
Создание объекта
Чтобы непосредственно использовать класс в программе, надо создать его объект. Процесс создания объекта двухступенчатый: вначале объявляется переменная данного класса, а затем с помощью ключевого слова new и конструктора непосредственно создается объект, на который и будет указывать объявленная переменная :
Book b; // объявление переменной определенного типа/класса b = new Book(); // выделение памяти под объект Book
После объявления переменной Book b; эта переменная еще не ссылается ни на какой объект и имеет значение null. Затем создаем непосредственно объект класса Book с помощью одного из конструкторов и ключевого слова new.
Инициализаторы
Кроме конструктора начальную инициализацию полей объекта можно проводить с помощью инициализатора объекта. Так можно заменить конструктор без параметров следующим блоком :
public class Book < public String name; public String author; public int year; /* начало блока инициализатора */ < name = "неизвестно"; author = "неизвестно"; year = 0; >/* конец блока инициализатора */ Book(String name, String author, int year) < this.name = name; this.author = author; this.year = year; >>
Методы класса
Метод класса в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-либо классу или объекту.
Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения определенного действия и может иметь набор входных параметров.
Различают простые методы и статические методы :
- простые методы имеют доступ к данным объекта конкретного экземпляра (данного класса);
- статические методы не имеют доступа к данным объекта, и для их использования не нужно создавать экземпляры (данного класса).
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
Кроме имени и тела (кода) у метода есть ряд других характеристик:
- набор модификаторов;
- тип возвращаемого значения;
- набор аргументов (параметров).
Модификаторы метода — public, protected, private
Модификаторы метода определяют уровень доступа. В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:
- public : открытый — общий интерфейс для всех пользователей данного класса;
- protected : защищённый — внутренний интерфейс для всех наследников данного класса;
- private : закрытый — интерфейс, доступный только изнутри данного класса.
Такое разделение интерфейсов позволяет сохранять неизменным открытый интерфейс, но изменять внутреннюю реализацию.
Для того чтобы создать статический метод, перед его именем надо указать модификатор static. Если этого не сделать, то метод можно будет вызывать только в приложении к конкретному объекту данного класса (будет нестатическим).
Класс может включать метод main, который должен иметь уровень доступа public; к нему обращается виртуальная машина Java, не являющаяся частью какого-либо пакета.
Абстрактный класс, abstract class
Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Пример абстрактного класса, включающего две абстрактные функции.
public abstract class Price < public abstract int getPriceCode(); public abstract double summPrice(int days); public int bonusPrice(int days) < return 1; >>
Переопределение метода, Override
В реализации ReleasePrice, наследующего свойства класса Price, «реализуем» абстрактные методы и «переопределяем» метод с использованием аннотации @Override :
public class ReleasePrice extends Price < public int getPriceCode() < return Disk.NEW_RELEASE; >public double summPrice(int days) < double summ = days*3; return summ; >/* * Метод bonusPrice переопределяем. В родительском метод возвращал 1, а здесь уже идет расчет */ @Override public int bonusPrice(int days) < if (days >1) return 2; return 1; > >
Теперь, если в родительском класса Price метод bonusPrice будет удален или переименован, то среда разработки должна выдать соответствующее сообщение. Компилятор также выдаст сообщение об ошибке.
Перегрузка методов, overload
Совокупность имени метода и набора формальных параметров называется сигнатурой метода. Java позволяет создавать несколько методов с одинаковыми именами, но разными сигнатурами. Создание метода с тем же именем, но с другим набором параметров называется перегрузкой. Какой из перегруженных методов должен выполняться при вызове, Java определяет на основе фактических параметров, передаваемых методу.
Пример класса Test с тремя перегруженными методами test :
public class Test < void test() < System.out.println("параметр отсутствует"); >void test(int a) < System.out.println("a = " + String.valueOf(a)); >void test (int a, int b) < System.out.println("a + b = " + String.valueOf(a + b)); >void test(double d) < System.out.println("d = " + String.valueOf(d)); >>
Пример использования класса Test:
public class Testing < public static void main(String args[]) < Test of = new Test(); double result = 30.25; of.test(); of.test(10); of.test(20, 10); of.test(result); >>
Java рекурсия
Рекурсией называется метод (функция), которая внутри своего тела вызывает сама себя.
Рассмотрим пример рекурсивного метода вычисления факториала. Для того чтобы вычислить n!, достаточно знать и перемножить между собой (n-1)! и n. Создадим метод, реализующий описанный способ.
static int fact (int n) < if (n == 1) < return 1; >else if (n == 2) < return 2; >else < return fact(n-1) * n; >>
Указанный рекурсивный метод вычисляет факториал натурального числа.
Рассмотрим пример, вычисляющий через рекурсию n-ое число Фибоначчи. Напомним, как выглядят первые элементы этого ряда: 1 1 2 3 5 8 13 …
static int fib (int n) < if (index else if (n == 1) return 1; else if (n == 2)) return 1; return fib (n-2) + fib (n-1); >
Суперкласс Object
В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив.
У класса Object есть несколько важных методов:
| Метод | Описание |
|---|---|
| Object clone() | Функция создания нового объекта, не отличающий от клонируемого |
| boolean equals(Object object) | Функция определения равенства текущего объекта другому |
| void finalize() | Процедура завершения работы объекта; вызывается перед удалением неиспользуемого объекта |
| Class getClass() | Функция определения класса объекта во время выполнения |
| int hashCode() | Функция получения хэш-кода объекта |
| void notify() | Процедура возобновления выполнения потока, который ожидает вызывающего объекта |
| void notifyAll() | Процедура возобновления выполнения всех потоков, которые ожидают вызывающего объекта |
| String toString() | Функция возвращает строку описания объекта |
| void wait() | Ожидание другого потока выполнения |
| void wait(long ms) | Ожидание другого потока выполнения |
| void wait(long ms, int nano) | Ожидание другого потока выполнения |
Методы getClass(), notify(), notifyAll(), wait() являются «финальными» (final) и их нельзя переопределять.
Проверка принадлежности класса instanceof
Для проверки принадлежности класса какому-либо объекту необходимо использовать ключевого слова instanceof. Иногда требуется проверить, к какому классу принадлежит объект. Это можно сделать при помощи ключевого слова instanceof. Это логический оператор, и выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).
Пример с рыбками. Допустим имеется родительский класс Fish и у него есть унаследованные подклассы SaltwaterFish и FreshwaterFish. Необходимо протестировать, относится ли заданный объект к классу или подклассу по имени
SaltwaterFish nemo = new SaltwaterFish(); if(nemo instanceof Fish) < // рыбка Немо относится к классу Fish // это может быть класс Fish (родительский класс) или подкласс типа // SaltwaterFish или FreshwaterFish. if(nemo instanceof SaltwaterFish) < // Немо - это морская рыбка! >>
Данная проверка удобна во многих случаях. Иногда приходится проверять принадлежность класса при помощи instanceof, чтобы можно было бы разделить логику кода:
void checkforTextView(View v) < if(v instanceof TextView) < // Код для элемента TextView >else < // Для других элементов View >>
Импорт класса import
Оператор import сообщает компилятору Java, где найти классы, на которые ссылается код. Любой сложный объект использует другие объекты для выполнения тех или иных функций, и оператор импорта позволяет сообщить о них компилятору Java. Оператор импорта обычно выглядит так:
import packane_name.Class_Name_To_Import;
За ключевым словом следуют класс, который нужно импортировать. Имя класса должно быть полным, то есть включать свой пакет. Чтобы импортировать все классы из пакета, после имени пакета можно поместить ‘.*;’
IDE Eclipse упрощает импорт. При написании кода в редакторе Eclipse можно ввести имя класса, а затем нажать Ctrl+Shift+O. Eclipse определяет, какие классы нужно импортировать, и добавляет их автоматически. Если Eclipse находит два класса с одним и тем же именем, он выводит диалоговое окно с запросом, какой именно класс вы хотите добавить.
Статический импорт
Существует ещё статический импорт, применяемый для импорта статических членов класса или интерфейса. Например, есть статические методы Math.pow(), Math.sqrt(). Для вычислений сложных формул с использованием математических методов, код становится перегружен. К примеру, вычислим гипотенузу.
hypot = Math.sqrt(Math.pow(side1, 2) + Math.pow(side2, 2));
В данном случае без указания класса не обойтись, так как методы статические. Чтобы не набирать имена классов, их можно импортировать следующим образом:
import static java.lang.Math.sqrt; import static java.lang.Math.pow; . hypot = sqrt(pow(side1, 2) + pow(side2, 2));
После импорта уже нет необходимости указывать имя класса.
Второй допустимый вариант, позволяющий сделать видимыми все статические методы класса:
import static java.lang.Math.*;
В этом случае не нужно импортировать отдельные методы. Но данный подход в Android не рекомендуется, так как требует больше памяти.