อาร์เรย์เป็นวัตถุใน Java หรือไม่?


94

ใน 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 อาร์เรย์ C ++ ทั้งหมดเป็นวัตถุ C ++ แน่นอน แต่มีตัวชี้ C ++ ที่ไม่ใช่วัตถุ C ++ คือตัวชี้ทั้งหมดซึ่งเป็นผลมาจากการประเมินค่า r ตัวอย่าง ได้แก่&x, และp+i new int(42)
fredoverflow

1
@skaffman ข้อความไม่จำเป็นอย่างยิ่งเนื่องจากจะไม่รวบรวมเป็นอย่างอื่น
shmosel

คำตอบ:


198

ใช่.

ข้อกำหนดภาษา Java ส่วน 4.3.1เริ่มต้นด้วย:

ออบเจ็กต์คืออินสแตนซ์คลาสหรืออาร์เรย์


4
จนถึงตอนนี้ฉันมักจะคิดว่าอ็อบเจ็กต์ตรงกันกับอินสแตนซ์คลาสและอาร์เรย์นั้นเป็นคุณลักษณะภาษาพิเศษหรืออะไรบางอย่าง
Ruben9922

มีคำอธิบายโดยละเอียดที่นี่: geeksforgeeks.org/array-primitive-type-object-java
โกเมน

60

ใช่; ข้อกำหนดภาษา Java เขียน :

ในภาษาโปรแกรม Java อาร์เรย์คือออบเจ็กต์ (§4.3.1) ถูกสร้างขึ้นแบบไดนามิกและอาจกำหนดให้กับตัวแปรประเภท Object (§4.3.2) เมธอดคลาสทั้งหมดอาจถูกเรียกใช้บนอาร์เรย์


ถ้าอาร์เรย์เป็นออบเจ็กต์ไม่ได้หมายความว่าเป็นอินสแตนซ์ของคลาสใช่หรือไม่? ถ้าเป็นเช่นนั้นฉันสามารถขยายชั้นเรียนนั้นได้หรือไม่
One Two Three

9
ไม่มันไม่ได้: ข้อมูลจำเพาะของ Java เขียนว่า : "อ็อบเจ็กต์คืออินสแตนซ์คลาสหรืออาร์เรย์อินสแตนซ์คลาสถูกสร้างขึ้นอย่างชัดเจนโดยนิพจน์การสร้างอินสแตนซ์คลาส (§15.9) อาร์เรย์ถูกสร้างขึ้นอย่างชัดเจนโดยนิพจน์การสร้างอาร์เรย์ (§15.10).”. และไม่คุณไม่สามารถขยายอาร์เรย์ได้เนื่องจากส่วนคำสั่งขยายต้องมี ClassType
บุญ

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):

วัตถุเป็นพื้นที่ของการจัดเก็บข้อมูล


2

ผมแค่อยากจะเพิ่มว่าอาร์เรย์มีตัวแทนในการสะท้อน API ที่ - java.lang.reflect.Array


1

ทุกอาร์เรย์ใน java คือ object ex int [] a = new int [2]; ใหม่จึงใช้ในการสร้างวัตถุและเนื่องจากเป็นวัตถุเราสามารถตรวจสอบชื่อคลาสได้โดยใช้ 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

8b. อินสแตนซ์คลาสการสะท้อนเฉพาะ (เช่นอินสแตนซ์ของ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 Objects

  • superclass Objectในโดยตรงของชนิดอาร์เรย์

  • อาร์เรย์ทุกประเภทใช้อินเทอร์เฟซCloneableและjava.io.Serializable.

จากมาตรา 10.7 Array Members

สมาชิกของประเภทอาร์เรย์มีดังต่อไปนี้:

  • ฟิลด์สุดท้ายสาธารณะlengthซึ่งมีจำนวนส่วนประกอบของอาร์เรย์ ความยาวอาจเป็นบวกหรือศูนย์

  • เมธอดสาธารณะcloneซึ่งแทนที่เมธอดของชื่อเดียวกันในคลาสObjectและไม่มีการตรวจสอบข้อยกเว้น ประเภทการกลับมาของcloneวิธีการของชนิดอาร์เรย์คือT[]T[]

  • โคลนของอาร์เรย์หลายมิตินั้นตื้นซึ่งกล่าวได้ว่าสร้างอาร์เรย์ใหม่เพียงชุดเดียว มีการแชร์ Subarrays

  • สมาชิกทั้งหมดที่สืบทอดมาจากคลาส 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ถือว่าเป็นวัตถุ


0

ใช่เอกสารพูดอย่างนั้น:

อาร์เรย์เป็นวัตถุคอนเทนเนอร์ที่เก็บค่าจำนวนคงที่ของประเภทเดียว

โปรดสังเกตว่าประเภทดั้งเดิมของอาร์เรย์ (เช่นint[]หรือchar[]) เองก็เป็นวัตถุเช่นกัน

ทุกอาร์เรย์ขยายjava.lang.Objectและใช้งานอินเทอร์เฟซjavs.lang.Cloneableและjava.io.Serializable. ลายเซ็นประเภทรันไทม์ของอาร์เรย์[Lตามชื่อคลาสของประเภทคอมโพเนนต์ทันที (เช่น[Ljava.lang.String) อาร์เรย์ของชนิดดั้งเดิมมีลายเซ็นรันไทม์ดังต่อไปนี้:

  • [Bสำหรับbyte[];
  • [Sสำหรับshort[];
  • [Iสำหรับint[];
  • [Jสำหรับlong[];
  • [Fสำหรับfloat[];
  • [Dสำหรับdouble[];
  • [Cสำหรับchar[].
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.