Kĩ thuật lập trình - Classes and objects: A deeper look

Not initializing a final instance variable in its declaration or in every constructor of the class yields a compilation error indicating that the variable might not have been initialized. The same error occurs if the class initializes the variable in some, but not all, of the class’s constructors.

ppt118 trang | Chia sẻ: huyhoang44 | Lượt xem: 903 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Classes and objects: A deeper look, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
8Classes and Objects: A Deeper Look1 Instead of this absurd division into sexes, they ought to class people as static and dynamic.Evelyn WaughIs it a world to hide virtues in?William ShakespeareBut what, to serve our private ends, Forbids the cheating of our friends?Charles ChurchillThis above all: to thine own self be true.William ShakespeareDon’t be “consistent,” but be simply true. — Oliver Wendell Holmes, Jr.2OBJECTIVESIn this chapter you will learn: Encapsulation and data hiding.The notions of data abstraction and abstract data types (ADTs).To use keyword this.To use static variables and methods.To import static members of a class.To use the enum type to create sets of constants with unique identifiers.How to declare enum constants with parameters.38.1    Introduction8.2    Time Class Case Study8.3    Controlling Access to Members8.4    Referring to the Current Object’s Members with the this Reference8.5    Time Class Case Study: Overloaded Constructors8.6    Default and No-Argument Constructors8.7    Notes on Set and Get Methods8.8    Composition8.9    Enumerations8.10   Garbage Collection and Method finalize48.11    static Class Members8.12    static Import8.13    final Instance Variables8.14    Software Reusability8.15    Data Abstraction and Encapsulation8.16    Time Class Case Study: Creating Packages8.17    Package Access8.18    (Optional) GUI and Graphics Case Study: Using Objects with Graphics8.19    (Optional) Software Engineering Case Study: Starting to Program the Classes of the ATM System8.20    Wrap-Up58.2  Time Class Case Study public services (or public interface)public methods available for a client to useIf a class does not define a constructor the compiler will provide a default constructorInstance variablesCan be initialized when they are declared or in a constructorShould maintain consistent (valid) values6Software Engineering Observation 8.1Methods that modify the values of private variables should verify that the intended new values are proper. If they are not, the set methods should place the private variables into an appropriate consistent state. 7OutlineTime1.java(1 of 2)private instance variablesDeclare public method setTimeValidate parameter values before setting instance variables8OutlineTime1.java(2 of 2)format strings98.2  Time Class Case Study (Cont.)String method formatSimilar to printf except it returns a formatted string instead of displaying it in a command windownew implicitly invokes Time1’s default constructor since Time1 does not declare any constructors10Software Engineering Observation 8.2Classes simplify programming, because the client can use only the public methods exposed by the class. Such methods are usually client oriented rather than implementation oriented. Clients are neither aware of, nor involved in, a class’s implementation. Clients generally care about what the class does but not how the class does it.11Software Engineering Observation 8.3Interfaces change less frequently than implementations. When an implementation changes, implementation-dependent code must change accordingly. Hiding the implementation reduces the possibility that other program parts will become dependent on class-implementation details. 12OutlineTime1Test.java(1 of 2)Create a Time1 objectCall toUniversalString methodCall toString method13OutlineTime1Test.java(2 of 2)Call setTime methodCall setTime method with invalid values148.3  Controlling Access to Members A class’s public interfacepublic methods a view of the services the class provides to the class’s clientsA class’s implementation detailsprivate variables and private methods are not accessible to the class’s clients15Common Programming Error 8.1 An attempt by a method that is not a member of a class to access a private member of that class is a compilation error. 16OutlineMemberAccessTest.javaAttempting to access private instance variables178.4  Referring to the Current Object’s Members with the this Reference The this referenceAny object can access a reference to itself with keyword thisNon-static methods implicitly use this when referring to the object’s instance variables and other methodsCan be used to access instance variables when they are shadowed by local variables or method parametersA .java file can contain more than one classBut only one class in each .java file can be public18OutlineThisTest.java(1 of 2)Create new SimpleTime objectDeclare instance variablesMethod parameters shadow instance variablesUsing this to access the object’s instance variables19OutlineThisTest.java(2 of 2)Using this explicitly and implicitly to call toUniversalStringUse of this not necessary here20Common Programming Error 8.2It is often a logic error when a method contains a parameter or local variable that has the same name as a field of the class. In this case, use reference this if you wish to access the field of the class—otherwise, the method parameter or local variable will be referenced. 21Error-Prevention Tip 8.1Avoid method parameter names or local variable names that conflict with field names. This helps prevent subtle, hard-to-locate bugs.22Performance Tip 8.1 Java conserves storage by maintaining only one copy of each method per class—this method is invoked by every object of the class. Each object, on the other hand, has its own copy of the class’s instance variables (i.e., non-static fields). Each method of the class implicitly uses this to determine the specific object of the class to manipulate. 238.5  Time Class Case Study: Overloaded Constructors Overloaded constructorsProvide multiple constructor definitions with different signaturesNo-argument constructorA constructor invoked without argumentsThe this reference can be used to invoke another constructorAllowed only as the first statement in a constructor’s body24OutlineTime2.java(1 of 4)No-argument constructorInvoke three-argument constructor25OutlineTime2.java(2 of 4)Call setTime methodConstructor takes a reference to another Time2 object as a parameterCould have directly accessed instance variables of object time here26OutlineTime2.java(3 of 4)27OutlineTime2.java(4 of 4)28It is a syntax error when this is used in a constructor’s body to call another constructor of the same class if that call is not the first statement in the constructor. It is also a syntax error when a method attempts to invoke a constructor directly via this.Common Programming Error 8.329Common Programming Error 8.4 A constructor can call methods of the class. Be aware that the instance variables might not yet be in a consistent state, because the constructor is in the process of initializing the object. Using instance variables before they have been initialized properly is a logic error. 30Software Engineering Observation 8.4 When one object of a class has a reference to another object of the same class, the first object can access all the second object’s data and methods (including those that are private). 318.5  Time Class Case Study: Overloaded Constructors (Cont.)Using set methodsHaving constructors use set methods to modify instance variables instead of modifying them directly simplifies implementation changing32Software Engineering Observation 8.5 When implementing a method of a class, use the class’s set and get methods to access the class’s private data. This simplifies code maintenance and reduces the likelihood of errors. 33OutlineTime2Test.java(1 of 3)Call overloaded constructors34OutlineTime2Test.java(2 of 3)35OutlineTime2Test.java(3 of 3)368.6  Default and No-Argument Constructors Every class must have at least one constructorIf no constructors are declared, the compiler will create a default constructorTakes no arguments and initializes instance variables to their initial values specified in their declaration or to their default valuesDefault values are zero for primitive numeric types, false for boolean values and null for referencesIf constructors are declared, the default initialization for objects of the class will be performed by a no-argument constructor (if one is declared)37Common Programming Error 8.5 5If a class has constructors, but none of the public constructors are no-argument constructors, and a program attempts to call a no-argument constructor to initialize an object of the class, a compilation error occurs. A constructor can be called with no arguments only if the class does not have any constructors (in which case the default constructor is called) or if the class has a public no-argument constructor.38Software Engineering Observation 8.6 6Java allows other methods of the class besides its constructors to have the same name as the class and to specify return types. Such methods are not constructors and will not be called when an object of the class is instantiated. Java determines which methods are constructors by locating the methods that have the same name as the class and do not specify a return type. 398.7  Notes on Set and Get Methods Set methodsAlso known as mutator methodsAssign values to instance variablesShould validate new values for instance variablesCan return a value to indicate invalid dataGet methodsAlso known as accessor methods or query methodsObtain the values of instance variablesCan control the format of the data it returns40Software Engineering Observation 8.7When necessary, provide public methods to change and retrieve the values of private instance variables. This architecture helps hide the implementation of a class from its clients, which improves program modifiability. 41Software Engineering Observation 8.8 Class designers need not provide set or get methods for each private field. These capabilities should be provided only when it makes sense. 428.7  Notes on Set and Get Methods (Cont.)Predicate methodsTest whether a certain condition on the object is true or false and returns the resultExample: an isEmpty method for a container class (a class capable of holding many objects)Encapsulating specific tasks into their own methods simplifies debugging efforts438.8  Composition CompositionA class can have references to objects of other classes as membersSometimes referred to as a has-a relationship44Software Engineering Observation 8.9 One form of software reuse is composition, in which a class has as members references to objects of other classes. 45OutlineDate.java(1 of 3)46OutlineDate.java(2 of 3)Validates month valueValidates day value47OutlineDate.java(3 of 3)Check if the day is February 29 on a leap year48OutlineEmployee.javaEmployee contains references to two Date objectsImplicit calls to hireDate and birthDate’s toString methods49OutlineEmployeeTest.javaCreate an Employee objectDisplay the Employee object508.9  Enumerations enum typesDeclared with an enum declarationA comma-separated list of enum constantsDeclares an enum class with the following restrictions:enum types are implicitly finalenum constants are implicitly staticAttempting to create an object of an enum type with new is a compilation errorenum constants can be used anywhere constants canenum constructor Like class constructors, can specify parameters and be overloaded51OutlineBook.java(1 of 2)Declare six enum constantsArguments to pass to the enum constructorDeclare enum constructor BookDeclare instance variables52OutlineBook.java(2 of 2)538.9  Enumerations (Cont.)static method valuesGenerated by the compiler for every enumReturns an array of the enum’s constants in the order in which they were declaredstatic method range of class EnumSetTakes two parameters, the first and last enum constants in the desired rangeReturns an EnumSet containing the constants in that range, inclusiveAn enhanced for statement can iterate over an EnumSet as it can over an array54OutlineEnumTest.java(1 of 2)Enhanced for loop iterates for each enum constant in the array returned by method valueEnhanced for loop iterates for each enum constant in the EnumSet returned by method range55OutlineEnumTest.java(2 of 2)56Common Programming Error 8.6 In an enum declaration, it is a syntax error to declare enum constants after the enum type’s constructors, fields and methods in the enum declaration. 578.10  Garbage Collection and Method finalize Garbage collectionJVM marks an object for garbage collection when there are no more references to that objectJVM’s garbage collector will retrieve those objects memory so it can be used for other objectsfinalize methodAll classes in Java have the finalize methodInherited from the Object classfinalize is called by the garbage collector when it performs termination housekeepingfinalize takes no parameters and has return type void58Software Engineering Observation 8.10 A class that uses system resources, such as files on disk, should provide a method to eventually release the resources. Many Java API classes provide close or dispose methods for this purpose. For example, class Scanner (java.sun.com/javase/6/docs/api/java/util/Scanner.html) has a close method. 598.11  static Class Members static fieldsAlso known as class variablesRepresents class-wide informationUsed when:all objects of the class should share the same copy of this instance variable orthis instance variable should be accessible even when no objects of the class existCan be accessed with the class name or an object name and a dot (.)Must be initialized in their declarations, or else the compiler will initialize it with a default value (0 for ints)60Software Engineering Observation 8.11 Use a static variable when all objects of a class must use the same copy of the variable. 61Software Engineering Observation 8.12 Static class variables and methods exist, and can be used, even if no objects of that class have been instantiated. 62OutlineEmployee.java(1 of 2)Declare a static fieldIncrement static field63OutlineEmployee.java(2 of 2)Declare method finalizeDeclare static method getCount to get static field count64OutlineEmployeeTest.java(1 of 3)Call static method getCount using class name EmployeeCreate new Employee objects65OutlineEmployeeTest.java(2 of 3)Call static method getCount using variable nameCall static method getCount using class nameRemove references to objects, JVM will mark them for garbage collectionCall static method gc of class System to indicate that garbage collection should be attempted66OutlineEmployeeTest.java(3 of 3)Call static method getCount67Good Programming Practice 8.1 Invoke every static method by using the class name and a dot (.) to emphasize that the method being called is a static method. 688.11  static Class Members (Cont.)String objects are immutableString concatenation operations actually result in the creation of a new String objectstatic method gc of class SystemIndicates that the garbage collector should make a best-effort attempt to reclaim objects eligible for garbage collectionIt is possible that no objects or only a subset of eligible objects will be collectedstatic methods cannot access non-static class membersAlso cannot use the this reference69Common Programming Error 8.7 A compilation error occurs if a static method calls an instance (non-static) method in the same class by using only the method name. Similarly, a compilation error occurs if a static method attempts to access an instance variable in the same class by using only the variable name.70Referring to this in a static method is a syntax error. Common Programming Error 8.8 718.12  static Import static import declarationsEnables programmers to refer to imported static members as if they were declared in the class that uses themSingle static importimport static packageName.ClassName.staticMemberName;static import on demandimport static packageName.ClassName.*;Imports all static members of the specified class72OutlineStaticImportTest.javastatic import on demandUse Math’s static methods and instance variable without preceding them with Math.73Common Programming Error 8.9 A compilation error occurs if a program attempts to import static methods that have the same signature or static fields that have the same name from two or more classes. 748.13  final Instance Variables Principle of least privilegeCode should have only the privilege and access it needs to accomplish its task, but no morefinal instance variablesKeyword finalSpecifies that a variable is not modifiable (is a constant)final instance variables can be initialized at their declarationIf they are not initialized in their declarations, they must be initialized in all constructors75Declaring an instance variable as final helps enforce the principle of least privilege. If an instance variable should not be modified, declare it to be final to prevent modification.Software Engineering Observation 8.13 76OutlineIncrement.javaDeclare final instance variableInitialize final instance variable inside a constructor77OutlineIncrementTest.javaCreate an Increment objectCall method addIncrementToTotal78Attempting to modify a final instance variable after it is initialized is a compilation error. Common Programming Error 8.10 79Attempts to modify a final instance variable are caught at compilation time rather than causing execution-time errors. It is always preferable to get bugs out at compilation time, if possible, rather than allow them to slip through to execution time (where studies have found that the cost of repair is often many times more expensive). Error-Prevention Tip 8.2 80A final field should also be declared static if it is initialized in its declaration. Once a final field is initialized in its declaration, its value can never change. Therefore, it is not necessary to have a separate copy of the field for every object of the class. Making the field static enables all objects of the class to share the final field. Software Engineering Observation 8.14 81Not initializing a final instance variable in its declaration or in every constructor of the class yields a compilation error indicating that the variable might not have been initialized. The same error occurs if the class initializes the variable in some, but not all, of the class’s constructors. Common Programming Error 8.11 82OutlineIncrement.java838.14  Software Reusability Rapid application developmentSoftware reusability speeds the development of powerful, high-quality softwareJava’s APIprovides an entire framework in which Java developers can work to achieve true reusability and rapid application developmentDocumentation:java.sun.com/javase/6/docs/api/Or to download848.15  Data Abstraction and Encapsulation Data abstractionInformation hidingClasses normally hide the details of their implementation from their clientsAbstract data types (ADTs)Data representationexample: primitive type int is an abstract representation of an integerints are only approximations of integers, can produce arithmetic overflowOperations that can be performed on data85Avoid reinventing the wheel. Study the capabilities of the Java API. If the API contains a class that meets your program’s requirements, use that class rather than create your own. Good Programming Practice 8.2 868.15  Data Abstraction and Encapsulation (Cont.)QueuesSimilar to a “waiting line”Clients place items in the queue (enqueue an item)Clients get items back from the queue (dequeue an item)First-in, first out (FIFO) orderInternal data representation is hiddenClients only see the ability to enqueue and dequeue items87Software Engineering Observation 8.155Programmers create types through the class mechanism. New types can be designed to be as convenient to use as the built-in types. This marks Java as an extensible language. Although the language is easy to extend via new types, the programmer cannot alter the base language itself. 888.16  Time Class Case Study: Creating Packages To declare a reusable classDeclare a public classAdd a package declaration to the source-code filemust be the first executable statement in the filepackage name should consist of your Internet domain name in reverse order followed by other names for the packageexample: com.deitel.jhtp7.ch08package name is part of the fully qualified class nameDistinguishes between multiple classes with the same name belonging to different packagesPrevents name conflict (also called name collision)Class name without package name is the simple name89OutlineTime1.java(1 of 2)package declarationTime1 is a public class so it can be used by importers of this package90OutlineTime1.java(2 of 2)918.16  Time Class Case Study: Creating Packages (Cont.)Compile the class so that it is placed in the appropriate package directory structureExample: our package should be in the directory com deitel jhtp7 ch08javac command-line option –djavac creates appropriate directories based on the class’s package declarationA period (.) after –d represents the current directory928.16  Time Class Case Study: Creating Packages (Cont.)Import the reusable class into a programSingle-type-import declarationImports a single classExample: import java.util.Random;Type-import-on-demand declarationImports all classes in a packageExample: import java.util.*;93Common Programming Error 8.12Using the import declaration import java.*; causes a compilation error. You must specify the exact name of the package from which you want to import classes. 94OutlineTime1PackageTest.java (1 of 2)Single-type import declarationRefer to the Time1 class by its simple name95OutlineTime1PackageTest.java (2 of 2)968.16  Time Class Case Study: Creating Packages (Cont.)Class loaderLocates classes that the compiler needsFirst searches standard Java classes bundled with the JDKThen searches for optional packagesThese are enabled by Java’s extension mechanismFinally searches the classpathList of directories or archive files separated by directory separatorsThese files normally end with .jar or .zipStandard classes are in the archive file rt.jar978.16  Time Class Case Study: Creating Packages (Cont.)To use a classpath other than the current directory-classpath option for the javac compilerSet the CLASSPATH environment variableThe JVM must locate classes just as the compiler doesThe java command can use other classpathes by using the same techniques that the javac command uses98Common Programming Error 8.13Specifying an explicit classpath eliminates the current directory from the classpath. This prevents classes in the current directory (including packages in the current directory) from loading properly. If classes must be loaded from the current directory, include a dot (.) in the classpath to specify the current directory. 99Software Engineering Observation 8.16 In general, it is a better practice to use the -classpath option of the compiler, rather than the CLASSPATH environment variable, to specify the classpath for a program. This enables each application to have its own classpath. 100Error-Prevention Tip 8.3 Specifying the classpath with the CLASSPATH environment variable can cause subtle and difficult-to-locate errors in programs that use different versions of the same package. 1018.17  Package Access Package accessMethods and variables declared without any access modifier are given package accessThis has no effect if the program consists of one classThis does have an effect if the program contains multiple classes from the same packagePackage-access members can be directly accessed through the appropriate references to objects in other classes belonging to the same package102OutlinePackageDataTest.java (1 of 2)Can directly access package-access members103OutlinePackageDataTest.java (2 of 2)Package-access instance variables1048.18  (Optional) GUI and Graphics Case Study: Using Objects with Graphics To create a consistent drawing that remains the same each time it is drawnStore information about the displayed shapes so that they can be reproduced exactly the same way each time paintComponent is called105OutlineMyline.java Instance variables to store coordinates and color for a lineInitialize instance variablesDraw a line in the proper color at the proper coordinates106OutlineDrawPanel.java (1 of 2)Declare a MyLine arrayCreate the MyLine array107OutlineDrawPanel.java (2 of 2)Generate coordinates for this lineGenerate a color for this lineCreate the new MyLine object with the generated attributesDraw each MyLine108OutlineTestDraw.java 1098.19  Starting to Program the Classes of the ATM SystemVisibilityAttributes normally should be private, methods invoked by clients should be publicVisibility markers in UMLA plus sign (+) indicates public visibilityA minus sign (-) indicates private visibilityNavigabilityNavigability arrows indicate in which direction an association can be traversedBidirectional navigabilityAssociations with navigability arrows at both ends or no navigability arrows at all can be traversed in either direction1108.19  Starting to Program the Classes of the ATM System (Cont.)Implementing the ATM system from its UML design (for each class)Declare a public class with the name in the first compartment and an empty no-argument constructorDeclare instance variables based on attributes in the second compartmentDeclare references to other objects based on associations described in the class diagramDeclare the shells of the methods based on the operations in the third compartmentUse the return type void if no return type has been specified111Fig. 8.24 | Class diagram with visibility markers. 112Fig. 8.25 | Class diagram with navigability arrows. 113Outline withdrawal.java Class for WithdrawalEmpty no-argument constructor114Outline withdrawal.java Declare instance variables115Outline withdrawal.java Declare references to other objects116Outline withdrawal.java Declare shell of a method with return type void117Outline withdrawal.java 118

Các file đính kèm theo tài liệu này:

  • pptjavahtp7e_08_6444_1098.ppt
Tài liệu liên quan