Пример: необходимо произвести расчёт заработной платы работника с почасовой оплатой труда. Для определения суммы к выдаче необходимо высчитать сумму заработной платы и подоходный налог. Стоимость проработанного часа устанавливается работодателем и меняется редко, пороговые значения зарплаты и коэффициенты для вычисления подоходного налога устанавливаются законом и также меняются редко. class Worker{ private String surname; public int time; private static int z1=200; private static int z2=1000; private static int kp1=10; private static int kp2=20; private static double tariff=8.2; private static double k1,k2; static{ k1=kp1/100.0; k2=kp2/100.0; } public Worker(String sn){ surname=sn; time=0; } public void addTime(int t){ time+=t; } public void getSalary(){ double s=time*tariff; double pn=0; if (s>=z1 && s>=z2) pn=(s-z1)*k1; if (s>=z2) pn=(z2-z1)*k1+(s-z2)*k2; System.out.println(surname+" начислено:"+s+" к выдаче: "+s-pn); time=0; } public static void setK(int z11, int z21, double k11, double k21){ z1=z11; z2=z21; k1=k11; k2=k21; } public static void setTariff(double tf){ tariff=tf; } public int getTime(){ return time; } public static double getK1(){ return k1; } ................. } Статический блок представляет собой последовательность операторов, выполняющих некоторые действия над статическими данными, выполняется статический блок сразу после запуска программы. public class ProgStatic{ public static void main(String args[]){ Worker w1=new Worker("Иванов"); w1.addTime(150); Worker.setTariff(9.1); w1.getSalary(); ....................... } } Описание констант Если перед описанием инициализированной переменной поместить ключевое слово final, то исключается возможность её изменения при работе программы. final double PI=3.14159 final int DAYS_OF_DJANUARY=31; Уничтожение объекта, метод finalize В языке Java программист не работает с указателями, не выделяет и не освобождает память в явном виде. Поэтому в языке Java, в отличие от языка C++, не предусмотрены деструкторы для удаления объектов, в которых программа больше не нуждается. Задачу освобождения памяти в языке Java выполняет сборщик мусора. Для управления сборщиком мусора используются специальные алгоритмы, которые анализируют программу и определяют моменты для удаления ненужных объектов. Кроме памяти, объекты могут использовать и другие системные ресурсы, например, работа с файлами, со шрифтами, с базами данных и т. д. Для освобождения этих ресурсов в класс можно ввести специальный метод finalize. Его формат следующий: protected void finalize(){ ..................... //операторы, освобождающие ресурсы } Метод finalize может использоваться только членами класса. Метод finalize вызывается непосредственно перед уборкой мусора. Если программист желает управлять процессом освобождения ресурсов, то ему следует создать свой метод. Наследование Суперкласс и подкласс Базовый или родительский класс при программировании на Java'е принято называть суперклассом, а производные от него или дочерние классы - подклассами. ->[модификатор]->(class)->[имя класса]->(extends)->[имя родительского класса]->({)->[тело класса]->(})-> Множественное наследование в языке Java запрещено. В некоторой степени его роль могут играть интерфейсы. Наследование и правила видимости Поля и методы, помеченные как private, наследуются, но в классах-наследниках недоступны. Это сделано в целях обеспечения безопасности. Password{ private int parol; } Passw extends Password{ ........... public int getParol(){return parol;} Модификатор protected предназначен для использования соответствующих полей и методов разработчиками классов-наследников. Он даёт несколько большую открытость, чем пакетный вид доступа (по умолчанию, без модификатора), поскольку в дополнение к видимости из текущего пакета позволяет обеспечить доступ к членам класса в классах наследниках, находящихся в других пакетах. Модификатором protected полезно помечать различные служебные методы, не нужные пользователям класса, но необходимые для функциональности этого класса. По правилам хорошего тона поля данных принято помечать модификатором private, а доступ к этим полям обеспечивать с помощью методов с тем же именем, но префиксом get и set. Указанные "правила хорошего тона" нашли отражение в среде NetBeans в пакете NetBeans Enterprise PEC: при разработке UML-диаграмм добавление в класс поля данных автоматически приводит к установке ему модификатора private и созданию двух public-методов с теме же именем, но префиксами get и set. Зарезервированное слово super Слово super обозначает родительский класс и может использоваться в качестве имени конструктора родительского класса либо в качестве префикса при работе с перекрытыми данными и методами. import java.util.Calendar; import java.util.TimeZone; static Goods{ private String name;//назв. товара private double priceW;//оптовая цена private int quantity;//количество единиц public Goods(String n,double pw, int q){ .............. } public void print(){ .................. } public String getName(){ ..................... } public double getPriceW(){ ................ } public int getQuant(){...............} public void setPriceW(double pw){.......................} public void setQuant(int q){.........................} } Необходимо разработать класс-наследник, предназначенный для продажи товара и предусматривающий следующие дополнительные данные объекта: дата изготовления товара, розничная цена и срок гарантии. class GoodsForSale extends Goods{ private String date;//дата изготовления private double priceR;//розничная цена private int guarantee;//гарантия /* дата изготовления: гггг.мм.дд Calendar cal=Calendar.getInstance(); int year=cal.get(Calendar.YEAR); int month=cal.get(Calendar.MONTH); int day=cal.get(Calendar.DAY_OF_MONTH); String date=year+"."+(month+1)+"."+day); */ GoodsForSale(String n, double pw, int q, String d, double pr, int g){ super(n,pw,q); date=d; priceR=pr; guarantee=g; } //оператор вызова суперкласса должен быть первым среди других операторов GoodsForSale(GoodsForSale g){ super(g.name,g.priceW,g.quantity); date=g.date; priceR=g.priceR; guarantee=g.guarantee; } public void print(){ super.print(); System.out.println("изготовлен "+date+" продаётся по цене "+priceR+" срок гарантии "+guarantee); } public double getProfit(){ return (priceR-getPriceW())*getQuant(); } public void setPriceR(double pr){ priceR=pr; } public void setGuar(int g){ guarantee=g; } public String getDate(){ return date; } ......................... } public class PrInh{ public static void main(String args[]){ GoodsForSale g1("Перс. комп.",3000,5,"2012.11.05",4000,24); System.out.println("Прибыль от продажи "+getName()+" составит: "+g1.getProfit()); g1.setPriceR(4500); ................. } } Совместимость объектов при наследовании Ссылке на объект суперкласса всегда можно присвоить объект любого подкласса в иерархии наследования. Обратное действие недопустимо. Goods g2; g2=g1; g2.print(); Порядок вызова конструкторов в иерархии классов В иерархии классов конструкторы вызываются в порядке наследования от суперкласса к подклассу. class x{ x(){ System.out.println("конструктор класса x"); } } class y extends x{ y(){ System.out.println("конструктор класса y"); } } class z extends y{ z(){ System.out.println("конструктор класса z"); } } public class ProgConstructor{ public static void main(String args[]){ z z1=new z1() }