Составить программу, которая считывает аргументы из командной строки. В командной строке могут быть числа или идентификаторы. Числа складываются и сумма выводится в конце работы программы. Для каждого идентификатора опеределяется наличие в нём цифр. public class ProgContinue{ public static void main(String args[]){ int i,j; double s=0; char c; m1:for (i=0;i='A'&&c<='z'||c>='a'&&c<='z')){ s+=Double.parseDouble(args[i]); continue; } for (j=0;j='0'&&c<='9'){ System.out.println("Идентификатор "+args[i]+" содержит цифры"); continue m1; } } System.out.println("Идентификатор "+args[i]+" не содержит цифр"); } System.out.println("Сумма чисел="+s); } } Классы и объекты +----------------------+ +-[Модификатор]v(class)-[имя класса]-({)+[описание данных класса]--->+-(})-> +[описание данных объекта]-->+ +[описание методов класса]-->+ +[описание методов объекта]->+ public - модификатор, задающий "публичный" или "общественный" уровень видимости. Если он отсутствует, то действует пакетный уровень доступа, то есть класс доступен элементам того же пакета. abstract - модификатор, указывающий, что класс является абстрактным, то есть у него не может быть экземпляров (объектов). final - модификатор, указывающий, что класс является окончательным, то есть что у него не может быть потомков. Чаще используются методы объектов. Они называются так потому, что пользуются полями данных объектов и их можно вызывать только из объектов. Методы классов не пользуются полями данных объектов и могут работать при отстутствии объекта, поэтому их можно вызывать как из классов, так и из объектов. Не следует путать классы, объекты и объектные переменные: класс - это тип (описание того, как устроена память для объекта; в этой памяти будут располагаться поля данных объекта), объект - это содержимое данной ячейки памяти, в переменной объектного типа содержится адрес объекта, то есть адрес ячейки памяти, о которой было сказано. Каждый объект содержит свой набор данных (носит свои данные с собой). Методы не хранятся в объектах, они хранятся в классах. В Java'е имеется возможность создавать переменные типа "класс" и с их помощью обращаться к классам, как будто это объекты особого рода. В отличие от обычных объектов, такие "объекты" могут существовать только в единственном экземпляре и правила работы с ними принципиально отличаются от работы с обычными объектами. Для их определения существует специальный термин - метаобъекты. Конструкторы Объекты в Java'е создаются с помощью зарезервированного слова new, после которого следует конструктор - специальная подпрограмма, занимающаяся созданием объекта и инициализацией полей создаваемого объекта. Для конструктора не указывается тип возвращаемого значения и он не является ни методом объекта (вызывается через имя класса, когда объекта ещё нет), ни методом класса (в конструкторе доступен объект и его поля через ссылку this). На самом деле конструктор в сочетании с оператором new возвращает ссылку на создаваемый объект и может считаться особым видом методов, соединяющим в себе черты методов класса и методов объекта. Если при создании объекта не нужна никакая дополнительная инициализация, можно использовать конструктор, который по умолчанию присутствует для каждого класса. В таком конструкторе записываются пустые круглые скобки, задавать его не надо, он присутствует в классе автоматически. Такой конструктор выполняет инициализацию всех объектных переменных класса, для этого всем числам присваивается 0, строки оказываются пустыми, переменные boolean приобретают значение false, а все ссылки - NULL. Класс может иметь несколько конструкторов и они должны отличаться друг от друга количеством и типом используемых параметров. Если в классе описан конструктор, то создание объектов проивзодится только с помощью описанных конструкторов. Пример: создадим класс "товар", имеющий поля данных "название товара", "цена" и "количество". Запишем два конструктора: первый инициализирует все данные, следующий конструктор предусматривает наличие товара в одном экземпляре. class Goods{ String name;//название товара double priceW;//стоимость оптовая int quantity;//количество единиц Goods(String n,double p,int q){ name=n; priceW=p; quantity=q; } void print(){ System.out.println("товар "+name+" по цене "+priceW+" в количестве "+quantity); } void setPriceW(double p){ priceW=p; } void setQuant(int q){ quantity=q; } double getPriceW(){ return priceW; } int getQuant(){ return quantity; } Goods(String n,double p){ name=n; priceW=p; quantity=1; } } Описатели ограничения доступа Элементы языка Java, такие как поле данных, класс и метод имеют ограничения доступа, то есть нужно указать, когда они будут доступны, когда они будут доступны, а когда недоступны. Такие ограничений доступа может быть несколько. public означает, что данный элемент доступен без каких-либо ограничений. private - доступ разрешён только из данного класса. protected - доступ разрешён из данного класса и всех классов-потомков (наследование), а также из всех классов данного пакета. Без модификатора доступа доступ разрешён из всех классов данного пакета. Ключевое слово this Иногда бывает необходимо в методе конструктора вызывать сам объект, например, при совпадении формальных параметров с данным объекта. Для этого в языке Java существует ключевое слово this. Goods(String n,double p,int q){ this(n,p); quantity=q; } Конструктор копирования Goods(Goods g){ name=g.name; priceW=g.priceW; quantity=g.quantity; } Передача параметров по значению и по ссылке При передаче по ссылке копирование фактического параметра не происходит, поэтому имеется возможность не только использовать значение фактического параметра, но и изменять это значение, поскольку адрес параметра остаётся в распоряжении метода. В языке Java все параметры примитивных типов вызываются по значению, а параметры-объекты вызываются по ссылке. Пример: добавим в класс метод changeObject, который в качестве параметра использует объект класс Goods. В методе сравниваются имена нашего объекта и объекта-параметра. При совпадении имён в объекте параметра изменяется цена и количество товара. void changeObj(Goods g){ if (g.name.equals(name)){ g.priceW=(g.priceW+priceW)/2; g.quantity+=quantity; } } Объекты в качестве возвращаемых значений Метод объекта может возвращать объект. Пример: пусть необходимо в классе Goods создать метод addPrice, который на базе объекта this создаст новый объект с ценой, увеличенной на k%. Goods addPrice(int k){ Goods g=new Goods(this); g.priceW+=priceW*k/100; return g; } public class ProgClass1{ public static void main(String args[]){ Goods g1=new Goods("Перс. комп.",4000,10); g1.print(); Goods g2=new Goods("Телевизор",8000); g2.print(); Goods g3=new Goods("Телевизор",5000,3); g3.print(); g3.changeObj(g1); g3.print(); g3.changeObj(g2); g3.print(); ......... } } Методы и данные класса Бывают случаи, когда некоторое данное должно обслуживать все объекты класса, являясь для них глобальной переменной. Такие данные существуют даже тогда, когда не создано ни одного объекта класса. Для них используется специальный спецификатор static. Для работы с данными класса используются методы класса. Они также объявляются со спецификатором static. В отличие от обычных методов, они не связаны с объектами класса. На использование методов класса накладывается ряд ограничений: 1) методы класса используют только данные класса; 2) методы класса могут обращаться напрямую только к другим методам класса; 3) методы класса не могут ссылаться на текущий объект this и объект базового класса. В классе, содержащем данные класса, можно использовать специальный блок static, который будет выполнять вычисление по инициализации данных класса. Статический блок выполняется автоматически после запуска программы. static{ ...............