UNDERSTANDING CLASSES CMSC 150: Lecture 17 String Literals "Wilco" String literal: a sequence of characters flanked by " Want to operate on the sequence E.g., pull out substrings, locate characters, etc. No primitive data type directly handles such sequences Primitives Primitives are only for storing information int myInteger = 5; boolean myBoolean = true; char myCharacter = 'c'; No associated methods myInteger.getValue(); // NOT VALID!! So a primitive type to hold strings wouldn't help Let's Write Our Own Class! public class String { // instance variables private char[] data; // constructor public String(char[] value) { … } // some useful methods public char charAt(int index) { … } public int indexOf(char ch) { … } public String substring(int beginIndex) { … } … } Our String Class We now have a new class named String Stores data Provides useful methods Create new objects of this class type: String myString = new String("Wilco"); String ourString = new String("Son Volt"); Use methods we wrote: int index = ourString.indexOf(' '); String firstWord = ourString.substring(0, index); Use String Class in Other Classes public class FancyEmailReader { … public FancyEmailReader() { … String userHost = accountField.getText(); int index = userHost.indexOf('@'); String user = userHost.substring(0, index); String host = userHost.substring(index + 1); … } } In Memory String myString; 127 "myString" 128 Enough space to hold a memory address 129 130 131 132 0 In Memory String myString; myString = new String("Wilco"); 127 "myString" 128 129 Enough space to hold an object of our class type 130 131 132 130 In Memory String myString; myString = new String("Wilco"); 127 "myString" 128 Data 129 130 131 132 130 In Memory String myString; myString = new String("Wilco"); 127 "myString" 128 129 Methods 130 131 132 130 The String Class Gives us a new data type Allows us to meaningfully store info And have methods to operate on that info Use String whenever it is useful Back to Last Lab… public class IMClient { … String lineFromServer = connection.in.nextLine() … } linefromServer contains info like "IM_IN2:Lilly:T:T:<HTML><BODY>…" Back to Last Lab… public class IMClient { … String lineFromServer = connection.in.nextLine() … } linefromServer contains info like "IM_IN2:Lilly:T:T:<HTML><BODY>…" Want methods to pull out buddy, status, msg String class doesn't provide such methods Let's Write Our Own! public class TOCServerPacket { String contents; public TOCServerPacket(String packetContents) { … } public boolean isError() { … } public boolean isBuddyUpdate() { … } public boolean isIncomingIM() { … } public public public public String String String String getBuddyName() getBuddyStatus() getErrorCode() getMessage() { { { { … … … … } } } } private String getPrefix(String uncutPacket) { … } private String getSuffix(String uncutPacket, int colonNumber) { … } } Let's Write Our Own! public class TOCServerPacket { String contents; public TOCServerPacket(String packetContents) { … } public boolean isError() { … } public boolean isBuddyUpdate() { … } public boolean isIncomingIM() { … } public public public public String String String String getBuddyName() getBuddyStatus() getErrorCode() getMessage() { { { { … … … … } } } } private String getPrefix(String uncutPacket) { … } private String getSuffix(String uncutPacket, int colonNumber) { … } } Similar to the String Class class gives us a new data type TocServerPacket Allows us to meaningfully store info The And have methods to operate on that info String returned from the server isIncomingIM(), getBuddyName(), getBuddyStatus() Use TocServerPacket whenever it is useful Use TOCServerPacket in Other Classes public class IMControl { … public void dataAvailable() { … String lineFromServer = connection.in.nextPacket(); // get the buddy name int firstIndex = lineFromServer.indexOf(':'); int secondIndex = lineFromServer.indexOf(':', firstIndex + 1); String buddy = lineFromServer.substring(firstIndex + 1, secondIndex); // pull out message while ( … ) { … } } } Use TOCServerPacket in Other Classes public class IMControl { … Use a TOCServerPacket! public void dataAvailable() { … String lineFromServer = connection.in.nextPacket(); // get the buddy name int firstIndex = lineFromServer.indexOf(':'); int secondIndex = lineFromServer.indexOf(':', firstIndex + 1); String buddy = lineFromServer.substring(firstIndex + 1, secondIndex); // pull out message while ( … ) { … } } } Use TOCServerPacket in Other Classes public class IMControl { … Use a TOCServerPacket! public void dataAvailable() { … String lineFromServer = connection.in.nextPacket(); TOCServerPacket packet = new TOCServerPacket(lineFromServer); String buddy = packet.getBuddyName(); String message = packet.getMessage(); } } In Memory String line = conn.in.nextPacket(); TOCServerPacket packet; 127 "packet" 128 129 Enough space to hold a memory address 130 131 132 0 In Memory String line = conn.in.nextPacket(); TOCServerPacket packet; 127 packet = new TOCServerPacket(lineFromServer); "packet" 128 129 130 131 132 130 In Memory String line = conn.in.nextPacket(); TOCServerPacket packet; 127 packet = new TOCServerPacket(lineFromServer); "packet" 128 Data 129 130 131 132 130 In Memory String line = conn.in.nextPacket(); TOCServerPacket packet; 127 packet = new TOCServerPacket(lineFromServer); "packet" 128 129 Methods 130 131 132 130 Your tour guide will be…