Теперь немного попрактикуемся чтобы закрепить прошлый материал. Так же что бы хорошо понять эти упражнения рекомендую освежить в памяти эту статью, особенно ее начальную часть где рассказывается о том как строки располагаются в памяти.
По существу это практика на понимание ссылочных типов данных и нацелена она на то чтобы понять разницу между объектом и ссылкой на объект. Поехали!
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); | |
} | |
} | |
} |
И теперь два маленьких класса используемых в этой программе.
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; | |
} | |
} |
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; | |
} | |
} |
Далее вывод данной программы:
Кратенько поясню данный вывод. В строке 8 основной программы создается объект str1, который содержит строку Str1. В 9 строке создается строковая переменная str2 которая так же содержит строку Str1. НО! Хотя эти строки и создаются по разному, это один и тот же объект, что видно из вывода программы. С выводом str3 и str4 все должно уже быть более мнее вам понятно. А затем при помощи метода intern() в строке 20 мы заставляем str4 указывать на тот же объект (строку) что и str1 с str2. С массивами еще интереснее. Мы создаем класс dim1, внутри которого уже формируется массив из переданных аргументов. И далее на эти аргументы мы воздействуем из Class013 через массив strArray. А затем делаем наоборот. Это возможно поскольку мы работаем со ссылочными типами.
На эти грабли частенько наступают начинающие программисты. Если что-то не понятно, то пишите комменты.
Комментариев нет:
Отправить комментарий