Подтвердить что ты не робот

Можете ли вы создать структуру класса, которая не имеет Object в качестве базового класса

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

Итак, интересно, где это "правило" указано внутри JVM? Можно ли каким-то образом манипулировать этим классом, например, добавлять или удалять метод или переменную? Возможно ли создать параллельную иерархическую структуру независимо от класса Object?

4b9b3361

Ответ 1

Если вы хотите создать класс, который не получается прямо или косвенно из java.lang.Object, вы должны создать файл класса, который не имеет указанного суперкласса.

Теперь, если вы посмотрите на код JDK, который разбирает файл класса, вы обнаружите, что анализатор файла класса делает это check:

if (super_class_index == 0) {
  check_property(class_name == vmSymbols::java_lang_Object(),
                 "Invalid superclass index %u in class file %s",
                 super_class_index,
                 CHECK_(nullHandle));
} else {

поэтому он отклонит ваш базовый класс. Только java.lang.Object не может иметь суперкласс.

Ответ 2

Сам класс Object действительно особенный. Если вы посмотрите на реализацию в rt.jar в вашей jre-папке, вы заметите, что большинство ее методов - это просто объявления с модификатором native.

package java.lang;

public class Object
{
  private static native void registerNatives();

  public final native Class<?> getClass();

  public native int hashCode();

  public boolean equals(Object paramObject)
  {
    return this == paramObject;
  }

  protected native Object clone()
    throws CloneNotSupportedException;

  public String toString()
  {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
  }

  public final native void notify();

  public final native void notifyAll();

  public final native void wait(long paramLong)
    throws InterruptedException;

  public final void wait(long paramLong, int paramInt)
    throws InterruptedException
  {
    if (paramLong < 0L) {
      throw new IllegalArgumentException("timeout value is negative");
    }
    if ((paramInt < 0) || (paramInt > 999999)) {
      throw new IllegalArgumentException("nanosecond timeout value out of range");
    }
    if (paramInt > 0) {
      paramLong += 1L;
    }
    wait(paramLong);
  }

  public final void wait()
    throws InterruptedException
  {
    wait(0L);
  }

  protected void finalize()
    throws Throwable
  {}

  static {}
}

Эти собственные методы реализованы внутри самой JVM. Эти методы являются мостом между нативной и управляемой частями Java-программы. Из-за этого естественно, что этот класс Object является "общим в каждом объекте". Язык Java указан таким образом, что нет возможности создавать отдельную иерархию классов, кроме Object.

Об изменении Object

Хотя я еще не пробовал этого, возможно было бы изменить исходный класс Object. Он уверен, что существующие методы не могут быть удалены, потому что большая часть времени выполнения зависит от них, но я вижу, что вы можете добавлять новые методы, изменяя сам режим выполнения.

Кажется, вы не можете использовать java-агенты для изменения Object, String, ClassLoader, Class<?>, ProtectionDomain, IllegalClassFormatException и классы массивов.

Ответ 3

Правило указано в JLS, раздел 8.1.4:

[T] он прямой суперкласс класса типа C является типом, указанным в предложении extends объявления C, если существует предложение extends, или Object иначе.

Каждый класс является либо прямым подклассом Object, либо не предоставляя предложение extends, либо явно расширяя Object, либо косвенный подкласс Object, явно расширяя другой подкласс Object.

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

Ответ 4

Класс объектов Java является суперклассом для всех классов, которые вы объявляете.

Согласно Oracle:

Класс Object в пакете java.lang находится в верхней части окна дерево иерархии классов. Каждый класс является потомком, прямым или косвенным, класса Object. Каждый класс, который вы используете или записываете, наследует методы экземпляра объекта. Вам не нужно использовать какой-либо из этих методов, но, если вы решите это сделать, вам может потребоваться переопределить их кодом что характерно для вашего класса.

Методы класса Object могут быть переопределены в соответствии с вашими потребностями.

Например: переопределение equals() и hashcode() в POJO является обычной практикой.

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

Ответ 5

  • где это "правило" указано внутри JVM?

Не выполняется JVM. Компилятор добавляет extends Object к вашему классу.

  1. Можно ли каким-то образом манипулировать этим классом.

НЕТ

  1. Возможно ли создать параллельную иерархическую структуру независимо от класса Object?

Нет. вы не можете. Каждый класс java в любом случае расширит класс Object, и вы просто не сможете его избежать.