[{"data":1,"prerenderedAt":2167},["ShallowReactive",2],{"item-lessons-light-ch07-the-class-blueprint":3,"item-examples-light-ch07-the-class-blueprint":436,"item-exercises-light-ch07-the-class-blueprint":597,"item-lesson-full-ch07-the-class-blueprint-7.3":758,"item-example-full-ch07-the-class-blueprint-7.3":1140,"item-exercise-full-ch07-the-class-blueprint-7.3":1697},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming & Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","Optional: HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Scope and Access","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[437,441,445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593],{"path":438,"title":439,"stem":440},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming & Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":442,"title":443,"stem":444},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","Optional: HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",[598,602,606,610,614,618,622,626,630,634,638,642,646,650,654,658,662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754],{"path":599,"title":600,"stem":601},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming & Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":603,"title":604,"stem":605},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":607,"title":608,"stem":609},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":611,"title":612,"stem":613},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":615,"title":616,"stem":617},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":619,"title":620,"stem":621},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":623,"title":624,"stem":625},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":627,"title":628,"stem":629},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":631,"title":632,"stem":633},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":635,"title":636,"stem":637},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":639,"title":640,"stem":641},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":643,"title":644,"stem":645},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":647,"title":648,"stem":649},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":651,"title":652,"stem":653},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":655,"title":656,"stem":657},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":659,"title":660,"stem":661},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":663,"title":664,"stem":665},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":667,"title":668,"stem":669},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":671,"title":672,"stem":673},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":675,"title":676,"stem":677},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":679,"title":680,"stem":681},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":683,"title":684,"stem":685},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":687,"title":688,"stem":689},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":691,"title":692,"stem":693},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":695,"title":696,"stem":697},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":699,"title":700,"stem":701},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":703,"title":704,"stem":705},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":707,"title":708,"stem":709},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":711,"title":712,"stem":713},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":715,"title":716,"stem":717},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":719,"title":720,"stem":721},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":723,"title":724,"stem":725},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":727,"title":728,"stem":729},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":731,"title":732,"stem":733},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":735,"title":736,"stem":737},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","Optional: HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":739,"title":740,"stem":741},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":743,"title":744,"stem":745},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":747,"title":748,"stem":749},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":751,"title":752,"stem":753},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"id":759,"title":126,"body":760,"description":796,"extension":1134,"meta":1135,"navigation":842,"path":125,"seo":1138,"stem":127,"__hash__":1139},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":761,"value":762,"toc":1125},"minimark",[763,767,772,790,872,876,891,919,931,935,938,974,984,988,995,1018,1033,1036,1040,1047,1051,1085,1089,1110,1121],[764,765,126],"h1",{"id":766},"methods-passing-returning-references-of-an-object",[768,769,771],"h2",{"id":770},"objects-as-instance-variables-has-a","Objects as Instance Variables (Has-A)",[773,774,775,776,780,781,785,786,789],"p",{},"A class's instance variable can itself be an object of another class — a ",[777,778,779],"strong",{},"has-a"," relationship. A ",[782,783,784],"code",{},"Subsystem"," might have a ",[782,787,788],{},"MotorConfig"," (its tuning settings) as an instance variable:",[791,792,797],"pre",{"className":793,"code":794,"language":795,"meta":796,"style":796},"language-java shiki shiki-themes github-light github-dark","class MotorConfig\n{\n    private double rampRate;\n    private int currentLimit;\n    \u002F\u002F constructor, getters, setters not shown\n}\n\nclass Subsystem\n{\n    private String name;\n    private MotorConfig config; \u002F\u002F instance variable of type MotorConfig\n}\n","java","",[782,798,799,807,813,819,825,831,837,844,850,855,861,867],{"__ignoreMap":796},[800,801,804],"span",{"class":802,"line":803},"line",1,[800,805,806],{},"class MotorConfig\n",[800,808,810],{"class":802,"line":809},2,[800,811,812],{},"{\n",[800,814,816],{"class":802,"line":815},3,[800,817,818],{},"    private double rampRate;\n",[800,820,822],{"class":802,"line":821},4,[800,823,824],{},"    private int currentLimit;\n",[800,826,828],{"class":802,"line":827},5,[800,829,830],{},"    \u002F\u002F constructor, getters, setters not shown\n",[800,832,834],{"class":802,"line":833},6,[800,835,836],{},"}\n",[800,838,840],{"class":802,"line":839},7,[800,841,843],{"emptyLinePlaceholder":842},true,"\n",[800,845,847],{"class":802,"line":846},8,[800,848,849],{},"class Subsystem\n",[800,851,853],{"class":802,"line":852},9,[800,854,812],{},[800,856,858],{"class":802,"line":857},10,[800,859,860],{},"    private String name;\n",[800,862,864],{"class":802,"line":863},11,[800,865,866],{},"    private MotorConfig config; \u002F\u002F instance variable of type MotorConfig\n",[800,868,870],{"class":802,"line":869},12,[800,871,836],{},[768,873,875],{"id":874},"call-by-value-for-object-references","Call by Value, for Object References",[773,877,878,879,883,884,886,887,890],{},"Java always uses call by value — but for an object, the ",[880,881,882],"em",{},"value"," being copied is the reference (the pointer to the object), not the object itself. Passing a ",[782,885,788],{}," into a method copies the reference — the parameter and the argument then both point at the ",[880,888,889],{},"same"," object.",[791,892,894],{"className":793,"code":893,"language":795,"meta":796,"style":796},"public Subsystem(String initName, MotorConfig initConfig)\n{\n    name = initName;\n    config = initConfig; \u002F\u002F stores the SAME reference the caller passed in\n}\n",[782,895,896,901,905,910,915],{"__ignoreMap":796},[800,897,898],{"class":802,"line":803},[800,899,900],{},"public Subsystem(String initName, MotorConfig initConfig)\n",[800,902,903],{"class":802,"line":809},[800,904,812],{},[800,906,907],{"class":802,"line":815},[800,908,909],{},"    name = initName;\n",[800,911,912],{"class":802,"line":821},[800,913,914],{},"    config = initConfig; \u002F\u002F stores the SAME reference the caller passed in\n",[800,916,917],{"class":802,"line":827},[800,918,836],{},[773,920,921,922,924,925,927,928,930],{},"If ",[782,923,788],{}," is mutable (has setters), this matters a lot: whoever else holds a reference to that same ",[782,926,788],{}," object can change it, and the ",[782,929,784],{}," sees the change too — because it's not a separate copy, it's the same object viewed from two places.",[768,932,934],{"id":933},"defensive-copying","Defensive Copying",[773,936,937],{},"If you don't want outside code to be able to reach in and change your object's data after the fact, make a copy instead of storing the reference you were handed:",[791,939,941],{"className":793,"code":940,"language":795,"meta":796,"style":796},"public Subsystem(String initName, MotorConfig initConfig)\n{\n    name = initName;\n    \u002F\u002F Defensive copy — a brand new MotorConfig with the same values,\n    \u002F\u002F not the same object\n    config = new MotorConfig(initConfig.getRampRate(), initConfig.getCurrentLimit());\n}\n",[782,942,943,947,951,955,960,965,970],{"__ignoreMap":796},[800,944,945],{"class":802,"line":803},[800,946,900],{},[800,948,949],{"class":802,"line":809},[800,950,812],{},[800,952,953],{"class":802,"line":815},[800,954,909],{},[800,956,957],{"class":802,"line":821},[800,958,959],{},"    \u002F\u002F Defensive copy — a brand new MotorConfig with the same values,\n",[800,961,962],{"class":802,"line":827},[800,963,964],{},"    \u002F\u002F not the same object\n",[800,966,967],{"class":802,"line":833},[800,968,969],{},"    config = new MotorConfig(initConfig.getRampRate(), initConfig.getCurrentLimit());\n",[800,971,972],{"class":802,"line":839},[800,973,836],{},[773,975,976,977,980,981,983],{},"Now changing the original ",[782,978,979],{},"initConfig"," object afterward has zero effect on ",[782,982,784],{},"'s own copy.",[768,985,987],{"id":986},"returning-an-object-reference","Returning an Object Reference",[773,989,990,991,994],{},"The same rule applies in reverse: a method that returns an object returns a reference to the ",[880,992,993],{},"real"," object, not a copy. If that object is mutable, whoever calls the getter can reach in and change it:",[791,996,998],{"className":793,"code":997,"language":795,"meta":796,"style":796},"public MotorConfig getConfig()\n{\n    return config; \u002F\u002F returns the SAME object — caller can mutate it!\n}\n",[782,999,1000,1005,1009,1014],{"__ignoreMap":796},[800,1001,1002],{"class":802,"line":803},[800,1003,1004],{},"public MotorConfig getConfig()\n",[800,1006,1007],{"class":802,"line":809},[800,1008,812],{},[800,1010,1011],{"class":802,"line":815},[800,1012,1013],{},"    return config; \u002F\u002F returns the SAME object — caller can mutate it!\n",[800,1015,1016],{"class":802,"line":821},[800,1017,836],{},[791,1019,1021],{"className":793,"code":1020,"language":795,"meta":796,"style":796},"MotorConfig c = subsystem.getConfig();\nc.setRampRate(0.5); \u002F\u002F this actually changes subsystem's real config!\n",[782,1022,1023,1028],{"__ignoreMap":796},[800,1024,1025],{"class":802,"line":803},[800,1026,1027],{},"MotorConfig c = subsystem.getConfig();\n",[800,1029,1030],{"class":802,"line":809},[800,1031,1032],{},"c.setRampRate(0.5); \u002F\u002F this actually changes subsystem's real config!\n",[773,1034,1035],{},"If that's not what you want, return a defensive copy from the getter too.",[768,1037,1039],{"id":1038},"chaining-method-calls","Chaining Method Calls",[773,1041,1042,1043,1046],{},"Calling a method directly on another method's return value — ",[782,1044,1045],{},"subsystem.getConfig().getRampRate()"," — is called chaining. It only works if you know exactly what type each method in the chain returns, since the next method has to actually exist on that type.",[768,1048,1050],{"id":1049},"common-pitfalls","Common Pitfalls",[1052,1053,1054,1061,1067],"ul",{},[1055,1056,1057,1060],"li",{},[777,1058,1059],{},"Assuming storing a passed-in object automatically makes an independent copy."," It doesn't — only the reference is copied, so the stored object is the exact same one the caller still has.",[1055,1062,1063,1066],{},[777,1064,1065],{},"Returning a mutable instance variable directly from a getter."," This hands the caller a live reference to your object's actual internal state — they can change it without going through any of your class's own methods.",[1055,1068,1069,1072,1073,1076,1077,1080,1081,1084],{},[777,1070,1071],{},"Chaining calls without checking each return type."," ",[782,1074,1075],{},"a.getX().getY()"," only compiles if ",[782,1078,1079],{},"getX()","'s return type actually has a ",[782,1082,1083],{},"getY()"," method.",[768,1086,1088],{"id":1087},"key-takeaways","Key Takeaways",[1052,1090,1091,1094,1101,1104],{},[1055,1092,1093],{},"An object can be another object's instance variable — a \"has-a\" relationship.",[1055,1095,1096,1097,1100],{},"Passing or returning an object copies its ",[880,1098,1099],{},"reference",", not the object itself — both sides then point at the same object.",[1055,1102,1103],{},"If the object is mutable and you don't want outside code able to change it later, make a defensive copy — on the way in (constructor\u002Fsetter) and\u002For on the way out (getter).",[1055,1105,1106,1107,1109],{},"Chaining method calls (",[782,1108,1075],{},") requires knowing exactly what type each call in the chain returns.",[773,1111,1112,1113,1116,1117,1120],{},"Derived from ",[782,1114,1115],{},"csawesome-2026",": ",[782,1118,1119],{},"unit-3-class-creation\u002F3.06-methods-passing-and-returning-references-of-an-object.md"," (CSA 3.6)",[1122,1123,1124],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":796,"searchDepth":809,"depth":809,"links":1126},[1127,1128,1129,1130,1131,1132,1133],{"id":770,"depth":809,"text":771},{"id":874,"depth":809,"text":875},{"id":933,"depth":809,"text":934},{"id":986,"depth":809,"text":987},{"id":1038,"depth":809,"text":1039},{"id":1049,"depth":809,"text":1050},{"id":1087,"depth":809,"text":1088},"md",{"outlineRef":1136,"status":1137},"7.3 — Methods: Passing\u002FReturning References of an Object (CSA 3.6)","new — authored lesson (fuller depth than the teaser slide)",{"title":126,"description":796},"iyrlFMuBM1U5Bwl3IYj1MywCUBQs6nlklLTwmgX1CzU",{"id":1141,"title":555,"body":1142,"description":796,"extension":1134,"meta":1692,"navigation":842,"path":554,"seo":1695,"stem":556,"__hash__":1696},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":761,"value":1143,"toc":1681},[1144,1147,1151,1162,1166,1303,1352,1360,1364,1391,1395,1408,1441,1461,1465,1471,1506,1516,1520,1530,1545,1549,1552,1575,1584,1588,1597,1625,1629,1679],[764,1145,555],{"id":1146},"methods-passing-returning-references-of-an-object-worked-example",[768,1148,1150],{"id":1149},"problem","Problem",[773,1152,1153,1154,1157,1158,1161],{},"A ",[782,1155,1156],{},"Robot"," class has a ",[782,1159,1160],{},"FieldPosition"," (x\u002Fy coordinates on the field, in inches) as its starting position. Show what goes wrong if the constructor and the getter just hand the reference around, then fix both.",[768,1163,1165],{"id":1164},"step-1-the-has-a-relationship","Step 1: The Has-A Relationship",[791,1167,1169],{"className":793,"code":1168,"language":795,"meta":796,"style":796},"class FieldPosition\n{\n    private double xInches;\n    private double yInches;\n\n    public FieldPosition(double initX, double initY)\n    {\n        xInches = initX;\n        yInches = initY;\n    }\n\n    public double getX()\n    {\n        return xInches;\n    }\n\n    public double getY()\n    {\n        return yInches;\n    }\n\n    public void setX(double newX)\n    {\n        xInches = newX;\n    }\n}\n",[782,1170,1171,1176,1180,1185,1190,1194,1199,1204,1209,1214,1219,1223,1228,1233,1239,1244,1249,1255,1260,1266,1271,1276,1282,1287,1293,1298],{"__ignoreMap":796},[800,1172,1173],{"class":802,"line":803},[800,1174,1175],{},"class FieldPosition\n",[800,1177,1178],{"class":802,"line":809},[800,1179,812],{},[800,1181,1182],{"class":802,"line":815},[800,1183,1184],{},"    private double xInches;\n",[800,1186,1187],{"class":802,"line":821},[800,1188,1189],{},"    private double yInches;\n",[800,1191,1192],{"class":802,"line":827},[800,1193,843],{"emptyLinePlaceholder":842},[800,1195,1196],{"class":802,"line":833},[800,1197,1198],{},"    public FieldPosition(double initX, double initY)\n",[800,1200,1201],{"class":802,"line":839},[800,1202,1203],{},"    {\n",[800,1205,1206],{"class":802,"line":846},[800,1207,1208],{},"        xInches = initX;\n",[800,1210,1211],{"class":802,"line":852},[800,1212,1213],{},"        yInches = initY;\n",[800,1215,1216],{"class":802,"line":857},[800,1217,1218],{},"    }\n",[800,1220,1221],{"class":802,"line":863},[800,1222,843],{"emptyLinePlaceholder":842},[800,1224,1225],{"class":802,"line":869},[800,1226,1227],{},"    public double getX()\n",[800,1229,1231],{"class":802,"line":1230},13,[800,1232,1203],{},[800,1234,1236],{"class":802,"line":1235},14,[800,1237,1238],{},"        return xInches;\n",[800,1240,1242],{"class":802,"line":1241},15,[800,1243,1218],{},[800,1245,1247],{"class":802,"line":1246},16,[800,1248,843],{"emptyLinePlaceholder":842},[800,1250,1252],{"class":802,"line":1251},17,[800,1253,1254],{},"    public double getY()\n",[800,1256,1258],{"class":802,"line":1257},18,[800,1259,1203],{},[800,1261,1263],{"class":802,"line":1262},19,[800,1264,1265],{},"        return yInches;\n",[800,1267,1269],{"class":802,"line":1268},20,[800,1270,1218],{},[800,1272,1274],{"class":802,"line":1273},21,[800,1275,843],{"emptyLinePlaceholder":842},[800,1277,1279],{"class":802,"line":1278},22,[800,1280,1281],{},"    public void setX(double newX)\n",[800,1283,1285],{"class":802,"line":1284},23,[800,1286,1203],{},[800,1288,1290],{"class":802,"line":1289},24,[800,1291,1292],{},"        xInches = newX;\n",[800,1294,1296],{"class":802,"line":1295},25,[800,1297,1218],{},[800,1299,1301],{"class":802,"line":1300},26,[800,1302,836],{},[791,1304,1306],{"className":793,"code":1305,"language":795,"meta":796,"style":796},"class Robot\n{\n    private String name;\n    private FieldPosition startingPosition; \u002F\u002F instance variable of type FieldPosition\n\n    public FieldPosition getStartingPosition()\n    {\n        return startingPosition;\n    }\n}\n",[782,1307,1308,1313,1317,1321,1326,1330,1335,1339,1344,1348],{"__ignoreMap":796},[800,1309,1310],{"class":802,"line":803},[800,1311,1312],{},"class Robot\n",[800,1314,1315],{"class":802,"line":809},[800,1316,812],{},[800,1318,1319],{"class":802,"line":815},[800,1320,860],{},[800,1322,1323],{"class":802,"line":821},[800,1324,1325],{},"    private FieldPosition startingPosition; \u002F\u002F instance variable of type FieldPosition\n",[800,1327,1328],{"class":802,"line":827},[800,1329,843],{"emptyLinePlaceholder":842},[800,1331,1332],{"class":802,"line":833},[800,1333,1334],{},"    public FieldPosition getStartingPosition()\n",[800,1336,1337],{"class":802,"line":839},[800,1338,1203],{},[800,1340,1341],{"class":802,"line":846},[800,1342,1343],{},"        return startingPosition;\n",[800,1345,1346],{"class":802,"line":852},[800,1347,1218],{},[800,1349,1350],{"class":802,"line":857},[800,1351,836],{},[773,1353,1354,1356,1357,1359],{},[782,1355,1156],{}," has-a ",[782,1358,1160],{},".",[768,1361,1363],{"id":1362},"step-2-a-constructor-that-just-stores-the-reference","Step 2: A Constructor That Just Stores the Reference",[791,1365,1367],{"className":793,"code":1366,"language":795,"meta":796,"style":796},"public Robot(String initName, FieldPosition initPosition)\n{\n    name = initName;\n    startingPosition = initPosition; \u002F\u002F stores the SAME reference the caller passed in\n}\n",[782,1368,1369,1374,1378,1382,1387],{"__ignoreMap":796},[800,1370,1371],{"class":802,"line":803},[800,1372,1373],{},"public Robot(String initName, FieldPosition initPosition)\n",[800,1375,1376],{"class":802,"line":809},[800,1377,812],{},[800,1379,1380],{"class":802,"line":815},[800,1381,909],{},[800,1383,1384],{"class":802,"line":821},[800,1385,1386],{},"    startingPosition = initPosition; \u002F\u002F stores the SAME reference the caller passed in\n",[800,1388,1389],{"class":802,"line":827},[800,1390,836],{},[768,1392,1394],{"id":1393},"step-3-watch-it-go-wrong","Step 3: Watch It Go Wrong",[773,1396,1397,1398,1401,1402,1404,1405,1407],{},"Java is always call by value — but for an object, the value copied is the reference, not the object. So ",[782,1399,1400],{},"startingPosition"," and whatever ",[782,1403,1160],{}," the caller passed in are the ",[880,1406,889],{}," object:",[791,1409,1411],{"className":793,"code":1410,"language":795,"meta":796,"style":796},"FieldPosition start = new FieldPosition(54.0, 27.0);\nRobot robot = new Robot(\"Shockwave-1622\", start);\n\nstart.setX(0.0); \u002F\u002F caller changes ITS OWN variable...\n\nSystem.out.println(robot.getStartingPosition().getX()); \u002F\u002F ...but this prints 0.0!\n",[782,1412,1413,1418,1423,1427,1432,1436],{"__ignoreMap":796},[800,1414,1415],{"class":802,"line":803},[800,1416,1417],{},"FieldPosition start = new FieldPosition(54.0, 27.0);\n",[800,1419,1420],{"class":802,"line":809},[800,1421,1422],{},"Robot robot = new Robot(\"Shockwave-1622\", start);\n",[800,1424,1425],{"class":802,"line":815},[800,1426,843],{"emptyLinePlaceholder":842},[800,1428,1429],{"class":802,"line":821},[800,1430,1431],{},"start.setX(0.0); \u002F\u002F caller changes ITS OWN variable...\n",[800,1433,1434],{"class":802,"line":827},[800,1435,843],{"emptyLinePlaceholder":842},[800,1437,1438],{"class":802,"line":833},[800,1439,1440],{},"System.out.println(robot.getStartingPosition().getX()); \u002F\u002F ...but this prints 0.0!\n",[773,1442,1443,1444,1447,1448,1450,1451,1453,1454,1456,1457,1460],{},"The robot's \"starting position\" just silently changed, even though nothing ever called a method on ",[782,1445,1446],{},"robot"," itself. That's because ",[782,1449,1446],{},"'s ",[782,1452,1400],{}," was never a separate copy — it's the exact same ",[782,1455,1160],{}," object ",[782,1458,1459],{},"start"," still points to.",[768,1462,1464],{"id":1463},"step-4-fix-the-constructor-with-a-defensive-copy","Step 4: Fix the Constructor With a Defensive Copy",[773,1466,1467,1468,1470],{},"Instead of storing the reference handed in, build a brand-new ",[782,1469,1160],{}," with the same values:",[791,1472,1474],{"className":793,"code":1473,"language":795,"meta":796,"style":796},"public Robot(String initName, FieldPosition initPosition)\n{\n    name = initName;\n    \u002F\u002F Defensive copy — a new FieldPosition with the same values,\n    \u002F\u002F not the same object\n    startingPosition = new FieldPosition(initPosition.getX(), initPosition.getY());\n}\n",[782,1475,1476,1480,1484,1488,1493,1497,1502],{"__ignoreMap":796},[800,1477,1478],{"class":802,"line":803},[800,1479,1373],{},[800,1481,1482],{"class":802,"line":809},[800,1483,812],{},[800,1485,1486],{"class":802,"line":815},[800,1487,909],{},[800,1489,1490],{"class":802,"line":821},[800,1491,1492],{},"    \u002F\u002F Defensive copy — a new FieldPosition with the same values,\n",[800,1494,1495],{"class":802,"line":827},[800,1496,964],{},[800,1498,1499],{"class":802,"line":833},[800,1500,1501],{},"    startingPosition = new FieldPosition(initPosition.getX(), initPosition.getY());\n",[800,1503,1504],{"class":802,"line":839},[800,1505,836],{},[773,1507,1508,1509,980,1511,1513,1514,1359],{},"Now mutating the caller's original ",[782,1510,1459],{},[782,1512,1446],{},"'s own ",[782,1515,1400],{},[768,1517,1519],{"id":1518},"step-5-the-same-problem-is-still-waiting-on-the-way-out","Step 5: The Same Problem Is Still Waiting on the Way Out",[773,1521,1522,1523,1526,1527,1529],{},"The constructor is fixed, but ",[782,1524,1525],{},"getStartingPosition()"," from Step 1 still returns ",[782,1528,1400],{}," directly — a live reference to the robot's real internal object:",[791,1531,1533],{"className":793,"code":1532,"language":795,"meta":796,"style":796},"FieldPosition p = robot.getStartingPosition();\np.setX(999.0); \u002F\u002F this actually changes robot's real startingPosition!\n",[782,1534,1535,1540],{"__ignoreMap":796},[800,1536,1537],{"class":802,"line":803},[800,1538,1539],{},"FieldPosition p = robot.getStartingPosition();\n",[800,1541,1542],{"class":802,"line":809},[800,1543,1544],{},"p.setX(999.0); \u002F\u002F this actually changes robot's real startingPosition!\n",[768,1546,1548],{"id":1547},"step-6-fix-the-getter-too","Step 6: Fix the Getter, Too",[773,1550,1551],{},"Return a copy instead of the real object:",[791,1553,1555],{"className":793,"code":1554,"language":795,"meta":796,"style":796},"public FieldPosition getStartingPosition()\n{\n    return new FieldPosition(startingPosition.getX(), startingPosition.getY());\n}\n",[782,1556,1557,1562,1566,1571],{"__ignoreMap":796},[800,1558,1559],{"class":802,"line":803},[800,1560,1561],{},"public FieldPosition getStartingPosition()\n",[800,1563,1564],{"class":802,"line":809},[800,1565,812],{},[800,1567,1568],{"class":802,"line":815},[800,1569,1570],{},"    return new FieldPosition(startingPosition.getX(), startingPosition.getY());\n",[800,1572,1573],{"class":802,"line":821},[800,1574,836],{},[773,1576,1577,1578,1580,1581,1583],{},"Now neither the constructor nor the getter ever leaks a reference to ",[782,1579,1446],{},"'s actual internal ",[782,1582,1160],{}," — every value that goes in or comes out is a separate copy.",[768,1585,1587],{"id":1586},"step-7-chaining-now-that-the-getter-is-safe","Step 7: Chaining, Now That the Getter Is Safe",[791,1589,1591],{"className":793,"code":1590,"language":795,"meta":796,"style":796},"double startX = robot.getStartingPosition().getX();\n",[782,1592,1593],{"__ignoreMap":796},[800,1594,1595],{"class":802,"line":803},[800,1596,1590],{},[773,1598,1599,1601,1602,1604,1605,1607,1608,1610,1611,1613,1614,1617,1618,1621,1622,1624],{},[782,1600,1525],{}," returns a ",[782,1603,1160],{},", and ",[782,1606,1160],{}," has a ",[782,1609,1079],{}," — so the chain compiles. If ",[782,1612,1525],{}," returned, say, a ",[782,1615,1616],{},"String",", ",[782,1619,1620],{},".getX()"," on the end would fail to compile, since ",[782,1623,1616],{}," has no such method.",[768,1626,1628],{"id":1627},"recap","Recap",[1052,1630,1631,1638,1652,1665],{},[1055,1632,1633,1356,1635,1637],{},[782,1634,1156],{},[782,1636,1160],{}," — an object can be another object's instance variable.",[1055,1639,1640,1641,1643,1644,1646,1647,1649,1650,1359],{},"Passing or returning ",[782,1642,1400],{}," copies its ",[880,1645,1099],{},", not the object — the broken version in Steps 2–3 left ",[782,1648,1446],{}," and the caller pointing at the same ",[782,1651,1160],{},[1055,1653,1654,1655,1657,1658,1661,1662,1664],{},"Because ",[782,1656,1160],{}," is mutable (it has ",[782,1659,1660],{},"setX","), both the constructor and the getter needed a defensive copy so outside code can't reach in and change ",[782,1663,1446],{},"'s real data later.",[1055,1666,1667,1670,1671,1673,1674,1676,1677,1084],{},[782,1668,1669],{},"robot.getStartingPosition().getX()"," is chaining — it only compiles because ",[782,1672,1525],{},"'s return type, ",[782,1675,1160],{},", actually has a ",[782,1678,1079],{},[1122,1680,1124],{},{"title":796,"searchDepth":809,"depth":809,"links":1682},[1683,1684,1685,1686,1687,1688,1689,1690,1691],{"id":1149,"depth":809,"text":1150},{"id":1164,"depth":809,"text":1165},{"id":1362,"depth":809,"text":1363},{"id":1393,"depth":809,"text":1394},{"id":1463,"depth":809,"text":1464},{"id":1518,"depth":809,"text":1519},{"id":1547,"depth":809,"text":1548},{"id":1586,"depth":809,"text":1587},{"id":1627,"depth":809,"text":1628},{"outlineRef":1136,"pairsWith":1693,"status":1694},"[`lessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md`](..\u002F..\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":555,"description":796},"5vBDG1n1UrMqwSEJ1VSsVFieMPI4jC4DyixSR_aNZJY",{"id":1698,"title":716,"body":1699,"description":796,"extension":1134,"meta":2163,"navigation":842,"path":715,"seo":2165,"stem":717,"__hash__":2166},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":761,"value":1700,"toc":2159},[1701,1704,1708,1730,1753,1756,1771,1778,1783,1818,1824,1851,1882,1886,1913,1916,1988,1993,2060,2157],[764,1702,716],{"id":1703},"methods-passing-returning-references-of-an-object-exercises",[768,1705,1707],{"id":1706},"multiple-choice","Multiple Choice",[773,1709,1710,1713,1714,1717,1718,1721,1722,1725,1726,1729],{},[777,1711,1712],{},"Question:"," A ",[782,1715,1716],{},"Locker"," class has a private, mutable instance variable ",[782,1719,1720],{},"combination"," (type ",[782,1723,1724],{},"Combination",", which has a ",[782,1727,1728],{},"setCode"," method), and this getter:",[791,1731,1733],{"className":793,"code":1732,"language":795,"meta":796,"style":796},"public Combination getCombination()\n{\n    return combination;\n}\n",[782,1734,1735,1740,1744,1749],{"__ignoreMap":796},[800,1736,1737],{"class":802,"line":803},[800,1738,1739],{},"public Combination getCombination()\n",[800,1741,1742],{"class":802,"line":809},[800,1743,812],{},[800,1745,1746],{"class":802,"line":815},[800,1747,1748],{},"    return combination;\n",[800,1750,1751],{"class":802,"line":821},[800,1752,836],{},[773,1754,1755],{},"Code elsewhere does:",[791,1757,1759],{"className":793,"code":1758,"language":795,"meta":796,"style":796},"Combination c = myLocker.getCombination();\nc.setCode(1234);\n",[782,1760,1761,1766],{"__ignoreMap":796},[800,1762,1763],{"class":802,"line":803},[800,1764,1765],{},"Combination c = myLocker.getCombination();\n",[800,1767,1768],{"class":802,"line":809},[800,1769,1770],{},"c.setCode(1234);\n",[773,1772,1773,1774,1777],{},"What happens to ",[782,1775,1776],{},"myLocker","'s actual stored combination?",[773,1779,1780],{},[777,1781,1782],{},"Options:",[1052,1784,1785,1802,1809,1815],{},[1055,1786,1787,1788,1791,1792,1794,1795,1798,1799,1801],{},"A. It also changes to code ",[782,1789,1790],{},"1234"," — the getter returned a reference to the real ",[782,1793,1724],{}," object, not a separate copy, so ",[782,1796,1797],{},"c"," and ",[782,1800,1776],{},"'s internal combination are the same object",[1055,1803,1804,1805,1808],{},"B. Nothing changes — ",[782,1806,1807],{},"getCombination()"," always hands back a brand-new copy automatically",[1055,1810,1811,1812,1814],{},"C. It only changes the next time ",[782,1813,1776],{},"'s constructor is called",[1055,1816,1817],{},"D. It's a compile error — you can't call a setter on a value returned from a getter",[773,1819,1820,1823],{},[777,1821,1822],{},"Answer:"," A",[773,1825,1826,1829,1830,1832,1833,1835,1836,1798,1838,1840,1841,1843,1844,1846,1847,1850],{},[777,1827,1828],{},"Why:"," Java is always call by value, but for an object, the value copied is the reference. Returning ",[782,1831,1720],{}," directly hands the caller the ",[880,1834,993],{}," object, not a copy — so ",[782,1837,1797],{},[782,1839,1776],{},"'s internal ",[782,1842,1720],{}," point at the exact same ",[782,1845,1724],{},", and calling ",[782,1848,1849],{},"c.setCode(1234)"," changes the one object both of them see.",[1052,1852,1853,1860,1869],{},[1055,1854,1855,1856,1859],{},"B is wrong — Java never makes a defensive copy automatically; that has to be written explicitly (e.g. ",[782,1857,1858],{},"new Combination(...)","), which this getter doesn't do.",[1055,1861,1862,1863,1865,1866,1868],{},"C is wrong — constructing ",[782,1864,1776],{}," again has nothing to do with it; the change takes effect the instant ",[782,1867,1728],{}," runs.",[1055,1870,1871,1872,1874,1875,1604,1877,1607,1879,1881],{},"D is wrong — this compiles fine. ",[782,1873,1797],{}," has type ",[782,1876,1724],{},[782,1878,1724],{},[782,1880,1728],{}," method, so the call is valid.",[768,1883,1885],{"id":1884},"micro-parsons","Micro-Parsons",[773,1887,1888,1072,1891,1893,1894,1897,1898,1901,1902,1904,1905,1907,1908,1910,1911,1359],{},[777,1889,1890],{},"Problem:",[782,1892,1724],{}," (defined elsewhere) has a constructor ",[782,1895,1896],{},"Combination(int initCode)"," and a method ",[782,1899,1900],{},"getCode()",". These lines, once correctly ordered, form a complete program whose ",[782,1903,1716],{}," class has a constructor that stores a defensive copy of the ",[782,1906,1724],{}," it's given, instead of the original reference, then builds one ",[782,1909,1716],{}," from a fresh ",[782,1912,1724],{},[773,1914,1915],{},"Reorder the fragments below into a working program:",[1052,1917,1918,1924,1930,1936,1942,1948,1954,1960,1966,1972,1977,1983],{},[1055,1919,1920,1921],{},"a. ",[782,1922,1923],{},"        combination = new Combination(initCombination.getCode());",[1055,1925,1926,1927],{},"b. ",[782,1928,1929],{},"public class Locker",[1055,1931,1932,1933],{},"c. ",[782,1934,1935],{},"    }",[1055,1937,1938,1939],{},"d. ",[782,1940,1941],{},"    private Combination combination;",[1055,1943,1944,1945],{},"e. ",[782,1946,1947],{},"    public Locker(Combination initCombination)",[1055,1949,1950,1951],{},"f. ",[782,1952,1953],{},"{",[1055,1955,1956,1957],{},"g. ",[782,1958,1959],{},"    {",[1055,1961,1962,1963],{},"h. ",[782,1964,1965],{},"}",[1055,1967,1968,1969],{},"i. ",[782,1970,1971],{},"    public static void main(String[] args)",[1055,1973,1974,1975],{},"j. ",[782,1976,1959],{},[1055,1978,1979,1980],{},"k. ",[782,1981,1982],{},"        Locker locker = new Locker(new Combination(1234));",[1055,1984,1985,1986],{},"l. ",[782,1987,1935],{},[773,1989,1990,1992],{},[777,1991,1822],{}," b, f, d, e, g, a, c, i, j, k, l, h",[791,1994,1996],{"className":793,"code":1995,"language":795,"meta":796,"style":796},"public class Locker\n{\n    private Combination combination;\n\n    public Locker(Combination initCombination)\n    {\n        combination = new Combination(initCombination.getCode());\n    }\n\n    public static void main(String[] args)\n    {\n        Locker locker = new Locker(new Combination(1234));\n    }\n}\n",[782,1997,1998,2003,2007,2012,2016,2021,2025,2030,2034,2038,2043,2047,2052,2056],{"__ignoreMap":796},[800,1999,2000],{"class":802,"line":803},[800,2001,2002],{},"public class Locker\n",[800,2004,2005],{"class":802,"line":809},[800,2006,812],{},[800,2008,2009],{"class":802,"line":815},[800,2010,2011],{},"    private Combination combination;\n",[800,2013,2014],{"class":802,"line":821},[800,2015,843],{"emptyLinePlaceholder":842},[800,2017,2018],{"class":802,"line":827},[800,2019,2020],{},"    public Locker(Combination initCombination)\n",[800,2022,2023],{"class":802,"line":833},[800,2024,1203],{},[800,2026,2027],{"class":802,"line":839},[800,2028,2029],{},"        combination = new Combination(initCombination.getCode());\n",[800,2031,2032],{"class":802,"line":846},[800,2033,1218],{},[800,2035,2036],{"class":802,"line":852},[800,2037,843],{"emptyLinePlaceholder":842},[800,2039,2040],{"class":802,"line":857},[800,2041,2042],{},"    public static void main(String[] args)\n",[800,2044,2045],{"class":802,"line":863},[800,2046,1203],{},[800,2048,2049],{"class":802,"line":869},[800,2050,2051],{},"        Locker locker = new Locker(new Combination(1234));\n",[800,2053,2054],{"class":802,"line":1230},[800,2055,1218],{},[800,2057,2058],{"class":802,"line":1235},[800,2059,836],{},[773,2061,2062,2065,2066,2069,2070,2073,2074,2077,2078,2081,2082,2085,2086,2089,2090,1072,2093,2095,2096,2099,2100,2103,2104,2106,2107,2110,2111,2114,2115,2118,2119,2089,2122,2124,2125,2127,2128,2130,2131,2134,2135,2138,2139,2141,2142,2144,2145,2147,2148,2141,2150,2144,2152,2154,2155,1359],{},[777,2063,2064],{},"Why this order:"," The class declaration (",[782,2067,2068],{},"b",") and its opening brace (",[782,2071,2072],{},"f",") come first, followed by the instance variable (",[782,2075,2076],{},"d",") — declared before the constructor, per the usual order. The constructor's signature (",[782,2079,2080],{},"e",") and its own opening brace (",[782,2083,2084],{},"g",") come next. Inside, the key line (",[782,2087,2088],{},"a",") builds a ",[880,2091,2092],{},"brand-new",[782,2094,1724],{}," from the passed-in one's own code (",[782,2097,2098],{},"initCombination.getCode()","), rather than storing ",[782,2101,2102],{},"initCombination"," itself — that's the defensive copy. The constructor's body then closes (",[782,2105,1797],{},"), and ",[782,2108,2109],{},"main"," (",[782,2112,2113],{},"i",") is declared next with its own opening brace (",[782,2116,2117],{},"j","); inside it, the single statement (",[782,2120,2121],{},"k",[782,2123,1724],{}," and immediately hands it to a new ",[782,2126,1716],{},", exercising the defensive-copy constructor. Finally, the braces close in reverse: ",[782,2129,2109],{},"'s body (",[782,2132,2133],{},"l","), then the class's body (",[782,2136,2137],{},"h","). Note that ",[782,2140,2084],{},"\u002F",[782,2143,2117],{}," (both a bare four-space ",[782,2146,1953],{},") and ",[782,2149,1797],{},[782,2151,2133],{},[782,2153,1965],{},") are textually identical — interchangeable copies at the same nesting depth, one pair per block, so it doesn't matter which physical copy lands in which slot as long as one opens the constructor and one opens ",[782,2156,2109],{},[1122,2158,1124],{},{"title":796,"searchDepth":809,"depth":809,"links":2160},[2161,2162],{"id":1706,"depth":809,"text":1707},{"id":1884,"depth":809,"text":1885},{"outlineRef":1136,"pairsWith":1693,"status":2164},"new — authored exercises (Multiple Choice + Micro-Parsons)",{"title":716,"description":796},"_1sZxt2mN2vcis_RMllLqu45Lf5tiB58QnUvAhrP92s",1790274944324]