Ответ: Можно через интерфейсы, но мы пока не умеем это делать.
Итак, с интерфейсами поигрались, едем дальше.
Поговорим о «final». «final» - этоконстанта времени исполнения. Я эту величину могу и должен инициализировать один раз в конструкторе.
package app19. pkg1;
public class Point {
}
package app19. pkg1;
public class Point {
//данные
int x, y;
//конструкторы
//методы
public Point(){} //2. однако если создал явно то он будет
public Point(int _x, int _y){ //1. если создал конструктор, то дефолтного конструктора не будет
x = _x;
y = _y;
}
public void move(int dx, int dy){
x+=dx;
y+=dy;
}
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3);
p1. move(3, -2);
System. out. println(p1);
}
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3);
p1. move(3, -2);
System. out. println(p1. x+" " +p1. y);
}
}
run:
3 -2
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)
Вопрос: У нас 2 объекта в памяти
public class Point {
//данные
int x, y;
//конструкторы
//методы
public Point(){} //2. однако если создал явно то он будет
public Point(int x, int y){ //1. если создал конструктор, то дефолтного конструктора не будет
this. x = x;
this. y = y;
}
public void move(int dx, int dy){
this. x+=dx;
this. y+=dy;
}
}
Но так классы никто не пишет
Через Ctrl+Пробел
Применений this существует 3 способа.
public Point move(int dx, int dy){
this. x+=dx;
this. y+=dy;
return this;
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3);
// p1. move(3, -2); // на самом деле он получает не 2, а три параметра
p1. move(3, -2). move(1, 1). move(0, 7);
System. out. println(p1. x + " " + p1. y);
}
}
public Point(){
// x = 1;
// y = 1;
this(1, 1);
}
Инкапсуляция
package app19. pkg1;
public class Point {
//данные
private int x, y; //
//конструкторы
//методы
public Point(){
this(1, 1);
} //2. однако если создал явно то он будет
public Point(int x, int y){ //1. если создал конструктор, то дефолтного конструктора не будет
this. x = x;
this. y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Point move(int dx, int dy){
this. x+=dx;
this. y+=dy;
return this;
}
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3);
// p1. move(3, -2); // на самом деле он получает не 2, а три параметра
p1. move(3, -2). move(1, 1). move(0, 7);
System. out. println(p1. getX() + " " + p1. getY());
}
}
Объявлять класс приватным нельзя. Получается я не могу с этим классом работать.
Константы
Не хочу чтобы менялся цвет
package app19. pkg1;
public class Point {
//данные
private int x, y; //
final int color; // это константа времени исполнения. я эту величину могу инициализировать в конструкторе 1 раз.
//конструкторы
//методы
public Point(){
this(1, 1, 0);
} //2. однако если создал явно то он будет
public Point(int x, int y){
this(x, y, 0);
}
public Point(int x, int y, int c){ //1. если создал конструктор, то дефолтного конструктора не будет
this. x = x;
this. y = y;
color = c;
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3, 43781);
// p1. move(3, -2); // на самом деле он получает не 2, а три параметра
p1. move(3, -2). move(1, 1). move(0, 7);
System. out. println(p1. getX() + " " + p1. getY());
}
}
Мы пока делали все без static
· Данные
· Инициализация
· Методы с которыми эти методы работают
package app19. pkg1;
public class Point {
//данные
private int x, y; //
final int color; // это константа времени исполнения. я эту величину могу инициализировать в конструкторе 1 раз.
static int count; // статические данные автоматически инициализируются нулем
//конструкторы
//методы
public Point(){
this(1, 1, 0);
} //2. однако если создал явно то он будет
public Point(int x, int y){
this(x, y, 0);
}
public Point(int x, int y, int c){ //1. если создал конструктор, то дефолтного конструктора не будет
this. x = x;
this. y = y;
color = c;
count++;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Point move(int dx, int dy){
this. x+=dx;
this. y+=dy;
return this;
}
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3, 43781);
// p1. move(3, -2); // на самом деле он получает не 2, а три параметра
p1. move(3, -2). move(1, 1). move(0, 7);
System. out. println(p1. getX() + " " + p1. getY());
System. out. println(Point. count);
System. out. println(p2. count);
}
}
Поговорим про статический блок
package app19. pkg1;
public class Point {
//данные
private int x, y; //
private final int color; // это константа времени исполнения. я эту величину могу инициализировать в конструкторе 1 раз.
private static int count; // статические данные автоматически инициализируются нулем
//статический блок, который вызывает виртуальная машина
static {
count = 0;
}
//конструкторы
//методы
public Point(){
this(1, 1, 0);
} //2. однако если создал явно то он будет
public Point(int x, int y){
this(x, y, 0);
}
public Point(int x, int y, int c){ //1. если создал конструктор, то дефолтного конструктора не будет
this. x = x;
this. y = y;
color = c;
count++;
}
static public int getCount(){return count; }
public int getX() {
return x;
}
public int getY() {
return y;
}
public Point move(int dx, int dy){
this. x+=dx;
this. y+=dy;
return this;
}
}
package app19. pkg1;
public class App191 {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2, 3, 43781);
// p1. move(3, -2); // на самом деле он получает не 2, а три параметра
p1. move(3, -2). move(1, 1). move(0, 7);
System. out. println(p1. getX() + " " + p1. getY());
System. out. println(Point. getCount());
}
}
Статические методы
…………
Java’s Packages
Основная идея – я пишу класс и даю имя класссу. Могу ли я назвать свой класс String? Если бы
Если класс public, то имя файла и имя класса должны быть одинаковыми. Поэтому в одном файле должен быть 1 public класс
Тело цикла выполняется пока условие exp1 истинно. Условие вычисляется перед началом каждой итерации.
while(exp1) exp2;
while(exp1) {…}
цикл с постусловием
do-while
do {…} while(exp1);
…
Цикл по элементам
for(…, …, …);
есть четвертый тип цикла
цикл для коллекций
for( String [S1] s: argv [S2] )
System. out. println(s);
Здесь нужно знать какой тип лежит в коллекции. Работает с разными типами коллекций Он медленнее, чем классический for. Он извлекает последовательность всех элементов. Он разворачивается в другой синтаксис.
НАСЛЕДОВАНИЕ
…….
В Java все друг от друга наследуют. Самый главный супер-класс Object
Я наследую все.
Конструкторы не наследуются. Что это значит? Я их не могу вызвать.
Это называется линейным наследованием
Множественное наследование отсутствует.
extends Shape – объявление супер-класса.
Разбор кода страница 22, но сначала лаба на странице 19
Лабораторная работа №2
Это класс, который разбирает командную строку получаемую при нашей команде
Эта программа переписывается в лабе 3
Повозимся пока с наследованием
Страница 22
Возьмем три класса
· Shape – x, y, move
· Rect – a, b, area
· Circle - R
Что есть общее у них? Центр фигуры
Paint
package app19. pkg2;
public class Shape {
private int x, y; //если бы был protected любой наследник получил бы доступ. Это не есть хорошо. Это нарушение инкапсуляции.
public Shape(int x, int y) { //дефолтный конструктор мы не будем создавать
this. x = x;
this. y = y;
}
//так же нам нужен метод move
public void move(int dx, int dy)
{
x+=dx;
y+=dy;
}
public void info(){
System. out. print(x+" " +y);
}
}
package app19. pkg2;
public class Rect extends Shape{
private int a, b;
//когда мы захотим указать плоскую фигуру нам понадобится 2 конструктора
public Rect() {
super(1, 1);
}
public Rect(int a, int b) {
this(a, b, 0, 0); //конструктор переключается на конструктор этого же класса
this. a = a;
this. b = b;
}
public Rect(int a, int b, int x, int y) {
super(x, y);
this. a = a;
this. b = b;
}
public double area(){
return (double)a*b;
}
/**public Rect() { //это генерируется автоматически
super();
}
*/
public void paint(){
this. info();
//super. info();
System. out. println(" a=" +a+" b=" +b);
}
}
package app19. pkg2;
public class App192 {
public static void main(String[] args) {
Rect r1 = new Rect(2, 3);
Rect r2 = new Rect(1, 1, 1, 1);
r2. move(4, -7);
System. out. println(r1. area());
r1. paint();
r2. paint();
}
}
package app19. pkg2;
public class Shape {
private int x, y; //если бы был protected любой наследник получил бы доступ. Это не есть хорошо. Это нарушение инкапсуляции.
public Shape(int x, int y) { //дефолтный конструктор мы не будем создавать
this. x = x;
this. y = y;
}
//так же нам нужен метод move
public void move(int dx, int dy)
{
x+=dx;
y+=dy;
}
public void info(){
System. out. print(x+" " +y);
}
}
package app19. pkg2;
public class Rect extends Shape{
private int a, b;
//когда мы захотим указать плоскую фигуру нам понадобится 2 конструктора
public Rect() {
super(1, 1);
}
public Rect(int a, int b) {
this(a, b, 0, 0); //конструктор переключается на конструктор этого же класса
this. a = a;
this. b = b;
}
public Rect(int a, int b, int x, int y) {
super(x, y);
this. a = a;
this. b = b;
}
public double area(){
return (double)a*b;
}
/**public Rect() { //это генерируется автоматически
super();
}
*/
public void paint(){
this. info();
//super. info();
System. out. println(" a=" +a+" b=" +b);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package app19. pkg2;
/**
*
* @author Student
*/
public class Circle extends Shape{
private double r;
public Circle(int r) {
this(r, 0, 0);
}
public Circle(double r, int x, int y) {
super(x, y);
this. r = r;
}
public double area(){
return (3. 1415926*(r*r));
}
public void paint(){
this. info();
System. out. println(" r=" +r);
}
}
package app19. pkg2;
public class Shape {
private int x, y; //если бы был protected любой наследник получил бы доступ. Это не есть хорошо. Это нарушение инкапсуляции.
public Shape(int x, int y) { //дефолтный конструктор мы не будем создавать
this. x = x;
this. y = y;
}
//так же нам нужен метод move
public void move(int dx, int dy)
{
x+=dx;
y+=dy;
}
public void info(){
System. out. print(x+" " +y);
}
}
package app19. pkg2;
public class Rect extends Shape{
private int a, b;
//когда мы захотим указать плоскую фигуру нам понадобится 2 конструктора
public Rect() {
super(1, 1);
}
public Rect(int a, int b) {
this(a, b, 0, 0); //конструктор переключается на конструктор этого же класса
this. a = a;
this. b = b;
}
public Rect(int a, int b, int x, int y) {
super(x, y);
this. a = a;
this. b = b;
}
public double area(){
return (double)a*b;
}
/**public Rect() { //это генерируется автоматически
super();
}
*/
public void paint(){
this. info();
//super. info();
System. out. println(" a=" +a+" b=" +b);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package app19. pkg2;
/**
*
* @author Student
*/
public class Circle extends Shape{
private double r;
public Circle(int r) {
this(r, 0, 0);
}
public Circle(double r, int x, int y) {
super(x, y);
this. r = r;
}
public double area(){
return (3. 1415926*(r*r));
}
public void paint(){
this. info();
System. out. println(" r=" +r);
}
}
package app19. pkg2;
public class App192 {
public static void main(String[] args) {
Rect r1 = new Rect(2, 3);
Rect r2 = new Rect(1, 1, 1, 1);
r2. move(4, -7);
System. out. println(r1. area());
// r1. paint();
//r2. paint();
Circle c1 = new Circle(25, 1, 3);
Circle c2 = new Circle(50, 1, 1);
c1. paint();
c2. paint();
//Shape[] data = new Shape[]{r1, r2, c1, c2, new Circle(1)};
Shape[] data = {r1, r2, c1, c2, new Circle(1)};
paintAll(data);
}
static void paintAll(Shape[]d){
//бери каждый Shape
//из коллекции d
for(Shape sh: d)
{
if(sh instanceof Rect)
{
Rect r = (Rect)sh;
r. paint();
}
else if (sh instanceof Circle){
Circle c = (Circle)sh;
c. paint();
}
}
}
}
package app19. pkg2;
public class Shape {
private int x, y; //если бы был protected любой наследник получил бы доступ. Это не есть хорошо. Это нарушение инкапсуляции.
public Shape(int x, int y) { //дефолтный конструктор мы не будем создавать
this. x = x;
this. y = y;
}
//так же нам нужен метод move
public void move(int dx, int dy)
{
x+=dx;
y+=dy;
}
public void paint(){
System. out. print(x+" " +y);
}
}
package app19. pkg2;
public class Rect extends Shape{
private int a, b;
//когда мы захотим указать плоскую фигуру нам понадобится 2 конструктора
public Rect() {
super(1, 1);
}
public Rect(int a, int b) {
this(a, b, 0, 0); //конструктор переключается на конструктор этого же класса
this. a = a;
this. b = b;
}
public Rect(int a, int b, int x, int y) {
super(x, y);
this. a = a;
this. b = b;
}
public double area(){
return (double)a*b;
}
/**public Rect() { //это генерируется автоматически
super();
}
*/
public void paint(){
super. paint();
//super. info();
System. out. println(" a=" +a+" b=" +b);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package app19. pkg2;
/**
*
* @author Student
*/
public class Circle extends Shape{
private double r;
public Circle(int r) {
this(r, 0, 0);
}
public Circle(double r, int x, int y) {
super(x, y);
this. r = r;
}
public double area(){
return (3. 1415926*(r*r));
}
public void paint(){
super. paint();
System. out. println(" r=" +r);
}
}
package app19. pkg2;
public class App192 {
public static void main(String[] args) {
Rect r1 = new Rect(2, 3);
Rect r2 = new Rect(1, 1, 1, 1);
r2. move(4, -7);
System. out. println(r1. area());
// r1. paint();
//r2. paint();
Circle c1 = new Circle(25, 1, 3);
Circle c2 = new Circle(50, 1, 1);
c1. paint();
c2. paint();
//Shape[] data = new Shape[]{r1, r2, c1, c2, new Circle(1)};
Shape[] data = {r1, r2, c1, c2, new Circle(1)};
paintAll(data);
}
static void paintAll(Shape[]d){
//бери каждый Shape
//из коллекции d
for(Shape sh: d)
{
sh. paint();
}
}
}
Что дает полиморфизм? – Гибкость. Правда скорость чуть медленнее, но мы не за этим гонимся.
Лаба №2
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package laba. pkg2;
/**
*
* @author Student
*/
public class Laba2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
for(String s: args){
System. out. println(s);
}
}
}
- В свойствах проекта, в категории «Выполнить», в графе «Аргументы», задайте командную строку: -wOutfileName –rInfileName
ЛАБА 2
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package laba. pkg2;
/**
*
* @author Student
*/
public class ComLineParser {
private String[] keys;
private String[] delimeters;
// варианты завершения разбора командной строки
public enum SwitchStatus { NoError, Error, ShowUsage };
public ComLineParser(String[] keys) {
this(keys, new String[]{" /", " -" });
}
public ComLineParser(String[] keys, String[] delimeters) {
this. keys = keys;
this. delimeters = delimeters;
}
public void OnUsage(String errorKey)
{
if(errorKey! = null)
{
//System. out. println(" формат ком. строки: имяПрограммы [-r< input-fileName> ] [-w< output-fileName> ]" );
System. out. println(" Command-line switch error: " + errorKey);
}
System. out. println(" формат ком. строки: имяПрограммы [-r< input-fileName> ] [-w< output-fileName> ]" );
System. out. println(" -? показать Help файл" );
System. out. println(" -r задать имя входного файла" );
System. out. println(" -w выполнить вывод в указанный файл" );
}
public SwitchStatus OnSwitch(String key, String keyValue)
{
System. out. println(key+" " +keyValue);
return SwitchStatus. NoError;
}
public boolean Parse(String[] args){
SwitchStatus ss = SwitchStatus. NoError;
int argNum;
for(argNum = 0; (ss == SwitchStatus. NoError) & & (argNum < args. length); argNum++)
{
// проверка наличия правильного разделителя
boolean isDelimeter = false;
for (int n = 0; ! isDelimeter & & (n < delimeters. length); n++) {
isDelimeter = args[argNum]. regionMatches(0, delimeters[n], 0, 1);
}
if (isDelimeter) {
// проверка наличия правильного ключа
Boolean isKey = false;
for(int i = 0; ! isKey & & (i < keys. length); i++) {
isKey = args[argNum]. toUpperCase(). regionMatches(1, keys[i]. toUpperCase(), 0, keys[i]. length());
if(isKey) break;
}
if(! isKey)
{
System. out. println(" Error" );
break;
}
}
else {
ss= SwitchStatus. Error;
break;
}
}
// завершение разбора командной строки
if (ss == SwitchStatus. ShowUsage) OnUsage(null);
if (ss == SwitchStatus. Error) OnUsage((argNum == args. length)? null: args[argNum]);
return ss == SwitchStatus. NoError;
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package laba. pkg2;
/**
*
* @author Student
*/
public class Laba2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
ComLineParser myarray = new ComLineParser[] { "? ", " r", " w" }; //new String{"? ", " r", " w" };
for(String s: args){
myarray. Parse();
}
// for(String s: args){
// System. out. println(s);
// }
}
}