diff --git a/Doc/Sd1/objectsClasses.xml b/Doc/Sd1/objectsClasses.xml index c98d47ec318662980d260cdab58821668aaf7ca3..fe50a9fc961e2374586e3ca51524c513451c779c 100644 --- a/Doc/Sd1/objectsClasses.xml +++ b/Doc/Sd1/objectsClasses.xml @@ -505,188 +505,6 @@ public class Print { </tr> </informaltable> </figure> - - <qandaset defaultlabel="qanda" xml:id="sd1_qanda_defineStringClass"> - <title>Your personal <classname>String</classname> class</title> - - <qandadiv> - <qandaentry> - <question> - <para>This exercise is about using packages for resolving class - name clashes.</para> - - <para>Define your own class <classname>String</classname> having a - suitable constructor and a <methodname>public String - toString()</methodname> method allowing for the following - snippet:</para> - - <programlisting language="java">public static void main(...) { - String john = new String("John"); - System.out.println("Name: " + john); - System.out.println(john.sayHello()); -}</programlisting> - - <para>The expected output reads:</para> - - <screen>Name: John -Hello 'John'</screen> - - <tip> - <para>Your classes constructor is bound to accept standard <xref - linkend="glo_Java"/> string literals. Using <classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">java.lang.String</classname> - internally requires a fully qualified class name.</para> - </tip> - </question> - - <answer> - <para>We implement our <classname>String</classname> class in a - package <package>de.hdm_stuttgart.mi.sd1.tooling</package>:</para> - - <programlisting language="java">package de.hdm_stuttgart.mi.sd1.tooling; - -public class String { <co linkends="sd1_callout_createStringClass-1.2" - xml:id="sd1_callout_createStringClass-1.3-co"/> - - final java.lang.String s; <co linkends="sd1_callout_createStringClass-2.2" - xml:id="sd1_callout_createStringClass-2.2-co"/> - - public String(final java.lang.String s <co - linkends="sd1_callout_createStringClass-3.2" - xml:id="sd1_callout_createStringClass-3.2-co"/>) { - this.s = s; - } - - public java.lang.String <co linkends="sd1_callout_createStringClass-4" - xml:id="sd1_callout_createStringClass-4-co"/> sayHello() { - return "Hello '" + s + "', good morning!"; - } -}</programlisting> - - <calloutlist> - <callout arearefs="sd1_callout_createStringClass-1.3-co" - xml:id="sd1_callout_createStringClass-1.2"> - <para>Shadowing <xref linkend="glo_Java"/> <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname>.</para> - </callout> - - <callout arearefs="sd1_callout_createStringClass-2.2-co" - xml:id="sd1_callout_createStringClass-2.2"> - <para>Using a standard <xref linkend="glo_Java"/> <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> - instance internally. Fully qualified class name required - resolving potential name clash.</para> - </callout> - - <callout arearefs="sd1_callout_createStringClass-3.2-co" - xml:id="sd1_callout_createStringClass-3.2"> - <para>Our constructor also accepts a standard <xref - linkend="glo_Java"/> <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> - instance.</para> - </callout> - - <callout arearefs="sd1_callout_createStringClass-4-co" - xml:id="sd1_callout_createStringClass-4"> - <para>Returning a <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> - instance.</para> - </callout> - </calloutlist> - - <para>There are basically two ways using - <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname> - and <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> - in the same scope:</para> - - <glosslist> - <glossentry> - <glossterm>Fully qualify <package - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname>:</glossterm> - - <glossdef> - <programlisting language="java">package de.hdm_stuttgart.mi; - -import de.hdm_stuttgart.mi.sd1.tooling.String; - -public class Main { - - public static void main(java.lang.String <co - linkends="sd1_callout_createStringAnswer1-1" - xml:id="sd1_callout_createStringAnswer1-1-co"/> [] args) { - String <co linkends="sd1_callout_createStringAnswer1-2" - xml:id="sd1_callout_createStringAnswer1-2-co"/> s = new String("John"); - System.out.println(s.sayHello()); - } -}</programlisting> - - <calloutlist> - <callout arearefs="sd1_callout_createStringAnswer1-1-co" - xml:id="sd1_callout_createStringAnswer1-1"> - <para>Qualifying is required to avoid shadowing by - <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>.</para> - </callout> - - <callout arearefs="sd1_callout_createStringAnswer1-2-co" - xml:id="sd1_callout_createStringAnswer1-2"> - <para>Due to the <code language="java">import</code> - statement this is actually - <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>.</para> - </callout> - </calloutlist> - </glossdef> - </glossentry> - - <glossentry> - <glossterm>Fully qualify - <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>:</glossterm> - - <glossdef> - <programlisting language="java">package de.hdm_stuttgart.mi; - -public class Main { - - public static void main(String <co - linkends="sd1_callout_createStringAnswer2-1" - xml:id="sd1_callout_createStringAnswer2-1-co"/> [] args) { - de.hdm_stuttgart.mi.sd1.tooling.String <co - linkends="sd1_callout_createStringAnswer2-2" - xml:id="sd1_callout_createStringAnswer2-2-co"/> s = - new de.hdm_stuttgart.mi.sd1.tooling.String("John"); - System.out.println(s.sayHello()); - } -}</programlisting> - - <calloutlist> - <callout arearefs="sd1_callout_createStringAnswer2-1-co" - xml:id="sd1_callout_createStringAnswer2-1"> - <para>A <xref linkend="glo_Java"/> standard <classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> - instance.</para> - </callout> - - <callout arearefs="sd1_callout_createStringAnswer2-2-co" - xml:id="sd1_callout_createStringAnswer2-2"> - <para>In order not to override the implicit import - java.lang.String we have to fully qualify our own - <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname> - class.</para> - </callout> - </calloutlist> - </glossdef> - </glossentry> - </glosslist> - </answer> - </qandaentry> - </qandadiv> - </qandaset> </section> <section xml:id="sd1_sect_methods"> @@ -1560,6 +1378,201 @@ public void writeSvg() { </qandadiv> </qandaset> + <qandaset defaultlabel="qanda" xml:id="sd1_qanda_defineStringClass"> + <title>Your personal <classname>String</classname> class</title> + + <qandadiv> + <qandaentry> + <question> + <para>This exercise is about using packages for resolving class + name clashes.</para> + + <para>Define your own <classname>String</classname> class having a + suitable constructor and a <methodname>public String + toString()</methodname> method allowing for the following + snippet:</para> + + <programlisting language="java">public static void main(...) { + String john = new String("John"); + System.out.println("Name: " + john); + System.out.println(john.sayHello()); +}</programlisting> + + <para>The expected output reads:</para> + + <screen>Name: John +Hello 'John'</screen> + + <tip> + <orderedlist> + <listitem> + <para>Use a <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + instance variable inside your private + <classname>String</classname> class.</para> + </listitem> + + <listitem> + <para>Your class' constructor is bound to accept standard + <xref linkend="glo_Java"/> string literals. Using <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">java.lang.String</classname> + internally requires a fully qualified class name.</para> + </listitem> + </orderedlist> + </tip> + </question> + + <answer> + <para>We implement our private <classname>String</classname> class + in a package + <package>de.hdm_stuttgart.mi.sd1.tooling</package>:</para> + + <programlisting language="java">package de.hdm_stuttgart.mi.sd1.tooling; + +public class String { <co linkends="sd1_callout_createStringClass-1.2" + xml:id="sd1_callout_createStringClass-1.3-co"/> + + final java.lang.String s; <co linkends="sd1_callout_createStringClass-2.2" + xml:id="sd1_callout_createStringClass-2.2-co"/> + + public String(final java.lang.String s <co + linkends="sd1_callout_createStringClass-3.2" + xml:id="sd1_callout_createStringClass-3.2-co"/>) { + this.s = s; + } + + public java.lang.String <co linkends="sd1_callout_createStringClass-4" + xml:id="sd1_callout_createStringClass-4-co"/> sayHello() { + return "Hello '" + s + "', good morning!"; + } +}</programlisting> + + <calloutlist> + <callout arearefs="sd1_callout_createStringClass-1.3-co" + xml:id="sd1_callout_createStringClass-1.2"> + <para>Shadowing <xref linkend="glo_Java"/> <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname>.</para> + </callout> + + <callout arearefs="sd1_callout_createStringClass-2.2-co" + xml:id="sd1_callout_createStringClass-2.2"> + <para>Using a standard <xref linkend="glo_Java"/> <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + instance internally. Fully qualified class name required + resolving potential name clash.</para> + </callout> + + <callout arearefs="sd1_callout_createStringClass-3.2-co" + xml:id="sd1_callout_createStringClass-3.2"> + <para>Our constructor also accepts a standard <xref + linkend="glo_Java"/> <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + instance.</para> + </callout> + + <callout arearefs="sd1_callout_createStringClass-4-co" + xml:id="sd1_callout_createStringClass-4"> + <para>Returning a <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + instance.</para> + </callout> + </calloutlist> + + <para>There are basically two ways using + <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname> + and <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + in the same scope:</para> + + <glosslist> + <glossentry> + <glossterm>Fully qualify <package + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html">java.lang</package>.<classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname>:</glossterm> + + <glossdef> + <programlisting language="java">package de.hdm_stuttgart.mi; + +import de.hdm_stuttgart.mi.sd1.tooling.String; + +public class Main { + + public static void main(java.lang.String <co + linkends="sd1_callout_createStringAnswer1-1" + xml:id="sd1_callout_createStringAnswer1-1-co"/> [] args) { + String <co linkends="sd1_callout_createStringAnswer1-2" + xml:id="sd1_callout_createStringAnswer1-2-co"/> s = new String("John"); + System.out.println(s.sayHello()); + } +}</programlisting> + + <calloutlist> + <callout arearefs="sd1_callout_createStringAnswer1-1-co" + xml:id="sd1_callout_createStringAnswer1-1"> + <para>Qualifying is required to avoid shadowing by + <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>.</para> + </callout> + + <callout arearefs="sd1_callout_createStringAnswer1-2-co" + xml:id="sd1_callout_createStringAnswer1-2"> + <para>Due to the <code language="java">import</code> + statement this is actually + <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>.</para> + </callout> + </calloutlist> + </glossdef> + </glossentry> + + <glossentry> + <glossterm>Fully qualify + <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname>:</glossterm> + + <glossdef> + <programlisting language="java">package de.hdm_stuttgart.mi; + +public class Main { + + public static void main(String <co + linkends="sd1_callout_createStringAnswer2-1" + xml:id="sd1_callout_createStringAnswer2-1-co"/> [] args) { + de.hdm_stuttgart.mi.sd1.tooling.String <co + linkends="sd1_callout_createStringAnswer2-2" + xml:id="sd1_callout_createStringAnswer2-2-co"/> s = + new de.hdm_stuttgart.mi.sd1.tooling.String("John"); + System.out.println(s.sayHello()); + } +}</programlisting> + + <calloutlist> + <callout arearefs="sd1_callout_createStringAnswer2-1-co" + xml:id="sd1_callout_createStringAnswer2-1"> + <para>A <xref linkend="glo_Java"/> standard <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/String.html">String</classname> + instance.</para> + </callout> + + <callout arearefs="sd1_callout_createStringAnswer2-2-co" + xml:id="sd1_callout_createStringAnswer2-2"> + <para>In order not to override the implicit import + java.lang.String we have to fully qualify our own + <package>de.hdm_stuttgart.mi.sd1.tooling</package>.<classname>String</classname> + class.</para> + </callout> + </calloutlist> + </glossdef> + </glossentry> + </glosslist> + </answer> + </qandaentry> + </qandadiv> + </qandaset> + <section xml:id="sd1_sect_accessControl"> <title>Encapsulation and access control</title> @@ -2890,9 +2903,9 @@ public class Driver { </listitem> <listitem> - <para>Moving your <classname>Employee</classname> class from + <para>Move your <classname>Employee</classname> class from its current package <package>company</package> to - <package>model</package> but leaving your + <package>model</package> but leave your <classname>Driver</classname> class in its current package <package>company</package>. You may simply use your <xref linkend="glo_IDE"/>'s <acronym>drag'n drop</acronym> @@ -2901,7 +2914,7 @@ public class Driver { </itemizedlist> <para>What do you observe? Explain this result. How do you solve - this problem?</para> + the new problem?</para> <tip> <para>Read the section on <code language="java">public</code>, @@ -2914,10 +2927,9 @@ public class Driver { <answer> <para>Moving the <classname>Employee</classname> class from its <package>company</package> package to <package>model</package> - changes just one line of code in - <filename>Employee.java</filename> namely its <code - language="java">package</code> declaration. It also adds an - <code language="java">import</code> statement</para> + changes just one line of code in your + <filename>Employee.java</filename> class namely its <code + language="java">package</code> declaration:</para> <informaltable border="1"> <colgroup width="45%"/> @@ -2945,11 +2957,11 @@ public class Employee { </tr> </informaltable> - <para>The movement also adds an additional line of code in our - <classname>Driver</classname> class which is required since our + <para>The movement also adds an additional <code + language="java">import</code> statement to your + <classname>Driver</classname> class which is required since the <classname>Employee</classname> class now resides in a different - package (We may have other <classname>Employee</classname> - classes within other packages):</para> + package:</para> <informaltable border="1"> <colgroup width="45%"/> @@ -2969,9 +2981,9 @@ public class Driver { <td align="center">⟹</td> - <td valign="top"><programlisting language="java">package company; + <td valign="top"><programlisting language="none">package company; -<emphasis role="bold">import model.Employee;</emphasis> +<emphasis role="red">import model.Employee;</emphasis> public class Driver { @@ -2981,9 +2993,10 @@ public class Driver { </tr> </informaltable> - <para>Unfortunately our <classname>Driver</classname> class - still residing in our <package>company</package> package will no - longer compile:</para> + <para>Unfortunately a <classname>Driver</classname> class still + residing in our <package>company</package> package will no + longer compile due to a newly introduced access + restriction:</para> <programlisting language="java">package company; @@ -3005,11 +3018,11 @@ public class Driver { the Encapsulation and Access Control section of <xref linkend="bib_Kurniawan2015"/>: The attributes <property>age</property> and <property>salary</property> have no - access modifiers at all hence <quote>default</quote> access is - being granted. Default access type prohibits classes belonging - to other packages accessing the attributes in question. More - clearly: Members from class <classname>Driver</classname> have - no permission to access either <property>age</property> or + access modifiers at all. Hence <quote>default</quote> access + prohibits classes belonging to other packages accessing the + attributes in question. More clearly: Members from class + <classname>Driver</classname> have no permission to access + either <property>age</property> or <property>salary</property>.</para> <para>There are two possible ways to overcome this @@ -3102,7 +3115,7 @@ public class Driver { </qandaset> <qandaset defaultlabel="qanda" xml:id="sw1QandaEmployeeConstructorThis"> - <title>Constructors and variable names</title> + <title>Constructors variable names and <quote>this</quote>.</title> <qandadiv> <qandaentry>