Использование пакетов, директив импорта и переменной среды CLASSPATH
Практика:
Разбор параметров командной строки
ДЕНЬ 3
File Modifier
Атрибут final у членов данных означает, что их значение запрещено менять или другими словами определяет константы. Если финальный член данных не инициализирован при определении, то его значение необходимо указать в конструкторах. Такая альтернатива переменным членам данных может ускорить работу приложения.
Атрибут final у методов означает отмену их виртуальности - возможности переопределения в дочерних классах. Использование этого атрибута может ускорить работу приложения (как inline в С++).
Атрибут final можно применить ко всему классу для запрещения наследования от него. Таковыми, например, являются некоторые стандартные классы.
Запрещаем полиморфизм если (слайд 26, mod 6-9)
Абстрактные классы и методы
Мы можем сделать любой класс абстрактным
1. нельзя создавать объект абстрактного класса
2. в абстрактном классе можно размещать абстрактные методы
public class SimpleParser extends ComLineParserBase {
private String inFile;
private String outFile;
public String getInFile() { return inFile; }
public String getOutFile() { return outFile; }
public SimpleParser(){
super(new String[]{"? ", " r", " w" });
}
@Override
protected void OnUsage(String errorKey){
if (errorKey! = null)
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 выполнить вывод в указанный файл" );
}
@Override
protected SwitchStatus OnSwitch(String key, String keyValue) {
SwitchStatus status = SwitchStatus. NoError;
switch (key) {
case "? ": status = SwitchStatus. ShowUsage; break;
case " r":
if (keyValue. length() < 1) {
System. out. println(" Нет имени входного файла. " );
status = SwitchStatus. Error;
}
else inFile = keyValue;
break;
case " w":
if (keyValue. length() < 1) {
System. out. println(" Нет имени выходного файла. " );
status = SwitchStatus. Error;
}
else outFile = keyValue;
break;
default: status = SwitchStatus. Error; break;
}
return status;
}
}
/*
* 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 lab. pkg3;
/**
*
* @author Student
*/
public class Lab3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
javaapplication1. SimpleParser sp1 = new javaapplication1. SimpleParser();
sp1. Parse(args);
System. out. println(sp1. Get_inFile());
System. out. println(sp1. Get_outFile());
}
}
Слайд 31
Практика
– массив объектов
– сортировка
– стандартные интерфейсы
package app. pkg20. pkg1;
import java. util. Arrays;
public class App201 {
public static void main(String[] args) {
// TODO code application logic here
int []data = {2, 5, 1, 8, 11, 7};
Arrays. sort(data);
for(int di: data)
{
System. out. println(di);
}
}
}
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)
package app. pkg20. pkg1;
import java. util. Arrays;
class Box {
private int a, b;
public Box(int a, int b) {
this. a = a;
this. b = b;
}
@Override
public String toString() {
return " a=" +a+" b=" +b;
}
}
public class App201 {
public static void main(String[] args) {
// TODO code application logic here
//int []data = {2, 5, 1, 8, 11, 7};
Box []data = {new Box(4, 7), new Box(2, 1), new Box(3, 2), new Box(6, 4), new Box(3, 6)};
// Arrays. sort(data);
for(Box di: data)
{
System. out. println(di);
}
}
}
– наследовать и добавить методов; - не самый лучший способ
– добавить default методы;
– добавить static методы;
АННОТАЦИИ – метаданные о коде
– @Override
– @Deprecated
– @SuppressWarnings
– @Retention & @Target
– @FunctionalInterface
Зачем это нужно?
Аннотации позволяют сообщить дополнительную информацию о коде
– @Deprecated – компилятор выдаст предупреждение, что я использую устаревший код. Это рассчитано на этапе компиляции.
– @Override – метод переопределен
@Retention(value=RetentionPolicy. RUNTIME)
@Target(value=ElementType. TYPE)
public @interface Developer {
String fname();
String type() default “tester”;
String data();
String version() default “1. 0. 1. 0”;
}
@Developer(fname=“alex”, data=“3/11/2014”)
public class Test{}
Слайд 32 Java. lang
Сборщик мусора
Клонирование
boolean equals (Object obj)
==
Или! =
Class getClass ()
РЕФЛЕКСИЯ –
package app. pkg20. pkg1;
import java. lang. reflect. Method;
import java. util. Arrays;
import java. util. Comparator;
class Box implements Comparable {
private int a, b;
public Box(int a, int b) {
this. a = a;
this. b = b;
}
@Override
public String toString() {
return " a=" +a+" b=" +b;
}
@Override
final public int compareTo(Object obj) {
Box b1 = this;
Box b2 = (Box)obj;
return b1. a*b1. b - b2. a*b2. b;
}
public static Comparator bySideA(){
return new CompareBoxBySizeA();
}
public static Comparator bySideB(){
return new CompareBoxBySizeB();
}
private static class CompareBoxBySizeA implements Comparator{
@Override
public int compare(Object obj1, Object obj2) {
Box b1 = (Box)obj1;
Box b2 = (Box)obj2;
return b1. a - b2. a;
}
}
private static class CompareBoxBySizeB implements Comparator{
@Override
public int compare(Object obj1, Object obj2) {
Box b1 = (Box)obj1;
Box b2 = (Box)obj2;
return b1. b - b2. b;
}
}
}
//class CompareBoxBySizeB{
//
//}
public class App201 {
public static void main(String[] args) {
// TODO code application logic here
//int []data = {2, 5, 1, 8, 11, 7};
Box []data = {new Box(4, 7), new Box(2, 1), new Box(3, 2), new Box(6, 4), new Box(3, 6)};
//Arrays. sort(data, new Box. CompareBoxBySizeB());
Arrays. sort(data, Box. bySideA());
for(Box di: data)
{
System. out. println(di);
}
System. out. println(" \n" );
Arrays. sort(data, Box. bySideB());
for(Box di: data)
{
System. out. println(di);
}
//Пример про рефлексию
Class info = data[0]. getClass();
Method[]ms = info. getMethods();
for(Method mi: ms)
{
System. out. println(mi);
}
}
}
public static java. util. Comparator app. pkg20. pkg1. Box. bySideA()
public static java. util. Comparator app. pkg20. pkg1. Box. bySideB()
public java. lang. String app. pkg20. pkg1. Box. toString()
public final int app. pkg20. pkg1. Box. compareTo(java. lang. Object)
public final void java. lang. Object. wait() throws java. lang. InterruptedException
public final void java. lang. Object. wait(long, int) throws java. lang. InterruptedException
public final native void java. lang. Object. wait(long) throws java. lang. InterruptedException
public boolean java. lang. Object. equals(java. lang. Object)
public native int java. lang. Object. hashCode()
public final native java. lang. Class java. lang. Object. getClass()
public final native void java. lang. Object. notify()
public final native void java. lang. Object. notifyAll()
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)
//Math math = new Math(); error
Работа с ошибками
Законы Мерфи. В программах есть ошибки. На них нужно реагировать.
Try – catch – finally
try – это защищенный блок
s1();
s2();
finally – по окончанию try всегда вызывается finally
Как не надо писать catch
try {... }
catch(SomeExceptionClass e) { }
catch(AnotherExceptionClass e) {... }
ПРАКТИКА - mod11-13
ПОТОКИ ДАННЫХ
в версии Java 1. 1 появился дополнительный набор классов, основывающийся на типах Reader и Writer. Эта иерархия очень схожа с аналогичной для байтовых потоков InputStream и OutputStream. Главное отличие между ними – Reader и Writer работают с потоком символов (char). Только чтение массива символов в Reader описывается методом read(char[]), а запись в Writer – write(char[]).
Байтовый поток Символьный поток
InputStream Reader
OutputStream Writer
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
Нет аналога InputStreamReader
Нет аналога OutputStreamWriter
FileInputStream FileReader
FileOutputStream FileWriter
FilterInputStream FilterReader
FilterOutputStream FilterWriter
BufferedInputStream BufferedReader
BufferedOutputStream BufferedWriter
PrintStream PrintWriter
DataInputStream Нет аналога
DataOutputStream Нет аналога
ObjectInputStream Нет аналога
ObjectOutputStream Нет аналога
PipedInputStream PipedReader
PipedOutputStream PipedWriter
StringBufferInputStream StringReader
Нет аналога StringWriter
LineNumberInputStream LineNumberReader
PushBackInputStream PushBackReader
SequenceInputStream Нет аналога
flush – сохраняет инфу на жёсткий диск из буфера оперативной памяти
try {
fin = new BufferedInputStream(new FileInputStream(args[0]));
fout = new BufferedOutputStream(new FileOutputStream(args[1]));
// Copy the file.
// Because buffered streams are used, the
// read and write operations are automatically
// buffered, which results in higher performance.
int i;
do {
i = fin. read();
if(i! = -1) fout. write(i);
} while(i! = -1);
} catch(IOException exc) {System. out. println(" File Error" ); }
finally { fin. close();
fout. close();
}
Практика
package app. pkg20. pkg2;
import java. io. *;
public class App202 {
public static void main(String[] args) {
// TODO code application logic here
//double []data = {1e2, 5, 1. 07, 2. 14, 100. 2};
// save(data, " data. txt" );
load(" data. txt" ); //мы пишем
}
static void save(double[] d, String name) {
try(
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(name)))){
for(double di: d) dos. writeDouble(di);
}
catch(FileNotFoundException ex) {ex. printStackTrace(); }
catch(IOException ex) {ex. printStackTrace(); }
finally {
System. out. println(" end of save" );
}
}
static void load(String datatxt) {
try(
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(datatxt)))){
while(true)
{
System. out. println(dis. readDouble());
}
}
catch(EOFException ex){System. out. println(" end of read" ); } //выделил как отдельный случай конца файла
catch(IOException ex) {ex. printStackTrace(); }
}
}
run:
100. 0
5. 0
1. 07
2. 14
100. 2
end of read
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)