Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вопрос: Можно спрятать имя класса?




Ответ: Можно через интерфейсы, но мы пока не умеем это делать.

Итак, с интерфейсами поигрались, едем дальше.

 

Поговорим о «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); }    }
run: app19. pkg1. Point@1db9742 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)
  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 класс

C: \Users\Student\Documents\NetBeansProjects\app19-1\build\classes\app19\pkg1

Где находится байт-код???

C: \Users\Student\Documents\NetBeansProjects\app19-1\build\classes

 

Байт-код находится вот тут

Меняю формат jar на zip

 

Где находится main

После обеда - наследование

 

 

Цикл с предусловием while()

Тело цикла выполняется пока условие 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); } }
run: 6. 0 0 0 a=2 b=3 5 -6 a=1 b=1 1 3 r=25. 0 1 1 r=50. 0 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

 

Это плохое решение

 

 

Вот хорошее

  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();        }    } } }
run: 6. 0 1 3 r=25. 0 1 1 r=50. 0 0 0 a=2 b=3 5 -6 a=1 b=1 1 3 r=25. 0 1 1 r=50. 0 0 0 r=1. 0 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

ЭТО ТОЖЕ ПЛОХОЙ КОД

 

ПОЛИМОРФИЗМ

Этот код будет работать всегда

  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); //   } }     }
 

 

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...