29 июн. 2015 г.

Классы. Практика: строки и массивы как аргументы.

Теперь немного попрактикуемся чтобы закрепить прошлый материал. Так же что бы хорошо понять эти упражнения рекомендую освежить в памяти эту статью, особенно ее начальную часть где рассказывается о том как строки располагаются в памяти.

По существу это практика на понимание ссылочных типов данных и нацелена она на то чтобы понять разницу между объектом и ссылкой на объект. Поехали!

import static pro.java.util.Print.*;
import static pro.java.util.Sys.iHash;
public class Classes013 {
public static void main(String[] args) {
println("------- str1 & str2 --------");
Str str1 = new Str("Str1");
str1.printStrHash();
String str2 = "Str1";
println("хэш объекта str2 = " + iHash(str2) + " строка = " + str2);
println("\n------- str3 & str4 --------");
Str str3 = new Str(new String("Str1"));
str3.printStrHash();
String str4 = str3.getStr();
println("хэш объекта str4 = " + iHash(str4) + " строка = " + str4);
println("\n------- str4 --------");
str4 = str4.intern();
println("хэш объекта str4 = " + iHash(str4) + " строка = " + str4);
println("\n------- Arrays --------");
Dim dim1 = new Dim("один", "два", "три");
print("Массив в классе Dim: ");
for (String str : dim1.getStrArray()) {
print(" " + str);
}
println();
String[] strArray = dim1.getStrArray();
for (int i = 0; i < strArray.length; ++i) {
strArray[i] = String.valueOf(i + 1);
}
print("Массив в классе Dim: ");
for (String str : dim1.getStrArray()) {
print(" " + str);
}
dim1.setIndex(0, "one");
dim1.setIndex(1, "two");
dim1.setIndex(2, "three");
println();
print("Массив в классе strArray: ");
for (String str : strArray) {
print(" " + str);
}
}
}
view raw Classes013.java hosted with ❤ by GitHub

И теперь два маленьких класса используемых в этой программе.

import static pro.java.util.Print.*;
import static pro.java.util.Sys.iHash;
public class Str {
String myStr;
Str(String str) {
myStr = str;
}
void setStr(String str) {
myStr = str;
}
void printStrHash() {
println("хэш объекта myStr = " + iHash(myStr) + " строка = " + myStr);
}
String getStr(){
return myStr;
}
}
view raw Str.java hosted with ❤ by GitHub

import static pro.java.util.Print.*;
public class Dim {
String[] strArray;
Dim(String... strings) {
strArray = strings;
}
void setIndex(int a, String str) {
strArray[a] = str;
}
void printIndex(int a){
print(strArray[a]);
}
String[] getStrArray(){
return strArray;
}
}
view raw Dim.java hosted with ❤ by GitHub

Далее вывод данной программы:

CP0001

Кратенько поясню данный вывод. В строке 8 основной программы создается объект str1, который содержит строку Str1. В 9 строке создается строковая переменная str2 которая так же содержит строку Str1. НО! Хотя эти строки и создаются по разному, это один и тот же объект, что видно из вывода программы. С выводом str3 и str4 все должно уже быть более мнее вам понятно. А затем при помощи метода intern() в строке 20 мы заставляем str4 указывать на тот же объект (строку) что и str1 с str2. С массивами еще интереснее. Мы создаем класс dim1, внутри которого уже формируется массив из переданных аргументов. И далее на эти аргументы мы воздействуем из Class013 через массив strArray. А затем делаем наоборот. Это возможно поскольку мы работаем со ссылочными типами.

На эти грабли частенько наступают начинающие программисты. Если что-то не понятно, то пишите комменты.

Комментариев нет:

Отправить комментарий