Работа с классами Объявление class Name { // заголовок класса // блок переменных int i; // блок методов Name(int i) {…} void doSomeThing() {…} } Объявление class Name {…} public class Name {…} protected class Name {…} private class Name {…} Default Доступ к таким переменным и методам возможен из любого места пакета (package). Но они недоступны извне. package test; class Test{ int I; Test(int i){ This.i = I; } } package another; import Test.*; class Another{ public static void main(String[] args) { Test a = new Test(3); } } //The type Test.Test is not visible Public Доступны из любого места программы. package test; class Test{ int i; Test(int i){ this.i = I; } } package another; import test.*; class Another{ public static void main(String[] args) { Test a = new Test(3); } } Protected Доступ к таким переменным и методам доступен только из объектов данного класса и его потомков. class Test{ protected int i; Another(int i){ this.i = I; } } class Another extends Test { public static void main(String[] args) { Another a = new Another(3); a.i = 1; } } Private Доступ к таким данным доступен только в объектах данного класса и из классов, непосредственно в теле которых он содержится. class Test{ class Another{ private int i=0; } public static void main(String[] args) { Test t = new Test(); Another a = t.new Another(); int testInt = a.i; } } Конструктор класса Вызывается при создании объекта данного класса. class Name { int n; String name; Name(int i) { n = 1; } Name(int i, String s) { this(int i); name = s; } } Конструктор класса Выражение super может стоять только на первой строке конструктора. Часто можно увидеть конструкторы вообще без такого выражения. В этом случае компилятор первой строкой по умолчанию добавляет вызов родительского конструктора без параметров (super()). Если у родительского класса такого конструктора нет, выражение super обязательно должно быть записано явно (и именно на первой строке), поскольку необходима передача входных параметров. class MyClass extends OtherClass{ String name; MyClass(String s){ super(); name = s; } } Конструктор класса Если в родительском классе объявлено пять разных полезных конструкторов и требуется, чтобы класснаследник имел аналогичный набор, необходимо все их описать заново. Класс обязательно должен иметь конструктор, иначе невозможно порождать объекты ни от него, ни от его наследников. Поэтому если в классе не объявлен ни один конструктор, компилятор добавляет один по умолчанию. Это public-конструктор без параметров и с телом, описанным парой пустых фигурных скобок. Из этого следует, что такое возможно только для классов, у родителей которых объявлен конструктор без параметров, иначе возникнет ошибка компиляции. Инициализаторы class Test { private int x, y, z; // инициализатор объекта { x=3; if (x>0) y=4; z=Math.max(x, y); } } Инициализаторы Инициализаторы не имеют имен, исполняются при создании объектов, не могут быть вызваны явно, не передаются по наследству (хотя, конечно, инициализаторы в родительском классе продолжают исполняться при создании объекта класса-наследника). При создании экземпляра класса вызванный конструктор выполняется следующим образом: • Если первой строкой идет обращение к конструктору родительского класса (явное или добавленное компилятором по умолчанию), то этот конструктор исполняется; • В случае успешного исполнения вызываются все инициализаторы полей и объекта в том порядке, в каком они объявлены в теле класса; • Если первой строкой идет обращение к другому конструктору этого же класса, то он вызывается. Повторное выполнение инициализаторов не производится. Метод main() public static void main(String[] args) {…} При запуске программы первым делом вызывается именно этот метод. args – массив строк, содержащий параметры запуска программы. Вызов «java test.class -s -b» запустит программу с args={‘-s’, ‘-b’}. Перегруженные методы Перегруженными называются методы, имеющие одинаковое имя, но принимающие разные аргументы или возвращающие разные типы. int calculate(int a, int b) {} float calculate(int a, int b) {} double calculate(int a, int b, float c) {} boolean calculate(int a, int b) {} Сеттер и геттер Эти методы устанавливают и возвращают значения инкапсулированных переменных. public void setWidth(int width){ this.width = width; } public int getWidth(){ return width; }