Сұрыпталған тізімді пайдалану кезінде алаптың нысаны қалай жасалады

new деген сөзбен конструктор шақырғанда Java ішіндегі array нысанын түсінемін:

int[] myIntArray = new int[3];

Бірақ орнына жазамын

int[] myIntArray = {1,2,3};

array нысаны жасалынады, бірақ оның конструкторын new деп шақырған жоқпын. Бұл сорғыш астында қалай жұмыс істейді - объектіні конструктор шақырусыз Java-да қалай жасауға болады?

3

6 жауаптар

Жиын нысанын жасау болсақ, ол синтаксистік қант болып табылады. Құрастырылғанда, ол стандартты синтаксисте жұмыс істейді.

Айырмашылық мынада, бірінші нұсқамен сіз массивді толтырмайсыз - барлық элементтер әдепкі мәні int үшін нөлге тең.

Екінші нұсқамен, сіз массаны толтыратын және жасайсыз.

6
қосылды

Бірінші нұсқа әдепкі 0 мәнімен бүтін сан жиынын толтырады. Екінші мән мағыналарды нақты анықтайды.

Бірінші нұсқа тең

int[] myIntArray = {0, 0, 0};

ал екіншісі бірдей

int[] myIntArray = new int[] {1,2,3};

Жаңа кілт сөз, мысалы, декларативті емес мәлімдемелер үшін міндетті болып табылады.

int[] myIntArray;
myIntArray = new int[] {1,2,3};
4
қосылды

Бұл кодты алып, оны құрастырыңыз:

public class ArrayTest {
    public static void main1() {
        int[] array = new int[3]; array[0] = 10; array[1] = 20; array[3] = 30;
    }

    public static void main2() {
        int[] array = new int[] {10, 20, 30};
    }

    public static void main3() {
        int[] array = {10, 20, 30};
    }
}

Содан кейін javap -c дегенді пайдаланыңыз және келесі нәтижелерді алу үшін оның байт-кодын қарау үшін оны бөлшектеңіз. Бірақ кейінірек екі үзінді немесе әдіс бірдей кодты құрастырады. int [] array = new int [] {1, 2, 3} және int [] array = {1, 2, 3} бірдей. Бірақ жеке-жеке массив жасай отырып және оның элементтерінің әрқайсысына мәндерді тағайындау әртүрлі өңделеді және кейінгі екі үзінділер бірінші үзінді үшін синтаксистік қант болып табылмайды.

$ javap -c ArrayTest
Compiled from "ArrayTest.java"
public class ArrayTest extends java.lang.Object{
public ArrayTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

public static void main1();
  Code:
   0:   iconst_3
   1:   newarray int
   3:   astore_0
   4:   aload_0
   5:   iconst_0
   6:   bipush  10
   8:   iastore
   9:   aload_0
   10:  iconst_1
   11:  bipush  20
   13:  iastore
   14:  aload_0
   15:  iconst_3
   16:  bipush  30
   18:  iastore
   19:  return

public static void main2();
  Code:
   0:   iconst_3
   1:   newarray int
   3:   dup
   4:   iconst_0
   5:   bipush  10
   7:   iastore
   8:   dup
   9:   iconst_1
   10:  bipush  20
   12:  iastore
   13:  dup
   14:  iconst_2
   15:  bipush  30
   17:  iastore
   18:  astore_0
   19:  return

public static void main3();
  Code:
   0:   iconst_3
   1:   newarray int
   3:   dup
   4:   iconst_0
   5:   bipush  10
   7:   iastore
   8:   dup
   9:   iconst_1
   10:  bipush  20
   12:  iastore
   13:  dup
   14:  iconst_2
   15:  bipush  30
   17:  iastore
   18:  astore_0
   19:  return
2
қосылды

Екі мәлімдеме бірдей. Екінші нұсқа int [] myIntArray = {1,2,3}; жаңа әдісті қолданып, синтаксис үшін қысқартылған.

int [] myIntArray = {1,2,3}, массивтің осы ұзындығы жақшалар арасында берілген және үтірлермен бөлінген мәндердің саны бойынша анықталады.

2
қосылды

Капотаның астында массивді инициализациялаудың екі жолы да бірдей.

Басқа мысал үшін мына қараңыз:

String str = "Hello";//no 'new' statement here

String str = new String("Hello");

Екі мәлімдеме бірдей нәрсені жасайды, бірақ екіншісінен әлдеқайда ыңғайлы. Бірақ капюшының астында олар компиляциядан кейін бірдей нәрсені жасайды.

0
қосылды
@vjay, жақсы табу!
қосылды автор jh314, көзі
Мен екеуі де солай істейтініне сенімді емеспін. екінші код үзіндісі конструктордың шақырылуына әкеледі. біріншісі болмайды. олардың үзінділерін құрастырғаннан кейін олардың байтоводтық нұсқалары: gist.github.com/VijayKrishna/5834992
қосылды автор vijay, көзі
Сізге рахмет @ jh314 Мен де сен деп ойлаймын. Мен JIT қалай жасай алатындығын таңқалдырамын, сондықтан неге сенімді екенімді айттым. :)
қосылды автор vijay, көзі
@PierreRymiortz, бұл пәрменді терминалға/пәрмен жолында орындаңыз: javap -c <.class кеңейтімі жоқ сынып файлының атауы
қосылды автор vijay, көзі
-1 себебі бірінші мысал интернеттегі String литералының мысалы болып табылады және мүмкін, тіпті объектіні жасай алмайды, ал екінші мысалда String literal сөзі бар анық құрылыста болады және екі нысан жасай алады! (біреуі интернетте, екіншісі - жоқ).
қосылды автор Tim Bender, көзі
.Class файлын IDE сияқты тұтылуды оқыңыз. Сонымен қатар стандартты jdk, javap жүйесінде құрал бар, менің ойымша, біреу, бірақ мен оны пайдаланбадым.
қосылды автор Tim Bender, көзі
@vijay соншалықты қызықты. Егер сіз маған сұрамайтын болсаңыз, компиляциядан кейін байтоводтың көрінісіне қалай қол жеткізесіз?
қосылды автор Pierre Rymiortz, көзі