Є масивом об’єктом у Java


93

У Java ми можемо оголосити масив як

String[] array = new String[10]; 
int size = array.length; 

Чи означає це, що сам масив є об’єктом? Оскільки в C ++ масив - це просто вказівник і не має жодних методів.


5
Ні, в C ++ масив - це масив, а не масив.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
О, і в C ++ і масиви, і вказівники є об'єктами.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Усі масиви С ++ справді є об'єктами С ++, але є вказівники С ++, які не є об'єктами С ++, а саме всі вказівники, які є результатом оцінки значення r. Приклади включають &x, p+iі new int(42).
fredoverflow

1
@skaffman Повідомлення не є суворо необхідним, оскільки воно не компілюється інакше.
shmosel

Відповіді:


197

Так.

Розділ 4.3.1 специфікації мови Java починається з:

Об'єкт - це екземпляр класу або масив.


4
До цього часу я завжди вважав, що об’єкт є синонімом екземпляра класу, і що масиви є особливою мовною особливістю чи щось подібне.
Ruben9922,

Детальне пояснення наведено тут: geeksforgeeks.org/array-primitive-type-object-java
гранат

60

Так; Специфікація мови Java пише :

У мові програмування Java масиви є об'єктами (§4.3.1), динамічно створюються і можуть бути призначені змінним типу Object (§4.3.2). Усі масиви класу Object можуть бути викликані в масиві.


Якщо масив є об’єктом, чи не означає це, що він є екземпляром класу? Якщо так, чи можу я продовжити цей клас?
One Two Three

9
Ні, це не так: специфікація Java пише : "Об'єкт є екземпляром класу або масивом. Екземпляр класу явно створюється виразом створення екземпляра класу (§15.9). Масив явно створюється виразом створення масиву. (§15.10). ". І ні, ви не можете розширити масив, оскільки речення extends має містити ClassType.
meriton

36

Ну, давайте запитаємо Java!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Вихід:

true
true

1
Ви також можете заявити int[] someIntegers = {42};, до того ж результату.
Holger

7

Так, це об’єкт у Java.

Також зауважте, що коли ви це array.lengthробите, ви не використовуєте будь-які методи, а просто отримуєте доступ до lengthполя масиву . У класі Arrays існує безліч статичних методів .


3

Важливо зазначити, що масиви в Java мають власні байтові коди, якими вони не діляться з об'єктами. Вони, безумовно, є Об’єктами, але на низькому рівні з ними обробляють дещо інакше.


2

Я б сказав, що відповідь так, хоча я міг би додати, що, власне кажучи, масив - це об'єкт і в C ++. З §1.8 [intro.object] чинного стандарту (FDIS):

Об'єкт є областю зберігання.



1

Кожен масив у Java є об'єктом ex int [] a = new int [2]; Тож new використовується для створення об’єкта, і оскільки це об’єкт, ми можемо перевірити назву класу, просто використовуючи a.getClass (). GetName ();


1
  1. Масив не є екземпляром будь-якого класу, перерахованого в дереві класів, однак кожен масив є об'єктом і успадковується безпосередньо від java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Клас java.util.Arraysє допоміжним класом, і масиви не є екземплярами цього класу.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Клас java.lang.reflect.Arrayє допоміжним класом, і масиви не є екземплярами цього класу.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Масиви успадковують усіх членів java.lang.Object

  2. Масиви замінюють метод, clone()успадкований від Object.

  3. Масиви реалізують поле length, яке містить кількість компонентів масиву. довжина може бути додатною або нульовою. Це publicі final.

  4. Масиви реалізують інтерфейси Cloneableта java.io.Serializable.

8а. Масиви підтримуються Class<T>. Ви можете отримати Class<T>екземпляр із екземпляра масиву

(new int[2]).getClass()

або з типу масиву

int[].class

8б. Унікальний екземпляр класу відображення (тобто екземпляр java.lang.Class<T>) створюється для кожного різного типу масиву у вашому коді. Приклади

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Повторити: Масиви є об’єктами, але не є екземплярами будь-якого класу в дереві класів.

ЛІТЕРАТУРА

З розділу специфікації Java 4.3.1 Об’єкти

  • Об'єкт - це екземпляр класу або масив.

  • Екземпляр класу явно створюється виразом створення екземпляра класу.

  • Масив явно створюється виразом створення масиву.

З java.util.Arrays

  • Цей клас містить різні методи обробки масивів (наприклад, сортування та пошук)

З java.lang.reflect.Array

  • Клас Array надає статичні методи для динамічного створення та доступу до масивів Java.

З розділу 10.1 Об'єкти

  • Прямим суперкласом типу масиву є Object.

  • Кожен тип масиву реалізує інтерфейси Cloneableта java.io.Serializable.

З розділу 10.7 Члени масиву

Членами типу масиву є всі наступні:

  • Публічне кінцеве поле length, яке містить кількість компонентів масиву. довжина може бути додатною або нульовою.

  • Відкритий метод clone, який замінює однойменний метод у класі Objectі не видає перевірених винятків. Тип повернення cloneметоду типу масиву T[]- T[].

  • Клон багатовимірного масиву неглибокий, тобто він створює лише один новий масив. Підмасиви є спільними.

  • Усі члени, успадковані від класу Object; єдиний метод Object, який не успадковується, - це метод клонування.


1

Масиви чого-небудь є об'єктами. Можна назвати такі методи, як equals, і hashcodeт.д .:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Не можна викликати методи рідного типу.


0

Дотримуйтесь фрагмента коду та виводу.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

чітко масив a розглядається як об'єкт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.