Let's jump right in! Go to for online compilation. https://dartpad.dartlang.org/ We'll build a simple Dart class. Similar to Java : Bicycle class Above the function, add a class with three instance variables. Also remove the contents from , as shown in the following snippet: main() Bicycle main() code { cadence; speed; gear; } main() { } class Bicycle int int int void Dart's main method is named . main() In Dart, you can define code outside of classes. Variables, functions, getters, and setters can all live outside of classes. The original Java example declares private instance variables using the private tag, which Dart doesn't use. "Neither main() nor Bicycle is declared as public, because all identifiers are public by default. Dart doesn't have keywords for public, private, or protected. Dart uses two-character indentation by convention instead of four. Add the following constructor to the Bicycle class: Bicycle( .cadence, .speed, .gear); this this this This constructor has no body, which is valid in Dart. If you forget the semicolon ( ) at the end of a no-body constructor, displays the following error: "A function body must be provided. ; Dart "Using in a constructor's parameter list is a handy shortcut for assigning values to instance variables. this The code above is equivalent to the following: Bicycle( cadence, speed, gear) { .cadence = cadence; .speed = speed; .gear = gear; } int int int this this this Instantiate and print a Bicycle instance main() { bike = Bicycle( , , ); print(bike); } void var 2 0 1 If you know that a variable's value won't change, then you can use final instead of var. The following output comes: Run it. Instance of 'Bicycle' Improve the output While the output "Instance of ‘Bicycle'" is correct, it's not very informative. All Dart classes have a method that you can override to provide more useful output. toString() @override toString() => ; String 'Bicycle: $speed mph' The annotation tells the analyzer that you are intentionally overriding a member. The analyzer raises an error if you failed to properly perform the override. @override Dart supports single or double quotes when specifying strings. Use string interpolation to put the value of an expression inside a string literal: . If the expression is an identifier, you can skip the braces: . ${expression} $variableName Shorten one-line functions or methods using fat arrow ( ) notation. => You should see the following output: Bicycle: mph 0 Add a read-only variable The original Java example defines as a read-only variable—it declares it as private and provides only a getter. Next, you'll provide the same functionality in Dart. speed To mark a Dart identifier as private to its library, start its name with an underscore ( ). You can convert to read-only by changing its name and adding a getter. _ speed In the Bicycle constructor, remove the speed parameter: Bicycle( .cadence, .gear); this this In main() , remove the second ( speed ) parameter from the call to the Bicycle constructor: bike = Bicycle( , ); var 2 1 Change the remaining occurrences of speed to _speed . (Two places) Initialize _speed to 0: _speed = ; int 0 Add the following getter to the Bicycle class: speed => _speed; int get Observations Uninitialized variables (even numbers) have the value . null The Dart compiler enforces library privacy for any identifier prefixed with an underscore. generally means that the identifier is visible only inside the file (not just the class) that the identifier is defined in. Library privacy By default, Dart provides implicit getters and setters for all public instance variables. You don't need to define your own getters or setters unless you want to enforce read-only or write-only variables, compute or verify a value, or update a value elsewhere. The original Java sample provided getters and setters for and . The Dart sample doesn't need explicit getters and setters for those, so it just uses instance variables. cadence gear You might start with a simple field, such as , and later refactor it to use getters and setters. The API stays the same. In other words, going from a field to a getter and setter is not a breaking change in Dart. bike.cadence Finish implementing speed as a read-only instance variable Add the following methods to the Bicycle class: applyBrake( decrement) { _speed -= decrement; } speedUp( increment) { _speed += increment; } void int void int The final code: { cadence; _speed = ; speed => _speed; gear; Bicycle( .cadence, .gear); applyBrake( decrement) { _speed -= decrement; } speedUp( increment) { _speed += increment; } toString() => ; } main() { bike = Bicycle( , ); (bike); } class Bicycle int int 0 int get int this this void int void int @override String 'Bicycle: mph' $_speed void var 2 1 print The final Dart example looks similar to the original Java , but is more compact at 23 lines instead of 40: Thanks for reading...