Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Для чего нужны квадратные скобки?


Автор: korob2001 8.7.2004, 01:45
Привет!
Вот дошёл до первой программы в книге и сразу появился вопрос. Есть класс:
Код

// HelloDate.java
import java.util.*;

public class HelloDate {
        public static void main( String[] args ) {
                 System.out.println("Hello! The time now: ");
                 System.out.println( new Date() );
       }
}

При создании метода класса public static main( String[] args ) { ..... }, я не совсем понял то, что выделино красным цветом. Точнее сказать недопонял.
Насколько я понимаю:
String[] - указывает что передаваемые аргументы в метод должны иметь тип String.
args - указывает что методу по идее должны передаваться аргументы ( параметры ).
Если я верно понимаю, отсюда 2 вопроса:
1. Что означают квадратные скобки после String?
2. Если мы указали что методу должны передаваться параметры ( args ), но ведь на самом деле мы ничего не передаём. Как это обьяснить?
3. В книге написано что, методы в Java это тоже что и функции в других языках программирования. Например в Perl я создаю туже функцию:
Код

#!/usr/bin/perl -w
use strict;
sub HelloDate {
     print "Hello! The time now:\n";
     print scalar localtime;
}
HelloDate; # Внимание! Вызов функции.

Так вот к чему я: если в приведённой Perl программе удалить ту строку, на которой я просил обострить внимание, то ничего не произойдёт. Другими словами, я не пойму где программе Java вызывается метод. Или программа она выполняется вся, без какого либо управления?
Извините за такие глупые вопросы. Но я просто пытаюсь решать проблемы по мере их возникновения.

Заранее благодарен,
Денис.

Автор: Domestic Cat 8.7.2004, 02:15
Цитата
1. Что означают квадратные скобки после String?


Massiv.:
Код

String[] array = new String[3];
String array[] = new String[] {"Java", "the", "best"};

Цитата
2. Если мы указали что методу должны передаваться параметры ( args ), но ведь на самом деле мы ничего не передаём. Как это обьяснить?


JVM schityvaet komandnye argumenty v jetot samyj massiv, skazhem pri zapuske

java Test a bc cde

args budet takim:

args[0] = "a"
args[1] = "bc"
args[2] = "cde"

dlja

java Test

args budet pustym
Цитата
В книге написано что, методы в Java это тоже что и функции в других языках программирования.


Znachit, plohaja kniga. Najdite knigu poluche, t.k. metod - jeto ne funkcija.
Posmotrite na sajte Sun, tam horoshij tutorial:

http://java.sun.com/docs/books/tutorial/index.html

PS. sorry za translit, vremeni net.
PPS. Zavtra mogu otvetit' popodrobnee, no "zavtra" oznachaet okolo 16.00 po Moskve

Автор: korob2001 8.7.2004, 03:20
Цитата

Znachit, plohaja kniga. Najdite knigu poluche, t.k. metod - jeto ne funkcija.

Книга "Философия Java" 3-е издание ( Брюс Эккель ). Вроде нормальная, у меня пока только 2 книги по Java.
Цитата

Zavtra mogu otvetit' popodrobnee, no "zavtra" oznachaet okolo 16.00 po Moskve

ОК. В принципе, первые два вопроса отпали, по ним всё понял. Если вас не затруднит напишите пояснее по поводу третьего вопроса.
Спасибо.

Автор: ElectricalStorm 8.7.2004, 09:40
Вам нужно сначала про ООП почитать ... так как Ява чистый ООП язык (почти smile.gif ) когда поймете все принцыпы ООП тогда и Ява легко пойдет ....

Что мне кажется важно понять в начале:

1) Забудте про процедурно ориентированые языки думайте даже о самой ерунде как об объекте ...
со своими свойствами (полями) и поведением (методами)

2) Думате о классе как о фабрике объектов

3) Научитесь выделять сущность



Автор: DarkDS 8.7.2004, 13:02
Цитата(korob2001 @ 8.7.2004, 01:45)
Код

#!/usr/bin/perl -w
use strict;
sub HelloDate {
     print "Hello! The time now:\n";
     print scalar localtime;
}
HelloDate; # Внимание! Вызов функции.

Так вот к чему я: если в приведённой Perl программе удалить ту строку, на которой я просил обострить внимание, то ничего не произойдёт. Другими словами, я не пойму где программе Java вызывается метод. Или программа она выполняется вся, без какого либо управления?

Не совсем так.
В Яве для того чтобы вызвать метод нужно к нему обратится точно так же как и в перле и в других языках программирования.
Но для того чтобы запустить программу нужно как то показать, откуда ей нужно работать. Так в паскале для этого есть основной блок бегин-енд, в сях есть основной метод маин и тд и тп. Так и в Яве для того чтобы указать что этот класс может запускатся как программа задается метод майн и при запуске его JVM вызывает именно этот метод. То есть при запуске программы из консоли (
Код
java HelloDate
) будет вызван метод майн того класса, который указан (в примере класс HelloDate)
А уж в этом методе могут быть созданы все остальные классы и вызваны их методы.
Что к стати и делается (вызываются методы вывода в поток (в данном случае в консоль):
Код

                System.out.println("Hello! The time now: ");
                System.out.println( new Date() );
)

Автор: Domestic Cat 8.7.2004, 15:32
Цитата
Книга "Философия Ява" 3-е издание ( Брюс Эккель ). Вроде нормальная, у меня пока только 2 книги по Ява.


Книга Эккеля очень хорошая (правда я говорю о "Thinking in Java", может перевод такоu? ); но тогда я не поuму ваших вопросов. Впервые в книге args[] встречается в главе 2 и сразу же обэсняется что [] обозначает массив. Pravda, в этоu же главе написано:

Цитата
In many languages (like C and C++), the term function is used to describe a named subroutine. The term that is more commonly used in Java is method, as in “a way to do something.” If you want, you can continue thinking in terms of functions. It’s really only a syntactic difference, but this book follows the common Java usage of the term “method.”


что требует пояснений. Метод может делать то же что и функция (например, решить систему
уравнений); однако кроме того он может изменять состояние обьекта (или других обьектов), меняя их поля. Паскалевская функция такого принципиально делать не может. Поэтому забудьте о
функциях, и думайте о методах как о неких "ручках" или "кнопках", через которые вы взаимодействуете с обектом. Функция - это нечто самодостаточное, вы можете, например, функцию "factorial (int n) {.....}" вставить в любую программу (в процедурных языках, таких как C); метод же неотделим от обекта также как и кнопка Reset неотделима от компьютера, то есть она то отделима, но тогда зачем она нужна ? (опустим static методы для простоты).

Почитайте того же Еккеля внимательнее, не торопитесь; самое главное - освоить
ООП (далее см. пост ElectricalStorm smile.gif)

Автор: ovod 8.7.2004, 20:32
Есть ли электронный вариант вышеозначенного чтива на русском? Скоро поеду в Питер, куплю в мягкой обложке, но уже не терпится.

Насчет доступа к полям объектов их дельфевой функции. Можно их менять, записывая новое значение прям в память (о способах обхода прямой записи в контекст чужого приложения многое уже написано и сказано). Хотя.. сам не делал, спорить не буду.

Только ли пробелами можно разделять командные аргументы? Как сделать, чтоб например символом подчеркивания?

Автор: Domestic Cat 8.7.2004, 22:27
Electrical Strom
Цитата
так как Ява чистый ООП язык (почти  )


Почему? 100% ООП язык.

ovod
Цитата
Насчет доступа к полям объектов их дельфевой функции. Можно их менять, записывая новое значение прям в память (о способах обхода прямой записи в контекст чужого приложения многое уже написано и сказано). Хотя.. сам не делал, спорить не буду.

Ето к чему?

Цитата
Только ли пробелами можно разделять командные аргументы? Как сделать, чтоб например символом подчеркивания?


Только пробелами, иначе аргумент будет одноu строкоu.

Автор: korob2001 10.7.2004, 01:34
Большое спасибо всем.
Извиняюсь за исчезновение, сыну вчера исполнился год, был не в состоянии подойти к компу. ;)
Вроде всё понял, правда - смутно.
ОК послушаю вашего совета постараюсь не думать о процедурных языках. Перечитаю всё сначала.
Ещё раз спасибо.

Автор: redrick 12.7.2004, 07:43
рискну прокоментировать всё-таки про String[] :
в Java, как кто-то сверху сказал почти всё - объекты, так вот String[] - это тоже объектный тип и квадратные скобки не более чем часть его имени. Для меня это тоже было открытием в своё время - после C и C++ квадратные скобки прочно ассоциируются с оператором или ещё чем-нибудь там

если я тут написал таки фигню - исправьте плз

Автор: Sun 12.7.2004, 11:09
Квадратные скобки указывают что это массив объектов типа String. Но в Java массив это чуть больше чем область памяти, хранящая указатели на объекты. Массив сам является объектом, у которого есть свои методы. Например у него есть метод length(), возвращающий колличество элементов массива.

Автор: DarkDS 12.7.2004, 13:49
Цитата(Sun @ 12.7.2004, 11:09)
Массив сам является объектом, у которого есть свои методы.

Причем его можно и привести к объекту smile.gif
Код
String[] s = new String[10];
Object o = (Object)s

Автор: korob2001 12.7.2004, 14:08
Цитата

Для меня это тоже было открытием в своё время - после C и C++ квадратные скобки прочно ассоциируются с оператором или ещё чем-нибудь там

Лично у меня квадратные скобки асоциируются с массивом. ;)

Автор: Domestic Cat 12.7.2004, 15:16
Sun:
Цитата
Квадратные скобки указывают что это массив объектов типа String. Но в Java массив это чуть больше чем область памяти, хранящая указатели на объекты. Массив сам является объектом, у которого есть свои методы. Например у него есть метод length(), возвращающий колличество элементов массива.


length не метод, а public поле; длина ряда массива находится так:

Код

String[] array[] = new String[5][6];
int n1 = array.length;
int n2 = array[0].length;

Автор: redrick 16.7.2004, 18:19
здесь часто идёт такая путаница с вектором (Vector) у которого как раз есть такой метод

Автор: Domestic Cat 16.7.2004, 19:51
Скорее с методом класса String.

Автор: redrick 16.7.2004, 23:39
эх, щас админы на флуд начнут ругаться =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)