[{"data":1,"prerenderedAt":3741},["ShallowReactive",2],{"item-lessons-light-ch07-the-class-blueprint":3,"item-examples-light-ch07-the-class-blueprint":444,"item-exercises-light-ch07-the-class-blueprint":753,"item-lesson-full-ch07-the-class-blueprint-7.3":1070,"item-example-full-ch07-the-class-blueprint-7.3":1579,"item-exercise-full-ch07-the-class-blueprint-7.3":2133},[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,436,440],{"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 and 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\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\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":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\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":97,"title":98,"stem":99},"\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":101,"title":102,"stem":103},"\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":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\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":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\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":125,"title":126,"stem":127},"\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":129,"title":130,"stem":131},"\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":133,"title":134,"stem":135},"\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":137,"title":138,"stem":139},"\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":141,"title":142,"stem":143},"\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":145,"title":146,"stem":147},"\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":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\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":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\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":169,"title":170,"stem":171},"\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":173,"title":174,"stem":175},"\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":177,"title":178,"stem":179},"\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":181,"title":182,"stem":183},"\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":185,"title":186,"stem":187},"\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":189,"title":190,"stem":191},"\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":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\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":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\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":209,"title":210,"stem":211},"\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":213,"title":214,"stem":215},"\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":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\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":245,"title":246,"stem":247},"\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":249,"title":250,"stem":251},"\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":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\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":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\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":269,"title":270,"stem":271},"\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":273,"title":274,"stem":275},"\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":277,"title":278,"stem":279},"\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":281,"title":282,"stem":283},"\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":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\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":293,"title":294,"stem":295},"\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":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\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":305,"title":306,"stem":307},"\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":309,"title":310,"stem":311},"\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":313,"title":314,"stem":315},"\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":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\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":325,"title":326,"stem":327},"\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":329,"title":330,"stem":331},"\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":333,"title":334,"stem":335},"\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":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\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":353,"title":354,"stem":355},"\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":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\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":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\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":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\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":393,"title":394,"stem":395},"\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":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\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":405,"title":406,"stem":407},"\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":409,"title":410,"stem":411},"\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":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\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",[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,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\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":454,"title":455,"stem":456},"\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":458,"title":459,"stem":460},"\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":462,"title":463,"stem":464},"\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":466,"title":467,"stem":468},"\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":470,"title":471,"stem":472},"\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":474,"title":475,"stem":476},"\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":478,"title":479,"stem":480},"\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":482,"title":483,"stem":484},"\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":486,"title":487,"stem":488},"\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":490,"title":491,"stem":492},"\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":494,"title":495,"stem":496},"\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":498,"title":499,"stem":500},"\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":502,"title":503,"stem":504},"\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":506,"title":507,"stem":508},"\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":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\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":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\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":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\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":534,"title":535,"stem":536},"\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":538,"title":539,"stem":540},"\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":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\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":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\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":562,"title":563,"stem":564},"\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":566,"title":567,"stem":568},"\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":570,"title":571,"stem":572},"\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":574,"title":575,"stem":576},"\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":578,"title":579,"stem":580},"\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":582,"title":583,"stem":584},"\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":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\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":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\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":606,"title":607,"stem":608},"\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",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\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":763,"title":764,"stem":765},"\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":767,"title":768,"stem":769},"\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":771,"title":772,"stem":773},"\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":775,"title":776,"stem":777},"\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":779,"title":780,"stem":781},"\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":783,"title":784,"stem":785},"\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":787,"title":788,"stem":789},"\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":791,"title":792,"stem":793},"\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":795,"title":796,"stem":797},"\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":799,"title":800,"stem":801},"\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":803,"title":804,"stem":805},"\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":807,"title":808,"stem":809},"\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":811,"title":812,"stem":813},"\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":815,"title":816,"stem":817},"\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":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\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":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\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":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\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":843,"title":844,"stem":845},"\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":847,"title":848,"stem":849},"\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":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\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":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\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":871,"title":872,"stem":873},"\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":875,"title":876,"stem":877},"\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":879,"title":880,"stem":881},"\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":883,"title":884,"stem":885},"\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":887,"title":888,"stem":889},"\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":891,"title":892,"stem":893},"\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":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\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":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\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":915,"title":916,"stem":917},"\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",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":130,"body":1072,"description":1108,"extension":1573,"meta":1574,"navigation":1154,"path":129,"seo":1577,"stem":131,"__hash__":1578},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":1073,"value":1074,"toc":1564},"minimark",[1075,1079,1084,1102,1184,1243,1247,1261,1289,1301,1305,1308,1344,1354,1393,1397,1404,1427,1442,1445,1449,1474,1478,1512,1516,1549,1560],[1076,1077,130],"h1",{"id":1078},"methods-passing-returning-references-of-an-object",[1080,1081,1083],"h2",{"id":1082},"objects-as-instance-variables-has-a","Objects as Instance Variables (Has-A)",[1085,1086,1087,1088,1092,1093,1097,1098,1101],"p",{},"A class's instance variable can itself be an object of another class — a ",[1089,1090,1091],"strong",{},"has-a"," relationship. A ",[1094,1095,1096],"code",{},"Subsystem"," might have a ",[1094,1099,1100],{},"MotorConfig"," (its tuning settings) as an instance variable:",[1103,1104,1109],"pre",{"className":1105,"code":1106,"language":1107,"meta":1108,"style":1108},"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","",[1094,1110,1111,1119,1125,1131,1137,1143,1149,1156,1162,1167,1173,1179],{"__ignoreMap":1108},[1112,1113,1116],"span",{"class":1114,"line":1115},"line",1,[1112,1117,1118],{},"class MotorConfig\n",[1112,1120,1122],{"class":1114,"line":1121},2,[1112,1123,1124],{},"{\n",[1112,1126,1128],{"class":1114,"line":1127},3,[1112,1129,1130],{},"    private double rampRate;\n",[1112,1132,1134],{"class":1114,"line":1133},4,[1112,1135,1136],{},"    private int currentLimit;\n",[1112,1138,1140],{"class":1114,"line":1139},5,[1112,1141,1142],{},"    \u002F\u002F constructor, getters, setters not shown\n",[1112,1144,1146],{"class":1114,"line":1145},6,[1112,1147,1148],{},"}\n",[1112,1150,1152],{"class":1114,"line":1151},7,[1112,1153,1155],{"emptyLinePlaceholder":1154},true,"\n",[1112,1157,1159],{"class":1114,"line":1158},8,[1112,1160,1161],{},"class Subsystem\n",[1112,1163,1165],{"class":1114,"line":1164},9,[1112,1166,1124],{},[1112,1168,1170],{"class":1114,"line":1169},10,[1112,1171,1172],{},"    private String name;\n",[1112,1174,1176],{"class":1114,"line":1175},11,[1112,1177,1178],{},"    private MotorConfig config; \u002F\u002F instance variable of type MotorConfig\n",[1112,1180,1182],{"class":1114,"line":1181},12,[1112,1183,1148],{},[1185,1186,1187],"blockquote",{},[1085,1188,1189,1196,1197,1200,1201,1203,1204,1206,1207,1209,1210,1213,1214,1216,1217,1219,1220,1223,1224,1227,1228,1231,1232,1235,1236,1239,1240,1242],{},[1089,1190,1191,1192,1195],{},"One ",[1094,1193,1194],{},"public"," class per file."," A ",[1094,1198,1199],{},".java"," file can hold several classes (like ",[1094,1202,1100],{}," and ",[1094,1205,1096],{}," above), but at most one of them can be ",[1094,1208,1194],{},", and (with a normal ",[1094,1211,1212],{},"javac"," compile) a ",[1094,1215,1194],{}," class's name must match the file name exactly (",[1094,1218,1096],{}," must live in ",[1094,1221,1222],{},"Subsystem.java",") — that's a compile error otherwise, not just a style rule. A class with no modifier at all (like both shown here) is fine too — see 7.4 for what that means for access. When a file has a ",[1094,1225,1226],{},"main"," method, put the class containing it ",[1089,1229,1230],{},"first"," in the file: running it directly with ",[1094,1233,1234],{},"java File.java"," (no separate compile step, 1.2) runs the ",[1237,1238,1230],"em",{}," class's ",[1094,1241,1226],{},", not necessarily the one matching the file name — true on both Java 25 and Java 17, so this one rule covers both.",[1080,1244,1246],{"id":1245},"call-by-value-for-object-references","Call by Value, for Object References",[1085,1248,1249,1250,1253,1254,1256,1257,1260],{},"Java always uses call by value — but for an object, the ",[1237,1251,1252],{},"value"," being copied is the reference (the pointer to the object), not the object itself. Passing a ",[1094,1255,1100],{}," into a method copies the reference — the parameter and the argument then both point at the ",[1237,1258,1259],{},"same"," object.",[1103,1262,1264],{"className":1105,"code":1263,"language":1107,"meta":1108,"style":1108},"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",[1094,1265,1266,1271,1275,1280,1285],{"__ignoreMap":1108},[1112,1267,1268],{"class":1114,"line":1115},[1112,1269,1270],{},"public Subsystem(String initName, MotorConfig initConfig)\n",[1112,1272,1273],{"class":1114,"line":1121},[1112,1274,1124],{},[1112,1276,1277],{"class":1114,"line":1127},[1112,1278,1279],{},"    name = initName;\n",[1112,1281,1282],{"class":1114,"line":1133},[1112,1283,1284],{},"    config = initConfig; \u002F\u002F stores the SAME reference the caller passed in\n",[1112,1286,1287],{"class":1114,"line":1139},[1112,1288,1148],{},[1085,1290,1291,1292,1294,1295,1297,1298,1300],{},"If ",[1094,1293,1100],{}," is mutable (has setters), this matters a lot: whoever else holds a reference to that same ",[1094,1296,1100],{}," object can change it, and the ",[1094,1299,1096],{}," sees the change too — because it's not a separate copy, it's the same object viewed from two places.",[1080,1302,1304],{"id":1303},"defensive-copying","Defensive Copying",[1085,1306,1307],{},"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:",[1103,1309,1311],{"className":1105,"code":1310,"language":1107,"meta":1108,"style":1108},"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",[1094,1312,1313,1317,1321,1325,1330,1335,1340],{"__ignoreMap":1108},[1112,1314,1315],{"class":1114,"line":1115},[1112,1316,1270],{},[1112,1318,1319],{"class":1114,"line":1121},[1112,1320,1124],{},[1112,1322,1323],{"class":1114,"line":1127},[1112,1324,1279],{},[1112,1326,1327],{"class":1114,"line":1133},[1112,1328,1329],{},"    \u002F\u002F Defensive copy — a brand new MotorConfig with the same values,\n",[1112,1331,1332],{"class":1114,"line":1139},[1112,1333,1334],{},"    \u002F\u002F not the same object\n",[1112,1336,1337],{"class":1114,"line":1145},[1112,1338,1339],{},"    config = new MotorConfig(initConfig.getRampRate(), initConfig.getCurrentLimit());\n",[1112,1341,1342],{"class":1114,"line":1151},[1112,1343,1148],{},[1085,1345,1346,1347,1350,1351,1353],{},"Now changing the original ",[1094,1348,1349],{},"initConfig"," object afterward has zero effect on ",[1094,1352,1096],{},"'s own copy.",[1085,1355,1356,1357,1360,1361,1364,1365,1367,1368,1371,1372,1374,1375,1378,1379,1382,1383,1386,1387,1389,1390,1392],{},"Notice ",[1094,1358,1359],{},"name"," (a ",[1094,1362,1363],{},"String",") needed no defensive copy above — ",[1094,1366,1363],{}," is immutable (Ch.6), so there's no \"reaching in and changing it later\" to defend against; only a ",[1237,1369,1370],{},"mutable"," object reference (like ",[1094,1373,1100],{},", which has setters) needs one. Also watch for a ",[1094,1376,1377],{},"null"," argument: ",[1094,1380,1381],{},"initConfig.getRampRate()"," throws a ",[1094,1384,1385],{},"NullPointerException"," if ",[1094,1388,1349],{}," itself is ",[1094,1391,1377],{}," — a defensive copy still has to handle (or explicitly rule out) that case.",[1080,1394,1396],{"id":1395},"returning-an-object-reference","Returning an Object Reference",[1085,1398,1399,1400,1403],{},"The same rule applies in reverse: a method that returns an object returns a reference to the ",[1237,1401,1402],{},"real"," object, not a copy. If that object is mutable, whoever calls the getter can reach in and change it:",[1103,1405,1407],{"className":1105,"code":1406,"language":1107,"meta":1108,"style":1108},"public MotorConfig getConfig()\n{\n    return config; \u002F\u002F returns the SAME object — caller can mutate it!\n}\n",[1094,1408,1409,1414,1418,1423],{"__ignoreMap":1108},[1112,1410,1411],{"class":1114,"line":1115},[1112,1412,1413],{},"public MotorConfig getConfig()\n",[1112,1415,1416],{"class":1114,"line":1121},[1112,1417,1124],{},[1112,1419,1420],{"class":1114,"line":1127},[1112,1421,1422],{},"    return config; \u002F\u002F returns the SAME object — caller can mutate it!\n",[1112,1424,1425],{"class":1114,"line":1133},[1112,1426,1148],{},[1103,1428,1430],{"className":1105,"code":1429,"language":1107,"meta":1108,"style":1108},"MotorConfig c = subsystem.getConfig();\nc.setRampRate(0.5); \u002F\u002F this actually changes subsystem's real config!\n",[1094,1431,1432,1437],{"__ignoreMap":1108},[1112,1433,1434],{"class":1114,"line":1115},[1112,1435,1436],{},"MotorConfig c = subsystem.getConfig();\n",[1112,1438,1439],{"class":1114,"line":1121},[1112,1440,1441],{},"c.setRampRate(0.5); \u002F\u002F this actually changes subsystem's real config!\n",[1085,1443,1444],{},"If that's not what you want, return a defensive copy from the getter too.",[1080,1446,1448],{"id":1447},"chaining-method-calls","Chaining Method Calls",[1085,1450,1451,1452,1455,1456,1459,1460,1463,1464,1466,1467,1469,1470,1473],{},"Calling a method directly on another method's return value — ",[1094,1453,1454],{},"subsystem.getConfig().getRampRate()"," — is called chaining. It only compiles if the first call's ",[1237,1457,1458],{},"declared return type"," actually has the second method — ",[1094,1461,1462],{},"getConfig()","'s return type is ",[1094,1465,1100],{},", and ",[1094,1468,1100],{}," has a ",[1094,1471,1472],{},"getRampRate()",", so the chain is valid; the compiler checks this, not the programmer.",[1080,1475,1477],{"id":1476},"common-pitfalls","Common Pitfalls",[1479,1480,1481,1488,1494],"ul",{},[1482,1483,1484,1487],"li",{},[1089,1485,1486],{},"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.",[1482,1489,1490,1493],{},[1089,1491,1492],{},"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.",[1482,1495,1496,1499,1500,1503,1504,1507,1508,1511],{},[1089,1497,1498],{},"Chaining calls without checking each return type."," ",[1094,1501,1502],{},"a.getX().getY()"," only compiles if ",[1094,1505,1506],{},"getX()","'s return type actually has a ",[1094,1509,1510],{},"getY()"," method.",[1080,1513,1515],{"id":1514},"key-takeaways","Key Takeaways",[1479,1517,1518,1521,1528,1531,1537],{},[1482,1519,1520],{},"An object can be another object's instance variable — a \"has-a\" relationship.",[1482,1522,1523,1524,1527],{},"Passing or returning an object copies its ",[1237,1525,1526],{},"reference",", not the object itself — both sides then point at the same object.",[1482,1529,1530],{},"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).",[1482,1532,1533,1534,1536],{},"Chaining method calls (",[1094,1535,1502],{},") compiles only if each call's declared return type actually has the next method in the chain.",[1482,1538,1539,1540,1542,1543,1545,1546,1548],{},"A file can hold several classes but only one ",[1094,1541,1194],{}," one; put the class with ",[1094,1544,1226],{}," first so ",[1094,1547,1234],{}," runs it, on both Java 25 and Java 17.",[1085,1550,1551,1552,1555,1556,1559],{},"Derived from ",[1094,1553,1554],{},"csawesome-2026",": ",[1094,1557,1558],{},"unit-3-class-creation\u002F3.06-methods-passing-and-returning-references-of-an-object.md"," (CSA 3.6)",[1561,1562,1563],"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":1108,"searchDepth":1121,"depth":1121,"links":1565},[1566,1567,1568,1569,1570,1571,1572],{"id":1082,"depth":1121,"text":1083},{"id":1245,"depth":1121,"text":1246},{"id":1303,"depth":1121,"text":1304},{"id":1395,"depth":1121,"text":1396},{"id":1447,"depth":1121,"text":1448},{"id":1476,"depth":1121,"text":1477},{"id":1514,"depth":1121,"text":1515},"md",{"outlineRef":1575,"status":1576},"7.3 — Methods: Passing\u002FReturning References of an Object (CSA 3.6)","new — authored lesson (fuller depth than the teaser slide)",{"title":130,"description":1108},"hw1wxncdiWxKfw0EVC3lylRKbhmw3nxoSbMZ8OoFCHc",{"id":1580,"title":567,"body":1581,"description":1108,"extension":1573,"meta":2128,"navigation":1154,"path":566,"seo":2131,"stem":568,"__hash__":2132},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":1073,"value":1582,"toc":2117},[1583,1586,1590,1601,1605,1742,1791,1799,1803,1830,1834,1847,1880,1900,1904,1910,1945,1955,1959,1969,1984,1988,1991,2014,2023,2027,2036,2061,2065,2115],[1076,1584,567],{"id":1585},"methods-passing-returning-references-of-an-object-worked-example",[1080,1587,1589],{"id":1588},"problem","Problem",[1085,1591,1592,1593,1596,1597,1600],{},"A ",[1094,1594,1595],{},"Robot"," class has a ",[1094,1598,1599],{},"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.",[1080,1602,1604],{"id":1603},"step-1-the-has-a-relationship","Step 1: The Has-A Relationship",[1103,1606,1608],{"className":1105,"code":1607,"language":1107,"meta":1108,"style":1108},"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",[1094,1609,1610,1615,1619,1624,1629,1633,1638,1643,1648,1653,1658,1662,1667,1672,1678,1683,1688,1694,1699,1705,1710,1715,1721,1726,1732,1737],{"__ignoreMap":1108},[1112,1611,1612],{"class":1114,"line":1115},[1112,1613,1614],{},"class FieldPosition\n",[1112,1616,1617],{"class":1114,"line":1121},[1112,1618,1124],{},[1112,1620,1621],{"class":1114,"line":1127},[1112,1622,1623],{},"    private double xInches;\n",[1112,1625,1626],{"class":1114,"line":1133},[1112,1627,1628],{},"    private double yInches;\n",[1112,1630,1631],{"class":1114,"line":1139},[1112,1632,1155],{"emptyLinePlaceholder":1154},[1112,1634,1635],{"class":1114,"line":1145},[1112,1636,1637],{},"    public FieldPosition(double initX, double initY)\n",[1112,1639,1640],{"class":1114,"line":1151},[1112,1641,1642],{},"    {\n",[1112,1644,1645],{"class":1114,"line":1158},[1112,1646,1647],{},"        xInches = initX;\n",[1112,1649,1650],{"class":1114,"line":1164},[1112,1651,1652],{},"        yInches = initY;\n",[1112,1654,1655],{"class":1114,"line":1169},[1112,1656,1657],{},"    }\n",[1112,1659,1660],{"class":1114,"line":1175},[1112,1661,1155],{"emptyLinePlaceholder":1154},[1112,1663,1664],{"class":1114,"line":1181},[1112,1665,1666],{},"    public double getX()\n",[1112,1668,1670],{"class":1114,"line":1669},13,[1112,1671,1642],{},[1112,1673,1675],{"class":1114,"line":1674},14,[1112,1676,1677],{},"        return xInches;\n",[1112,1679,1681],{"class":1114,"line":1680},15,[1112,1682,1657],{},[1112,1684,1686],{"class":1114,"line":1685},16,[1112,1687,1155],{"emptyLinePlaceholder":1154},[1112,1689,1691],{"class":1114,"line":1690},17,[1112,1692,1693],{},"    public double getY()\n",[1112,1695,1697],{"class":1114,"line":1696},18,[1112,1698,1642],{},[1112,1700,1702],{"class":1114,"line":1701},19,[1112,1703,1704],{},"        return yInches;\n",[1112,1706,1708],{"class":1114,"line":1707},20,[1112,1709,1657],{},[1112,1711,1713],{"class":1114,"line":1712},21,[1112,1714,1155],{"emptyLinePlaceholder":1154},[1112,1716,1718],{"class":1114,"line":1717},22,[1112,1719,1720],{},"    public void setX(double newX)\n",[1112,1722,1724],{"class":1114,"line":1723},23,[1112,1725,1642],{},[1112,1727,1729],{"class":1114,"line":1728},24,[1112,1730,1731],{},"        xInches = newX;\n",[1112,1733,1735],{"class":1114,"line":1734},25,[1112,1736,1657],{},[1112,1738,1740],{"class":1114,"line":1739},26,[1112,1741,1148],{},[1103,1743,1745],{"className":1105,"code":1744,"language":1107,"meta":1108,"style":1108},"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",[1094,1746,1747,1752,1756,1760,1765,1769,1774,1778,1783,1787],{"__ignoreMap":1108},[1112,1748,1749],{"class":1114,"line":1115},[1112,1750,1751],{},"class Robot\n",[1112,1753,1754],{"class":1114,"line":1121},[1112,1755,1124],{},[1112,1757,1758],{"class":1114,"line":1127},[1112,1759,1172],{},[1112,1761,1762],{"class":1114,"line":1133},[1112,1763,1764],{},"    private FieldPosition startingPosition; \u002F\u002F instance variable of type FieldPosition\n",[1112,1766,1767],{"class":1114,"line":1139},[1112,1768,1155],{"emptyLinePlaceholder":1154},[1112,1770,1771],{"class":1114,"line":1145},[1112,1772,1773],{},"    public FieldPosition getStartingPosition()\n",[1112,1775,1776],{"class":1114,"line":1151},[1112,1777,1642],{},[1112,1779,1780],{"class":1114,"line":1158},[1112,1781,1782],{},"        return startingPosition;\n",[1112,1784,1785],{"class":1114,"line":1164},[1112,1786,1657],{},[1112,1788,1789],{"class":1114,"line":1169},[1112,1790,1148],{},[1085,1792,1793,1795,1796,1798],{},[1094,1794,1595],{}," has-a ",[1094,1797,1599],{},".",[1080,1800,1802],{"id":1801},"step-2-a-constructor-that-just-stores-the-reference","Step 2: A Constructor That Just Stores the Reference",[1103,1804,1806],{"className":1105,"code":1805,"language":1107,"meta":1108,"style":1108},"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",[1094,1807,1808,1813,1817,1821,1826],{"__ignoreMap":1108},[1112,1809,1810],{"class":1114,"line":1115},[1112,1811,1812],{},"public Robot(String initName, FieldPosition initPosition)\n",[1112,1814,1815],{"class":1114,"line":1121},[1112,1816,1124],{},[1112,1818,1819],{"class":1114,"line":1127},[1112,1820,1279],{},[1112,1822,1823],{"class":1114,"line":1133},[1112,1824,1825],{},"    startingPosition = initPosition; \u002F\u002F stores the SAME reference the caller passed in\n",[1112,1827,1828],{"class":1114,"line":1139},[1112,1829,1148],{},[1080,1831,1833],{"id":1832},"step-3-watch-it-go-wrong","Step 3: Watch It Go Wrong",[1085,1835,1836,1837,1840,1841,1843,1844,1846],{},"Java is always call by value — but for an object, the value copied is the reference, not the object. So ",[1094,1838,1839],{},"startingPosition"," and whatever ",[1094,1842,1599],{}," the caller passed in are the ",[1237,1845,1259],{}," object:",[1103,1848,1850],{"className":1105,"code":1849,"language":1107,"meta":1108,"style":1108},"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",[1094,1851,1852,1857,1862,1866,1871,1875],{"__ignoreMap":1108},[1112,1853,1854],{"class":1114,"line":1115},[1112,1855,1856],{},"FieldPosition start = new FieldPosition(54.0, 27.0);\n",[1112,1858,1859],{"class":1114,"line":1121},[1112,1860,1861],{},"Robot robot = new Robot(\"Shockwave-1622\", start);\n",[1112,1863,1864],{"class":1114,"line":1127},[1112,1865,1155],{"emptyLinePlaceholder":1154},[1112,1867,1868],{"class":1114,"line":1133},[1112,1869,1870],{},"start.setX(0.0); \u002F\u002F caller changes ITS OWN variable...\n",[1112,1872,1873],{"class":1114,"line":1139},[1112,1874,1155],{"emptyLinePlaceholder":1154},[1112,1876,1877],{"class":1114,"line":1145},[1112,1878,1879],{},"System.out.println(robot.getStartingPosition().getX()); \u002F\u002F ...but this prints 0.0!\n",[1085,1881,1882,1883,1886,1887,1889,1890,1892,1893,1895,1896,1899],{},"The robot's \"starting position\" just silently changed, even though nothing ever called a method on ",[1094,1884,1885],{},"robot"," itself. That's because ",[1094,1888,1885],{},"'s ",[1094,1891,1839],{}," was never a separate copy — it's the exact same ",[1094,1894,1599],{}," object ",[1094,1897,1898],{},"start"," still points to.",[1080,1901,1903],{"id":1902},"step-4-fix-the-constructor-with-a-defensive-copy","Step 4: Fix the Constructor With a Defensive Copy",[1085,1905,1906,1907,1909],{},"Instead of storing the reference handed in, build a brand-new ",[1094,1908,1599],{}," with the same values:",[1103,1911,1913],{"className":1105,"code":1912,"language":1107,"meta":1108,"style":1108},"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",[1094,1914,1915,1919,1923,1927,1932,1936,1941],{"__ignoreMap":1108},[1112,1916,1917],{"class":1114,"line":1115},[1112,1918,1812],{},[1112,1920,1921],{"class":1114,"line":1121},[1112,1922,1124],{},[1112,1924,1925],{"class":1114,"line":1127},[1112,1926,1279],{},[1112,1928,1929],{"class":1114,"line":1133},[1112,1930,1931],{},"    \u002F\u002F Defensive copy — a new FieldPosition with the same values,\n",[1112,1933,1934],{"class":1114,"line":1139},[1112,1935,1334],{},[1112,1937,1938],{"class":1114,"line":1145},[1112,1939,1940],{},"    startingPosition = new FieldPosition(initPosition.getX(), initPosition.getY());\n",[1112,1942,1943],{"class":1114,"line":1151},[1112,1944,1148],{},[1085,1946,1947,1948,1350,1950,1952,1953,1798],{},"Now mutating the caller's original ",[1094,1949,1898],{},[1094,1951,1885],{},"'s own ",[1094,1954,1839],{},[1080,1956,1958],{"id":1957},"step-5-the-same-problem-is-still-waiting-on-the-way-out","Step 5: The Same Problem Is Still Waiting on the Way Out",[1085,1960,1961,1962,1965,1966,1968],{},"The constructor is fixed, but ",[1094,1963,1964],{},"getStartingPosition()"," from Step 1 still returns ",[1094,1967,1839],{}," directly — a live reference to the robot's real internal object:",[1103,1970,1972],{"className":1105,"code":1971,"language":1107,"meta":1108,"style":1108},"FieldPosition p = robot.getStartingPosition();\np.setX(999.0); \u002F\u002F this actually changes robot's real startingPosition!\n",[1094,1973,1974,1979],{"__ignoreMap":1108},[1112,1975,1976],{"class":1114,"line":1115},[1112,1977,1978],{},"FieldPosition p = robot.getStartingPosition();\n",[1112,1980,1981],{"class":1114,"line":1121},[1112,1982,1983],{},"p.setX(999.0); \u002F\u002F this actually changes robot's real startingPosition!\n",[1080,1985,1987],{"id":1986},"step-6-fix-the-getter-too","Step 6: Fix the Getter, Too",[1085,1989,1990],{},"Return a copy instead of the real object:",[1103,1992,1994],{"className":1105,"code":1993,"language":1107,"meta":1108,"style":1108},"public FieldPosition getStartingPosition()\n{\n    return new FieldPosition(startingPosition.getX(), startingPosition.getY());\n}\n",[1094,1995,1996,2001,2005,2010],{"__ignoreMap":1108},[1112,1997,1998],{"class":1114,"line":1115},[1112,1999,2000],{},"public FieldPosition getStartingPosition()\n",[1112,2002,2003],{"class":1114,"line":1121},[1112,2004,1124],{},[1112,2006,2007],{"class":1114,"line":1127},[1112,2008,2009],{},"    return new FieldPosition(startingPosition.getX(), startingPosition.getY());\n",[1112,2011,2012],{"class":1114,"line":1133},[1112,2013,1148],{},[1085,2015,2016,2017,2019,2020,2022],{},"Now neither the constructor nor the getter ever leaks a reference to ",[1094,2018,1885],{},"'s actual internal ",[1094,2021,1599],{}," — every value that goes in or comes out is a separate copy.",[1080,2024,2026],{"id":2025},"step-7-chaining-now-that-the-getter-is-safe","Step 7: Chaining, Now That the Getter Is Safe",[1103,2028,2030],{"className":1105,"code":2029,"language":1107,"meta":1108,"style":1108},"double startX = robot.getStartingPosition().getX();\n",[1094,2031,2032],{"__ignoreMap":1108},[1112,2033,2034],{"class":1114,"line":1115},[1112,2035,2029],{},[1085,2037,2038,2040,2041,1466,2043,1469,2045,2047,2048,2050,2051,2053,2054,2057,2058,2060],{},[1094,2039,1964],{}," returns a ",[1094,2042,1599],{},[1094,2044,1599],{},[1094,2046,1506],{}," — so the chain compiles. If ",[1094,2049,1964],{}," returned, say, a ",[1094,2052,1363],{},", ",[1094,2055,2056],{},".getX()"," on the end would fail to compile, since ",[1094,2059,1363],{}," has no such method.",[1080,2062,2064],{"id":2063},"recap","Recap",[1479,2066,2067,2074,2088,2101],{},[1482,2068,2069,1795,2071,2073],{},[1094,2070,1595],{},[1094,2072,1599],{}," — an object can be another object's instance variable.",[1482,2075,2076,2077,2079,2080,2082,2083,2085,2086,1798],{},"Passing or returning ",[1094,2078,1839],{}," copies its ",[1237,2081,1526],{},", not the object — the broken version in Steps 2–3 left ",[1094,2084,1885],{}," and the caller pointing at the same ",[1094,2087,1599],{},[1482,2089,2090,2091,2093,2094,2097,2098,2100],{},"Because ",[1094,2092,1599],{}," is mutable (it has ",[1094,2095,2096],{},"setX","), both the constructor and the getter needed a defensive copy so outside code can't reach in and change ",[1094,2099,1885],{},"'s real data later.",[1482,2102,2103,2106,2107,2109,2110,2112,2113,1511],{},[1094,2104,2105],{},"robot.getStartingPosition().getX()"," is chaining — it only compiles because ",[1094,2108,1964],{},"'s return type, ",[1094,2111,1599],{},", actually has a ",[1094,2114,1506],{},[1561,2116,1563],{},{"title":1108,"searchDepth":1121,"depth":1121,"links":2118},[2119,2120,2121,2122,2123,2124,2125,2126,2127],{"id":1588,"depth":1121,"text":1589},{"id":1603,"depth":1121,"text":1604},{"id":1801,"depth":1121,"text":1802},{"id":1832,"depth":1121,"text":1833},{"id":1902,"depth":1121,"text":1903},{"id":1957,"depth":1121,"text":1958},{"id":1986,"depth":1121,"text":1987},{"id":2025,"depth":1121,"text":2026},{"id":2063,"depth":1121,"text":2064},{"outlineRef":1575,"pairsWith":2129,"status":2130},"[`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":567,"description":1108},"5vBDG1n1UrMqwSEJ1VSsVFieMPI4jC4DyixSR_aNZJY",{"id":2134,"title":876,"body":2135,"description":1108,"extension":1573,"meta":3737,"navigation":1154,"path":875,"seo":3739,"stem":877,"__hash__":3740},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object.md",{"type":1073,"value":2136,"toc":3732},[2137,2140,2144,2165,2188,2191,2206,2213,2218,2252,2258,2285,2316,2320,2360,2427,2437,2509,2514,2520,2650,2758,2762,2768,2786,2807,2828,2842,2847,3238,3243,3248,3256,3261,3267,3272,3276,3282,3286,3292,3297,3301,3307,3311,3317,3322,3326,3332,3336,3342,3347,3351,3357,3361,3367,3372,3684,3730],[1076,2138,876],{"id":2139},"methods-passing-returning-references-of-an-object-exercises",[1080,2141,2143],{"id":2142},"multiple-choice","Multiple Choice",[1085,2145,2146,1196,2149,2152,2153,2156,2157,2160,2161,2164],{},[1089,2147,2148],{},"Question:",[1094,2150,2151],{},"Locker"," class has a private, mutable instance variable ",[1094,2154,2155],{},"combination"," (type ",[1094,2158,2159],{},"Combination",", which has a ",[1094,2162,2163],{},"setCode"," method), and this getter:",[1103,2166,2168],{"className":1105,"code":2167,"language":1107,"meta":1108,"style":1108},"public Combination getCombination()\n{\n    return combination;\n}\n",[1094,2169,2170,2175,2179,2184],{"__ignoreMap":1108},[1112,2171,2172],{"class":1114,"line":1115},[1112,2173,2174],{},"public Combination getCombination()\n",[1112,2176,2177],{"class":1114,"line":1121},[1112,2178,1124],{},[1112,2180,2181],{"class":1114,"line":1127},[1112,2182,2183],{},"    return combination;\n",[1112,2185,2186],{"class":1114,"line":1133},[1112,2187,1148],{},[1085,2189,2190],{},"Code elsewhere does:",[1103,2192,2194],{"className":1105,"code":2193,"language":1107,"meta":1108,"style":1108},"Combination c = myLocker.getCombination();\nc.setCode(1234);\n",[1094,2195,2196,2201],{"__ignoreMap":1108},[1112,2197,2198],{"class":1114,"line":1115},[1112,2199,2200],{},"Combination c = myLocker.getCombination();\n",[1112,2202,2203],{"class":1114,"line":1121},[1112,2204,2205],{},"c.setCode(1234);\n",[1085,2207,2208,2209,2212],{},"What happens to ",[1094,2210,2211],{},"myLocker","'s actual stored combination?",[1085,2214,2215],{},[1089,2216,2217],{},"Options:",[1479,2219,2220,2236,2243,2249],{},[1482,2221,2222,2223,2226,2227,2229,2230,1203,2233,2235],{},"A. It also changes to code ",[1094,2224,2225],{},"1234"," — the getter returned a reference to the real ",[1094,2228,2159],{}," object, not a separate copy, so ",[1094,2231,2232],{},"c",[1094,2234,2211],{},"'s internal combination are the same object",[1482,2237,2238,2239,2242],{},"B. Nothing changes — ",[1094,2240,2241],{},"getCombination()"," always hands back a brand-new copy automatically",[1482,2244,2245,2246,2248],{},"C. It only changes the next time ",[1094,2247,2211],{},"'s constructor is called",[1482,2250,2251],{},"D. It's a compile error — you can't call a setter on a value returned from a getter",[1085,2253,2254,2257],{},[1089,2255,2256],{},"Answer:"," A",[1085,2259,2260,2263,2264,2266,2267,2269,2270,1203,2272,2274,2275,2277,2278,2280,2281,2284],{},[1089,2261,2262],{},"Why:"," Java is always call by value, but for an object, the value copied is the reference. Returning ",[1094,2265,2155],{}," directly hands the caller the ",[1237,2268,1402],{}," object, not a copy — so ",[1094,2271,2232],{},[1094,2273,2211],{},"'s internal ",[1094,2276,2155],{}," point at the exact same ",[1094,2279,2159],{},", and calling ",[1094,2282,2283],{},"c.setCode(1234)"," changes the one object both of them see.",[1479,2286,2287,2294,2303],{},[1482,2288,2289,2290,2293],{},"B is wrong — Java never makes a defensive copy automatically; that has to be written explicitly (e.g. ",[1094,2291,2292],{},"new Combination(...)","), which this getter doesn't do.",[1482,2295,2296,2297,2299,2300,2302],{},"C is wrong — constructing ",[1094,2298,2211],{}," again has nothing to do with it; the change takes effect the instant ",[1094,2301,2163],{}," runs.",[1482,2304,2305,2306,2308,2309,1466,2311,1469,2313,2315],{},"D is wrong — this compiles fine. ",[1094,2307,2232],{}," has type ",[1094,2310,2159],{},[1094,2312,2159],{},[1094,2314,2163],{}," method, so the call is valid.",[1080,2317,2319],{"id":2318},"micro-parsons","Micro-Parsons",[1085,2321,2322,1499,2325,2327,2328,2331,2332,2335,2336,2339,2340,2342,2343,2345,2346,2348,2349,2351,2352,2354,2355,2357,2358,1798],{},[1089,2323,2324],{},"Problem:",[1094,2326,2159],{}," is a fixed, already-complete class shown below — assume it exists exactly as written and don't reorder it. It has a constructor ",[1094,2329,2330],{},"Combination(int initCode)"," and a method ",[1094,2333,2334],{},"getCode()",". It goes ",[1237,2337,2338],{},"after"," your ",[1094,2341,2151],{}," class in the file (the ",[1094,2344,1194],{}," class with ",[1094,2347,1226],{}," comes first, per this course's file-ordering rule — Lesson 7.3's box below). Reorder only the fragments below into the ",[1094,2350,2151],{}," class, whose constructor stores a defensive copy of the ",[1094,2353,2159],{}," it's given, instead of the original reference, then builds one ",[1094,2356,2151],{}," from a fresh ",[1094,2359,2159],{},[1103,2361,2363],{"className":1105,"code":2362,"language":1107,"meta":1108,"style":1108},"class Combination\n{\n    private int code;\n\n    public Combination(int initCode)\n    {\n        code = initCode;\n    }\n\n    public int getCode()\n    {\n        return code;\n    }\n}\n",[1094,2364,2365,2370,2374,2379,2383,2388,2392,2397,2401,2405,2410,2414,2419,2423],{"__ignoreMap":1108},[1112,2366,2367],{"class":1114,"line":1115},[1112,2368,2369],{},"class Combination\n",[1112,2371,2372],{"class":1114,"line":1121},[1112,2373,1124],{},[1112,2375,2376],{"class":1114,"line":1127},[1112,2377,2378],{},"    private int code;\n",[1112,2380,2381],{"class":1114,"line":1133},[1112,2382,1155],{"emptyLinePlaceholder":1154},[1112,2384,2385],{"class":1114,"line":1139},[1112,2386,2387],{},"    public Combination(int initCode)\n",[1112,2389,2390],{"class":1114,"line":1145},[1112,2391,1642],{},[1112,2393,2394],{"class":1114,"line":1151},[1112,2395,2396],{},"        code = initCode;\n",[1112,2398,2399],{"class":1114,"line":1158},[1112,2400,1657],{},[1112,2402,2403],{"class":1114,"line":1164},[1112,2404,1155],{"emptyLinePlaceholder":1154},[1112,2406,2407],{"class":1114,"line":1169},[1112,2408,2409],{},"    public int getCode()\n",[1112,2411,2412],{"class":1114,"line":1175},[1112,2413,1642],{},[1112,2415,2416],{"class":1114,"line":1181},[1112,2417,2418],{},"        return code;\n",[1112,2420,2421],{"class":1114,"line":1669},[1112,2422,1657],{},[1112,2424,2425],{"class":1114,"line":1674},[1112,2426,1148],{},[1085,2428,2429,2430,2432,2433,2436],{},"Reorder the fragments below into the ",[1094,2431,2151],{}," class that comes ",[1237,2434,2435],{},"before"," it:",[1479,2438,2439,2445,2451,2457,2463,2469,2475,2481,2487,2493,2498,2504],{},[1482,2440,2441,2442],{},"a. ",[1094,2443,2444],{},"        combination = new Combination(initCombination.getCode());",[1482,2446,2447,2448],{},"b. ",[1094,2449,2450],{},"public class Locker",[1482,2452,2453,2454],{},"c. ",[1094,2455,2456],{},"    }",[1482,2458,2459,2460],{},"d. ",[1094,2461,2462],{},"    private Combination combination;",[1482,2464,2465,2466],{},"e. ",[1094,2467,2468],{},"    public Locker(Combination initCombination)",[1482,2470,2471,2472],{},"f. ",[1094,2473,2474],{},"{",[1482,2476,2477,2478],{},"g. ",[1094,2479,2480],{},"    {",[1482,2482,2483,2484],{},"h. ",[1094,2485,2486],{},"}",[1482,2488,2489,2490],{},"i. ",[1094,2491,2492],{},"    public static void main(String[] args)",[1482,2494,2495,2496],{},"j. ",[1094,2497,2480],{},[1482,2499,2500,2501],{},"k. ",[1094,2502,2503],{},"        Locker locker = new Locker(new Combination(1234));",[1482,2505,2506,2507],{},"l. ",[1094,2508,2456],{},[1085,2510,2511,2513],{},[1089,2512,2256],{}," b, f, d, e, g, a, c, i, j, k, l, h",[1085,2515,2516,2519],{},[1089,2517,2518],{},"Interchangeable:"," (g, j) (c, l)",[1103,2521,2523],{"className":1105,"code":2522,"language":1107,"meta":1108,"style":1108},"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\nclass Combination\n{\n    private int code;\n\n    public Combination(int initCode)\n    {\n        code = initCode;\n    }\n\n    public int getCode()\n    {\n        return code;\n    }\n}\n",[1094,2524,2525,2530,2534,2539,2543,2548,2552,2557,2561,2565,2570,2574,2579,2583,2587,2591,2595,2599,2603,2607,2611,2615,2619,2623,2627,2631,2635,2640,2645],{"__ignoreMap":1108},[1112,2526,2527],{"class":1114,"line":1115},[1112,2528,2529],{},"public class Locker\n",[1112,2531,2532],{"class":1114,"line":1121},[1112,2533,1124],{},[1112,2535,2536],{"class":1114,"line":1127},[1112,2537,2538],{},"    private Combination combination;\n",[1112,2540,2541],{"class":1114,"line":1133},[1112,2542,1155],{"emptyLinePlaceholder":1154},[1112,2544,2545],{"class":1114,"line":1139},[1112,2546,2547],{},"    public Locker(Combination initCombination)\n",[1112,2549,2550],{"class":1114,"line":1145},[1112,2551,1642],{},[1112,2553,2554],{"class":1114,"line":1151},[1112,2555,2556],{},"        combination = new Combination(initCombination.getCode());\n",[1112,2558,2559],{"class":1114,"line":1158},[1112,2560,1657],{},[1112,2562,2563],{"class":1114,"line":1164},[1112,2564,1155],{"emptyLinePlaceholder":1154},[1112,2566,2567],{"class":1114,"line":1169},[1112,2568,2569],{},"    public static void main(String[] args)\n",[1112,2571,2572],{"class":1114,"line":1175},[1112,2573,1642],{},[1112,2575,2576],{"class":1114,"line":1181},[1112,2577,2578],{},"        Locker locker = new Locker(new Combination(1234));\n",[1112,2580,2581],{"class":1114,"line":1669},[1112,2582,1657],{},[1112,2584,2585],{"class":1114,"line":1674},[1112,2586,1148],{},[1112,2588,2589],{"class":1114,"line":1680},[1112,2590,1155],{"emptyLinePlaceholder":1154},[1112,2592,2593],{"class":1114,"line":1685},[1112,2594,2369],{},[1112,2596,2597],{"class":1114,"line":1690},[1112,2598,1124],{},[1112,2600,2601],{"class":1114,"line":1696},[1112,2602,2378],{},[1112,2604,2605],{"class":1114,"line":1701},[1112,2606,1155],{"emptyLinePlaceholder":1154},[1112,2608,2609],{"class":1114,"line":1707},[1112,2610,2387],{},[1112,2612,2613],{"class":1114,"line":1712},[1112,2614,1642],{},[1112,2616,2617],{"class":1114,"line":1717},[1112,2618,2396],{},[1112,2620,2621],{"class":1114,"line":1723},[1112,2622,1657],{},[1112,2624,2625],{"class":1114,"line":1728},[1112,2626,1155],{"emptyLinePlaceholder":1154},[1112,2628,2629],{"class":1114,"line":1734},[1112,2630,2409],{},[1112,2632,2633],{"class":1114,"line":1739},[1112,2634,1642],{},[1112,2636,2638],{"class":1114,"line":2637},27,[1112,2639,2418],{},[1112,2641,2643],{"class":1114,"line":2642},28,[1112,2644,1657],{},[1112,2646,2648],{"class":1114,"line":2647},29,[1112,2649,1148],{},[1085,2651,2652,2655,2656,2659,2660,2663,2664,2667,2668,2671,2672,2675,2676,2679,2680,1499,2683,2685,2686,2689,2690,2693,2694,2696,2697,2699,2700,2703,2704,2707,2708,2679,2711,2713,2714,2716,2717,2719,2720,2723,2724,2727,2728,2730,2731,2733,2734,2736,2737,2739,2740,2742,2743,2745,2746,2748,2749,2742,2751,2745,2753,2755,2756,1798],{},[1089,2653,2654],{},"Why this order:"," The class declaration (",[1094,2657,2658],{},"b",") and its opening brace (",[1094,2661,2662],{},"f",") come first, followed by the instance variable (",[1094,2665,2666],{},"d",") — declared before the constructor, per the usual order. The constructor's signature (",[1094,2669,2670],{},"e",") and its own opening brace (",[1094,2673,2674],{},"g",") come next. Inside, the key line (",[1094,2677,2678],{},"a",") builds a ",[1237,2681,2682],{},"brand-new",[1094,2684,2159],{}," from the passed-in one's own code (",[1094,2687,2688],{},"initCombination.getCode()","), rather than storing ",[1094,2691,2692],{},"initCombination"," itself — that's the defensive copy. The constructor's body then closes (",[1094,2695,2232],{},"), and ",[1094,2698,1226],{}," (",[1094,2701,2702],{},"i",") is declared next with its own opening brace (",[1094,2705,2706],{},"j","); inside it, the single statement (",[1094,2709,2710],{},"k",[1094,2712,2159],{}," and immediately hands it to a new ",[1094,2715,2151],{},", exercising the defensive-copy constructor. Finally, the braces close in reverse: ",[1094,2718,1226],{},"'s body (",[1094,2721,2722],{},"l","), then the class's body (",[1094,2725,2726],{},"h",") — ",[1094,2729,2151],{}," is ",[1094,2732,1194],{}," and holds ",[1094,2735,1226],{},", so it has to come first in the file (Lesson 7.3); the given ",[1094,2738,2159],{}," class follows it. Note that ",[1094,2741,2674],{},"\u002F",[1094,2744,2706],{}," (both a bare four-space ",[1094,2747,2474],{},") and ",[1094,2750,2232],{},[1094,2752,2722],{},[1094,2754,2486],{},") 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 ",[1094,2757,1226],{},[1080,2759,2761],{"id":2760},"coding","Coding",[1085,2763,2764,2767],{},[1089,2765,2766],{},"Mode:"," full-program",[1085,2769,2770,1196,2772,1499,2774,1499,2777,2779,2780,2782,2783,2785],{},[1089,2771,2324],{},[1094,2773,1096],{},[1089,2775,2776],{},"has a",[1094,2778,1100],{}," (current limit and ramp rate). ",[1094,2781,1100],{}," is given below and\nit is mutable: it has a setter for the current limit. Finish ",[1094,2784,1096],{}," so that outside code can never\nchange the subsystem's settings by accident:",[1479,2787,2788,2798],{},[1482,2789,2790,2791,2794,2795,2797],{},"The constructor must keep its ",[1089,2792,2793],{},"own copy"," of the ",[1094,2796,1100],{}," it is handed (a defensive copy), not the\ncaller's object.",[1482,2799,2800,2802,2803,2806],{},[1094,2801,1462],{}," must return a ",[1089,2804,2805],{},"copy"," too, not the real object.",[1085,2808,2809,2810,2812,2813,2816,2817,2819,2820,2823,2824,2827],{},"The fixed ",[1094,2811,1226],{}," builds a config, gives it to a subsystem, then changes the ",[1237,2814,2815],{},"original"," config's limit and\nprints the subsystem's limit. Then it fetches the config with ",[1094,2818,1462],{},", changes ",[1237,2821,2822],{},"that"," one to ",[1094,2825,2826],{},"0",", and\nprints the subsystem's limit again. Both prints must still show the limit the subsystem was built with.",[1085,2829,2830,2831,2834,2835,2838,2839,1798],{},"For example, the input ",[1094,2832,2833],{},"Intake 40 0.25 60"," (name, limit, ramp rate, a new limit to try) prints ",[1094,2836,2837],{},"40 A","\nboth times; the first line also shows the ramp rate ",[1094,2840,2841],{},"0.25",[1085,2843,2844],{},[1089,2845,2846],{},"Starter:",[1103,2848,2850],{"className":1105,"code":2849,"language":1107,"meta":1108,"style":1108},"import java.util.*;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args)\n    {\n        Scanner in = new Scanner(System.in);\n        String name = in.next();\n        int limit = in.nextInt();\n        double ramp = in.nextDouble();\n        int newLimit = in.nextInt();\n\n        MotorConfig original = new MotorConfig(limit, ramp);\n        Subsystem subsystem = new Subsystem(name, original);\n\n        original.setCurrentLimit(newLimit);\n        System.out.println(subsystem.getName() + \" after changing the original: \"\n            + subsystem.getConfig().getCurrentLimit() + \" A, ramp \" + subsystem.getConfig().getRampRate());\n\n        MotorConfig fetched = subsystem.getConfig();\n        fetched.setCurrentLimit(0);\n        System.out.println(subsystem.getName() + \" after changing the fetched one: \"\n            + subsystem.getConfig().getCurrentLimit() + \" A\");\n    }\n}\n\n\u002F\u002F Given: a mutable settings class (it has setters)\nclass MotorConfig\n{\n    private int currentLimit;\n    private double rampRate;\n\n    public MotorConfig(int initCurrentLimit, double initRampRate)\n    {\n        currentLimit = initCurrentLimit;\n        rampRate = initRampRate;\n    }\n\n    public int getCurrentLimit()\n    {\n        return currentLimit;\n    }\n\n    public double getRampRate()\n    {\n        return rampRate;\n    }\n\n    public void setCurrentLimit(int newCurrentLimit)\n    {\n        currentLimit = newCurrentLimit;\n    }\n}\n\nclass Subsystem\n{\n    private String name;\n    private MotorConfig config;\n\n    public Subsystem(String initName, MotorConfig initConfig)\n    {\n        \u002F\u002F TODO: store the name, and keep your OWN copy of the config\n    }\n\n    public String getName()\n    {\n        return name;\n    }\n\n    public MotorConfig getConfig()\n    {\n        \u002F\u002F TODO: hand back a copy, not the real object\n        return null;\n    }\n}\n",[1094,2851,2852,2857,2861,2866,2870,2875,2879,2883,2888,2893,2898,2903,2908,2912,2917,2922,2926,2931,2936,2941,2945,2950,2955,2960,2965,2969,2973,2977,2982,2986,2991,2996,3001,3006,3012,3017,3023,3029,3034,3039,3045,3050,3056,3061,3066,3072,3077,3083,3088,3093,3099,3104,3110,3115,3120,3125,3130,3135,3140,3146,3151,3157,3162,3168,3173,3178,3184,3189,3195,3200,3205,3211,3216,3222,3228,3233],{"__ignoreMap":1108},[1112,2853,2854],{"class":1114,"line":1115},[1112,2855,2856],{},"import java.util.*;\n",[1112,2858,2859],{"class":1114,"line":1121},[1112,2860,1155],{"emptyLinePlaceholder":1154},[1112,2862,2863],{"class":1114,"line":1127},[1112,2864,2865],{},"public class Main\n",[1112,2867,2868],{"class":1114,"line":1133},[1112,2869,1124],{},[1112,2871,2872],{"class":1114,"line":1139},[1112,2873,2874],{},"    \u002F\u002F Don't change main\n",[1112,2876,2877],{"class":1114,"line":1145},[1112,2878,2569],{},[1112,2880,2881],{"class":1114,"line":1151},[1112,2882,1642],{},[1112,2884,2885],{"class":1114,"line":1158},[1112,2886,2887],{},"        Scanner in = new Scanner(System.in);\n",[1112,2889,2890],{"class":1114,"line":1164},[1112,2891,2892],{},"        String name = in.next();\n",[1112,2894,2895],{"class":1114,"line":1169},[1112,2896,2897],{},"        int limit = in.nextInt();\n",[1112,2899,2900],{"class":1114,"line":1175},[1112,2901,2902],{},"        double ramp = in.nextDouble();\n",[1112,2904,2905],{"class":1114,"line":1181},[1112,2906,2907],{},"        int newLimit = in.nextInt();\n",[1112,2909,2910],{"class":1114,"line":1669},[1112,2911,1155],{"emptyLinePlaceholder":1154},[1112,2913,2914],{"class":1114,"line":1674},[1112,2915,2916],{},"        MotorConfig original = new MotorConfig(limit, ramp);\n",[1112,2918,2919],{"class":1114,"line":1680},[1112,2920,2921],{},"        Subsystem subsystem = new Subsystem(name, original);\n",[1112,2923,2924],{"class":1114,"line":1685},[1112,2925,1155],{"emptyLinePlaceholder":1154},[1112,2927,2928],{"class":1114,"line":1690},[1112,2929,2930],{},"        original.setCurrentLimit(newLimit);\n",[1112,2932,2933],{"class":1114,"line":1696},[1112,2934,2935],{},"        System.out.println(subsystem.getName() + \" after changing the original: \"\n",[1112,2937,2938],{"class":1114,"line":1701},[1112,2939,2940],{},"            + subsystem.getConfig().getCurrentLimit() + \" A, ramp \" + subsystem.getConfig().getRampRate());\n",[1112,2942,2943],{"class":1114,"line":1707},[1112,2944,1155],{"emptyLinePlaceholder":1154},[1112,2946,2947],{"class":1114,"line":1712},[1112,2948,2949],{},"        MotorConfig fetched = subsystem.getConfig();\n",[1112,2951,2952],{"class":1114,"line":1717},[1112,2953,2954],{},"        fetched.setCurrentLimit(0);\n",[1112,2956,2957],{"class":1114,"line":1723},[1112,2958,2959],{},"        System.out.println(subsystem.getName() + \" after changing the fetched one: \"\n",[1112,2961,2962],{"class":1114,"line":1728},[1112,2963,2964],{},"            + subsystem.getConfig().getCurrentLimit() + \" A\");\n",[1112,2966,2967],{"class":1114,"line":1734},[1112,2968,1657],{},[1112,2970,2971],{"class":1114,"line":1739},[1112,2972,1148],{},[1112,2974,2975],{"class":1114,"line":2637},[1112,2976,1155],{"emptyLinePlaceholder":1154},[1112,2978,2979],{"class":1114,"line":2642},[1112,2980,2981],{},"\u002F\u002F Given: a mutable settings class (it has setters)\n",[1112,2983,2984],{"class":1114,"line":2647},[1112,2985,1118],{},[1112,2987,2989],{"class":1114,"line":2988},30,[1112,2990,1124],{},[1112,2992,2994],{"class":1114,"line":2993},31,[1112,2995,1136],{},[1112,2997,2999],{"class":1114,"line":2998},32,[1112,3000,1130],{},[1112,3002,3004],{"class":1114,"line":3003},33,[1112,3005,1155],{"emptyLinePlaceholder":1154},[1112,3007,3009],{"class":1114,"line":3008},34,[1112,3010,3011],{},"    public MotorConfig(int initCurrentLimit, double initRampRate)\n",[1112,3013,3015],{"class":1114,"line":3014},35,[1112,3016,1642],{},[1112,3018,3020],{"class":1114,"line":3019},36,[1112,3021,3022],{},"        currentLimit = initCurrentLimit;\n",[1112,3024,3026],{"class":1114,"line":3025},37,[1112,3027,3028],{},"        rampRate = initRampRate;\n",[1112,3030,3032],{"class":1114,"line":3031},38,[1112,3033,1657],{},[1112,3035,3037],{"class":1114,"line":3036},39,[1112,3038,1155],{"emptyLinePlaceholder":1154},[1112,3040,3042],{"class":1114,"line":3041},40,[1112,3043,3044],{},"    public int getCurrentLimit()\n",[1112,3046,3048],{"class":1114,"line":3047},41,[1112,3049,1642],{},[1112,3051,3053],{"class":1114,"line":3052},42,[1112,3054,3055],{},"        return currentLimit;\n",[1112,3057,3059],{"class":1114,"line":3058},43,[1112,3060,1657],{},[1112,3062,3064],{"class":1114,"line":3063},44,[1112,3065,1155],{"emptyLinePlaceholder":1154},[1112,3067,3069],{"class":1114,"line":3068},45,[1112,3070,3071],{},"    public double getRampRate()\n",[1112,3073,3075],{"class":1114,"line":3074},46,[1112,3076,1642],{},[1112,3078,3080],{"class":1114,"line":3079},47,[1112,3081,3082],{},"        return rampRate;\n",[1112,3084,3086],{"class":1114,"line":3085},48,[1112,3087,1657],{},[1112,3089,3091],{"class":1114,"line":3090},49,[1112,3092,1155],{"emptyLinePlaceholder":1154},[1112,3094,3096],{"class":1114,"line":3095},50,[1112,3097,3098],{},"    public void setCurrentLimit(int newCurrentLimit)\n",[1112,3100,3102],{"class":1114,"line":3101},51,[1112,3103,1642],{},[1112,3105,3107],{"class":1114,"line":3106},52,[1112,3108,3109],{},"        currentLimit = newCurrentLimit;\n",[1112,3111,3113],{"class":1114,"line":3112},53,[1112,3114,1657],{},[1112,3116,3118],{"class":1114,"line":3117},54,[1112,3119,1148],{},[1112,3121,3123],{"class":1114,"line":3122},55,[1112,3124,1155],{"emptyLinePlaceholder":1154},[1112,3126,3128],{"class":1114,"line":3127},56,[1112,3129,1161],{},[1112,3131,3133],{"class":1114,"line":3132},57,[1112,3134,1124],{},[1112,3136,3138],{"class":1114,"line":3137},58,[1112,3139,1172],{},[1112,3141,3143],{"class":1114,"line":3142},59,[1112,3144,3145],{},"    private MotorConfig config;\n",[1112,3147,3149],{"class":1114,"line":3148},60,[1112,3150,1155],{"emptyLinePlaceholder":1154},[1112,3152,3154],{"class":1114,"line":3153},61,[1112,3155,3156],{},"    public Subsystem(String initName, MotorConfig initConfig)\n",[1112,3158,3160],{"class":1114,"line":3159},62,[1112,3161,1642],{},[1112,3163,3165],{"class":1114,"line":3164},63,[1112,3166,3167],{},"        \u002F\u002F TODO: store the name, and keep your OWN copy of the config\n",[1112,3169,3171],{"class":1114,"line":3170},64,[1112,3172,1657],{},[1112,3174,3176],{"class":1114,"line":3175},65,[1112,3177,1155],{"emptyLinePlaceholder":1154},[1112,3179,3181],{"class":1114,"line":3180},66,[1112,3182,3183],{},"    public String getName()\n",[1112,3185,3187],{"class":1114,"line":3186},67,[1112,3188,1642],{},[1112,3190,3192],{"class":1114,"line":3191},68,[1112,3193,3194],{},"        return name;\n",[1112,3196,3198],{"class":1114,"line":3197},69,[1112,3199,1657],{},[1112,3201,3203],{"class":1114,"line":3202},70,[1112,3204,1155],{"emptyLinePlaceholder":1154},[1112,3206,3208],{"class":1114,"line":3207},71,[1112,3209,3210],{},"    public MotorConfig getConfig()\n",[1112,3212,3214],{"class":1114,"line":3213},72,[1112,3215,1642],{},[1112,3217,3219],{"class":1114,"line":3218},73,[1112,3220,3221],{},"        \u002F\u002F TODO: hand back a copy, not the real object\n",[1112,3223,3225],{"class":1114,"line":3224},74,[1112,3226,3227],{},"        return null;\n",[1112,3229,3231],{"class":1114,"line":3230},75,[1112,3232,1657],{},[1112,3234,3236],{"class":1114,"line":3235},76,[1112,3237,1148],{},[1085,3239,3240],{},[1089,3241,3242],{},"Scenario 1 (visible):",[1085,3244,3245],{},[1089,3246,3247],{},"Input:",[1103,3249,3254],{"className":3250,"code":3252,"language":3253,"meta":1108},[3251],"language-text","Intake 40 0.25 60\n","text",[1094,3255,3252],{"__ignoreMap":1108},[1085,3257,3258],{},[1089,3259,3260],{},"Expected output:",[1103,3262,3265],{"className":3263,"code":3264,"language":3253,"meta":1108},[3251],"Intake after changing the original: 40 A, ramp 0.25\nIntake after changing the fetched one: 40 A\n",[1094,3266,3264],{"__ignoreMap":1108},[1085,3268,3269],{},[1089,3270,3271],{},"Scenario 2 (visible):",[1085,3273,3274],{},[1089,3275,3247],{},[1103,3277,3280],{"className":3278,"code":3279,"language":3253,"meta":1108},[3251],"Shooter 80 0.5 20\n",[1094,3281,3279],{"__ignoreMap":1108},[1085,3283,3284],{},[1089,3285,3260],{},[1103,3287,3290],{"className":3288,"code":3289,"language":3253,"meta":1108},[3251],"Shooter after changing the original: 80 A, ramp 0.5\nShooter after changing the fetched one: 80 A\n",[1094,3291,3289],{"__ignoreMap":1108},[1085,3293,3294],{},[1089,3295,3296],{},"Scenario 3 (hidden):",[1085,3298,3299],{},[1089,3300,3247],{},[1103,3302,3305],{"className":3303,"code":3304,"language":3253,"meta":1108},[3251],"Climber 30 1.0 45\n",[1094,3306,3304],{"__ignoreMap":1108},[1085,3308,3309],{},[1089,3310,3260],{},[1103,3312,3315],{"className":3313,"code":3314,"language":3253,"meta":1108},[3251],"Climber after changing the original: 30 A, ramp 1.0\nClimber after changing the fetched one: 30 A\n",[1094,3316,3314],{"__ignoreMap":1108},[1085,3318,3319],{},[1089,3320,3321],{},"Scenario 4 (hidden):",[1085,3323,3324],{},[1089,3325,3247],{},[1103,3327,3330],{"className":3328,"code":3329,"language":3253,"meta":1108},[3251],"Arm 55 0.1 0\n",[1094,3331,3329],{"__ignoreMap":1108},[1085,3333,3334],{},[1089,3335,3260],{},[1103,3337,3340],{"className":3338,"code":3339,"language":3253,"meta":1108},[3251],"Arm after changing the original: 55 A, ramp 0.1\nArm after changing the fetched one: 55 A\n",[1094,3341,3339],{"__ignoreMap":1108},[1085,3343,3344],{},[1089,3345,3346],{},"Scenario 5 (hidden):",[1085,3348,3349],{},[1089,3350,3247],{},[1103,3352,3355],{"className":3353,"code":3354,"language":3253,"meta":1108},[3251],"Drive 120 0.75 40\n",[1094,3356,3354],{"__ignoreMap":1108},[1085,3358,3359],{},[1089,3360,3260],{},[1103,3362,3365],{"className":3363,"code":3364,"language":3253,"meta":1108},[3251],"Drive after changing the original: 120 A, ramp 0.75\nDrive after changing the fetched one: 120 A\n",[1094,3366,3364],{"__ignoreMap":1108},[1085,3368,3369],{},[1089,3370,3371],{},"Solution:",[1103,3373,3375],{"className":1105,"code":3374,"language":1107,"meta":1108,"style":1108},"import java.util.*;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args)\n    {\n        Scanner in = new Scanner(System.in);\n        String name = in.next();\n        int limit = in.nextInt();\n        double ramp = in.nextDouble();\n        int newLimit = in.nextInt();\n\n        MotorConfig original = new MotorConfig(limit, ramp);\n        Subsystem subsystem = new Subsystem(name, original);\n\n        original.setCurrentLimit(newLimit);\n        System.out.println(subsystem.getName() + \" after changing the original: \"\n            + subsystem.getConfig().getCurrentLimit() + \" A, ramp \" + subsystem.getConfig().getRampRate());\n\n        MotorConfig fetched = subsystem.getConfig();\n        fetched.setCurrentLimit(0);\n        System.out.println(subsystem.getName() + \" after changing the fetched one: \"\n            + subsystem.getConfig().getCurrentLimit() + \" A\");\n    }\n}\n\n\u002F\u002F Given: a mutable settings class (it has setters)\nclass MotorConfig\n{\n    private int currentLimit;\n    private double rampRate;\n\n    public MotorConfig(int initCurrentLimit, double initRampRate)\n    {\n        currentLimit = initCurrentLimit;\n        rampRate = initRampRate;\n    }\n\n    public int getCurrentLimit()\n    {\n        return currentLimit;\n    }\n\n    public double getRampRate()\n    {\n        return rampRate;\n    }\n\n    public void setCurrentLimit(int newCurrentLimit)\n    {\n        currentLimit = newCurrentLimit;\n    }\n}\n\nclass Subsystem\n{\n    private String name;\n    private MotorConfig config;\n\n    public Subsystem(String initName, MotorConfig initConfig)\n    {\n        name = initName;\n        config = new MotorConfig(initConfig.getCurrentLimit(), initConfig.getRampRate());\n    }\n\n    public String getName()\n    {\n        return name;\n    }\n\n    public MotorConfig getConfig()\n    {\n        return new MotorConfig(config.getCurrentLimit(), config.getRampRate());\n    }\n}\n",[1094,3376,3377,3381,3385,3389,3393,3397,3401,3405,3409,3413,3417,3421,3425,3429,3433,3437,3441,3445,3449,3453,3457,3461,3465,3469,3473,3477,3481,3485,3489,3493,3497,3501,3505,3509,3513,3517,3521,3525,3529,3533,3537,3541,3545,3549,3553,3557,3561,3565,3569,3573,3577,3581,3585,3589,3593,3597,3601,3605,3609,3613,3617,3621,3625,3630,3635,3639,3643,3647,3651,3655,3659,3663,3667,3671,3676,3680],{"__ignoreMap":1108},[1112,3378,3379],{"class":1114,"line":1115},[1112,3380,2856],{},[1112,3382,3383],{"class":1114,"line":1121},[1112,3384,1155],{"emptyLinePlaceholder":1154},[1112,3386,3387],{"class":1114,"line":1127},[1112,3388,2865],{},[1112,3390,3391],{"class":1114,"line":1133},[1112,3392,1124],{},[1112,3394,3395],{"class":1114,"line":1139},[1112,3396,2874],{},[1112,3398,3399],{"class":1114,"line":1145},[1112,3400,2569],{},[1112,3402,3403],{"class":1114,"line":1151},[1112,3404,1642],{},[1112,3406,3407],{"class":1114,"line":1158},[1112,3408,2887],{},[1112,3410,3411],{"class":1114,"line":1164},[1112,3412,2892],{},[1112,3414,3415],{"class":1114,"line":1169},[1112,3416,2897],{},[1112,3418,3419],{"class":1114,"line":1175},[1112,3420,2902],{},[1112,3422,3423],{"class":1114,"line":1181},[1112,3424,2907],{},[1112,3426,3427],{"class":1114,"line":1669},[1112,3428,1155],{"emptyLinePlaceholder":1154},[1112,3430,3431],{"class":1114,"line":1674},[1112,3432,2916],{},[1112,3434,3435],{"class":1114,"line":1680},[1112,3436,2921],{},[1112,3438,3439],{"class":1114,"line":1685},[1112,3440,1155],{"emptyLinePlaceholder":1154},[1112,3442,3443],{"class":1114,"line":1690},[1112,3444,2930],{},[1112,3446,3447],{"class":1114,"line":1696},[1112,3448,2935],{},[1112,3450,3451],{"class":1114,"line":1701},[1112,3452,2940],{},[1112,3454,3455],{"class":1114,"line":1707},[1112,3456,1155],{"emptyLinePlaceholder":1154},[1112,3458,3459],{"class":1114,"line":1712},[1112,3460,2949],{},[1112,3462,3463],{"class":1114,"line":1717},[1112,3464,2954],{},[1112,3466,3467],{"class":1114,"line":1723},[1112,3468,2959],{},[1112,3470,3471],{"class":1114,"line":1728},[1112,3472,2964],{},[1112,3474,3475],{"class":1114,"line":1734},[1112,3476,1657],{},[1112,3478,3479],{"class":1114,"line":1739},[1112,3480,1148],{},[1112,3482,3483],{"class":1114,"line":2637},[1112,3484,1155],{"emptyLinePlaceholder":1154},[1112,3486,3487],{"class":1114,"line":2642},[1112,3488,2981],{},[1112,3490,3491],{"class":1114,"line":2647},[1112,3492,1118],{},[1112,3494,3495],{"class":1114,"line":2988},[1112,3496,1124],{},[1112,3498,3499],{"class":1114,"line":2993},[1112,3500,1136],{},[1112,3502,3503],{"class":1114,"line":2998},[1112,3504,1130],{},[1112,3506,3507],{"class":1114,"line":3003},[1112,3508,1155],{"emptyLinePlaceholder":1154},[1112,3510,3511],{"class":1114,"line":3008},[1112,3512,3011],{},[1112,3514,3515],{"class":1114,"line":3014},[1112,3516,1642],{},[1112,3518,3519],{"class":1114,"line":3019},[1112,3520,3022],{},[1112,3522,3523],{"class":1114,"line":3025},[1112,3524,3028],{},[1112,3526,3527],{"class":1114,"line":3031},[1112,3528,1657],{},[1112,3530,3531],{"class":1114,"line":3036},[1112,3532,1155],{"emptyLinePlaceholder":1154},[1112,3534,3535],{"class":1114,"line":3041},[1112,3536,3044],{},[1112,3538,3539],{"class":1114,"line":3047},[1112,3540,1642],{},[1112,3542,3543],{"class":1114,"line":3052},[1112,3544,3055],{},[1112,3546,3547],{"class":1114,"line":3058},[1112,3548,1657],{},[1112,3550,3551],{"class":1114,"line":3063},[1112,3552,1155],{"emptyLinePlaceholder":1154},[1112,3554,3555],{"class":1114,"line":3068},[1112,3556,3071],{},[1112,3558,3559],{"class":1114,"line":3074},[1112,3560,1642],{},[1112,3562,3563],{"class":1114,"line":3079},[1112,3564,3082],{},[1112,3566,3567],{"class":1114,"line":3085},[1112,3568,1657],{},[1112,3570,3571],{"class":1114,"line":3090},[1112,3572,1155],{"emptyLinePlaceholder":1154},[1112,3574,3575],{"class":1114,"line":3095},[1112,3576,3098],{},[1112,3578,3579],{"class":1114,"line":3101},[1112,3580,1642],{},[1112,3582,3583],{"class":1114,"line":3106},[1112,3584,3109],{},[1112,3586,3587],{"class":1114,"line":3112},[1112,3588,1657],{},[1112,3590,3591],{"class":1114,"line":3117},[1112,3592,1148],{},[1112,3594,3595],{"class":1114,"line":3122},[1112,3596,1155],{"emptyLinePlaceholder":1154},[1112,3598,3599],{"class":1114,"line":3127},[1112,3600,1161],{},[1112,3602,3603],{"class":1114,"line":3132},[1112,3604,1124],{},[1112,3606,3607],{"class":1114,"line":3137},[1112,3608,1172],{},[1112,3610,3611],{"class":1114,"line":3142},[1112,3612,3145],{},[1112,3614,3615],{"class":1114,"line":3148},[1112,3616,1155],{"emptyLinePlaceholder":1154},[1112,3618,3619],{"class":1114,"line":3153},[1112,3620,3156],{},[1112,3622,3623],{"class":1114,"line":3159},[1112,3624,1642],{},[1112,3626,3627],{"class":1114,"line":3164},[1112,3628,3629],{},"        name = initName;\n",[1112,3631,3632],{"class":1114,"line":3170},[1112,3633,3634],{},"        config = new MotorConfig(initConfig.getCurrentLimit(), initConfig.getRampRate());\n",[1112,3636,3637],{"class":1114,"line":3175},[1112,3638,1657],{},[1112,3640,3641],{"class":1114,"line":3180},[1112,3642,1155],{"emptyLinePlaceholder":1154},[1112,3644,3645],{"class":1114,"line":3186},[1112,3646,3183],{},[1112,3648,3649],{"class":1114,"line":3191},[1112,3650,1642],{},[1112,3652,3653],{"class":1114,"line":3197},[1112,3654,3194],{},[1112,3656,3657],{"class":1114,"line":3202},[1112,3658,1657],{},[1112,3660,3661],{"class":1114,"line":3207},[1112,3662,1155],{"emptyLinePlaceholder":1154},[1112,3664,3665],{"class":1114,"line":3213},[1112,3666,3210],{},[1112,3668,3669],{"class":1114,"line":3218},[1112,3670,1642],{},[1112,3672,3673],{"class":1114,"line":3224},[1112,3674,3675],{},"        return new MotorConfig(config.getCurrentLimit(), config.getRampRate());\n",[1112,3677,3678],{"class":1114,"line":3230},[1112,3679,1657],{},[1112,3681,3682],{"class":1114,"line":3235},[1112,3683,1148],{},[1085,3685,3686,3688,3689,3692,3693,1889,3695,3697,3698,3701,3702,3705,3706,3709,3710,3712,3713,3715,3716,3719,3720,3723,3724,3726,3727,3729],{},[1089,3687,2262],{}," Passing an object copies its reference, so ",[1094,3690,3691],{},"config = initConfig;"," would leave ",[1094,3694,1226],{},[1094,3696,2815],{}," and\nthe subsystem's ",[1094,3699,3700],{},"config"," pointing at the same object, and the first print would show the new limit\n(",[1094,3703,3704],{},"60 A","). Building a ",[1094,3707,3708],{},"new MotorConfig(...)"," from the getters' values gives the subsystem an object nobody\nelse holds. The same rule runs backward: returning ",[1094,3711,3700],{}," directly would let ",[1094,3714,1226],{}," call\n",[1094,3717,3718],{},"setCurrentLimit(0)"," on the subsystem's real settings, so the second print would show ",[1094,3721,3722],{},"0 A",". Returning a\ncopy closes that door. ",[1094,3725,1359],{}," needs no copy because ",[1094,3728,1363],{}," is immutable.",[1561,3731,1563],{},{"title":1108,"searchDepth":1121,"depth":1121,"links":3733},[3734,3735,3736],{"id":2142,"depth":1121,"text":2143},{"id":2318,"depth":1121,"text":2319},{"id":2760,"depth":1121,"text":2761},{"outlineRef":1575,"pairsWith":2129,"status":3738},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":876,"description":1108},"uOvc6jHsROvxnUBlnsS0ePTVLXf6kmtEbd4eyXP8aec",1792718164822]