Массивы в отличие от элементарных типов byte, int, float относятся к ссылочным. Это значит, что вы оперируете не самим массивом, а указателем на него. Так запись
int [] a;
не обявляет массив массив, а создает именно указатель на целочисленный массив. Для того чтобы воспользоваться самим массивом его надо сначала создать с помошью ключевого слова new (которое кстати, используется для создания не только массивов но и обектов) например вот так:
int [] a = new int[3];
В результате выполнения этой операции мы создаем массив из 3 переменных типа int. При этом нумерация переменых начинается с нуля. Для того чтобы получить самое первое значение мы должны использовать запись:
a[0]
а для того чтобы получить последний элемент из массива
a[2]
Элементы в массиве могут быть любого типа, не только элементарного, но и ссылочного. Можно так же указать начальные значения для элементов массива вручную при его создании:
int [] a = {1,2,3};
Для создания двумерного массива используется такая конструкция:
int [][] a;
тогда обращаемся к элементу массива мы так:
a[0][0]
Фактически такой двумерный массив является просто массивом массивов и этим тоже можно пользоваться 🙂
Ну вот, если ничего не забыл, то самое основное чем можно пользоваться указал.
я так понял если я не создам массив при помощи ключевого слова new, то компилятор выдаст ошибку, когда я буду заносить в массив какое-нибудь значение.
Например:
int [] a;
a[0] = 1;
и ещё, нельзя сделать так?
int [3] a;
чтобы было сразу создан массив из 4 ячеек (0,1,2,3)?
Когда вы объявляете массив таким вот образом:
int [] arr;
Вы фактически не создаете объекта. Вы просто объявляете переменную. Можно считать что с ней не связан никакой объект пока вы не напишитеarr=new int[3]
А значит, компилятор действительно выбросит ошибку. Он знает что есть переменная a но не знает какой объект с ней связан. А после использования new к переменной привязывается новый объект (Массив ведь тоже объект в Java!). Отсюда же вытекает и ответ на ваш второй вопрос. Поскольку этап объявления переменной и этап ее инициализации вовсе не одно и то же, то так делать нельзя.ключевое слово new создает экземпляр классоа, а java на 99% состоит из этих самых классов. Исключением являются только примитивные типы (int, byte, short, char, long, float, boolean, double). Даже String которые мы можем объявить без ключевого слова new является объектом. (example: String s = «some text»; )
Ага, о чем я и говорю!
Кстати, Астемир, тебе Макаренко звонила? Говорила на тему проекта?
Дыа :). Все ок. Я с вами 🙂
Скинь мне на мыло свой скайп.
Я на моб тебе скинул. Я мыло потерял
А в чем разница между
int [] a
и
int a []
?
Я честно говоря никогда не задумывался 🙂 Но вроде какой-то особой разницы нет. По крайней мере, присваивать друг другу можно
Это, скорее всего, создатели придумали, чтобы переходить на Java было легко. Ведь в одном языке с одной стороны ставят, в другом с другой
Если не трудно ответьте пожалуйста на вопрос. 🙂
В данной программе
public class VarArgs {
public static void vaTest (int…v) {
System.out.print(«Количество аргументов: «+ v.length+ » Содержимое: «);
for (int x:v)
System.out.print(x+ «; «);
System.out.println();
}
public static void main (String args []) {
vaTest();
При вызове метода vaTest с отсутствующим параметром компилятор не ругается. Но в следующей программе в строке «vaTest ();» выдает ошибку:
«reference to vaTest is ambiguous, both method vaTest(int…) in Array.»
Почему он так поступает не могу понять :(.
public class VarArgs3 {
static void vaTest (int …v){
System.out.print(«Кол-во агрументов: «+v.length+ » «);
for (int x:v)
System.out.print(x+» «);
System.out.println();
}
static void vaTest (boolean …v){
System.out.print(«Кол-во агрументов: «+v.length+ » «);
for (boolean x:v)
System.out.print(x+» «);
System.out.println();
}
static void vaTest (String msg, int …v){
System.out.print(msg+»Кол-во агрументов: «+v.length+ » «);
for (int x:v)
System.out.print(x+» «);
System.out.println();
}
public static void main (String args []){
vaTest («Кря-кря «, 2, 70, 0);
vaTest (true,false,true);
vaTest ();
}
}
Ответ узнал. Коммент можно удалять. Извините за беспокойство 🙂
На всякий случай отвечу, если не возражаете 🙂 Ну, чтоб кто-то другой воспользовался 🙂
методы не могут отличаться только типом параметров 🙂
Дополню ваш ответ. 🙂
Компилятор ругается из-за неопределенности. Т.к. вызов метода vaTest () может быть преобразован в обращение к vaTest (int …v) или к vaTest (boolean …v)
Ответьте пожалуйста на вопрос. 🙂
Есть класс в котором содержится конструктор массива и метод выводящий элементы массива с помощью рекурсии.
public class RecTest {
int values [];
RecTest (int i) {
values = new int [i];
}
void printArray (int i){
if (i==0) return;
else printArray(i-1);
System.out.println(«[«+ (i-1)+»] «+ values[i-1]);
}
}
Следующий класс создает массив из 10 элементов. Динамически инициализирует его значениями от 10 до 19 и выводит содержимое массива
public class Recursion2 {
public static void main (String args []){
RecTest ob = new RecTest(10);
int c=10;
for (int x=0; x<ob.values.length; x++) {
ob.values[x]=c;
c++;
}
ob.printArray(10);
}
}
Программа работает , но если переписать цикл следующим образом
public class Reursion3 {
public static void main (String args []){
RecTest ob = new RecTest(10);
int c=10;
for (int x: ob.values) {
ob.values[x]=c;
c++;
}
ob.printArray(10);
}
}
То выводится на экран следующее
[0] 19
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 0
[9] 0
Почему в 1-ом элементе оказывается 19, а в остальных остаётся "0"?