(12) Organize Classes
About
:octocat: GitHub: All of the example code: repo (link)
:page_facing_up: blog link: https://purrgramming.life/cs/programming/fp/ :star:
Package
Intro
Classes and objects are organized in packages.
To place a class or object inside a package, use a package clause at the top of your source file.
package progfun.examples
object Hello
...
This would place Hello in the package progfun.examples.
You can then refer to it by its fully qualified name, progfun.examples.Hello. For instance, to run the Hello program:
> scala progfun.examples.Hello

Example
package my
package pkg.hierarchy
object Data{
val course: "Functional Programming Principles"
}
What is the fully qualified name of ‘course’?
'my.pkg.hierarchy.Data.course'
‘Data’ contains ‘course’ and is defined in the ‘my.pkg.hierarchy’ package.
Import
Intro
You can import from either a package or an object.
Say we have a class Rational in package week3. You can use the class using its fully qualified name:
val r = week3.Rational(1, 2)
Alternatively, you can use an import:
import week3.Rational val r = Rational(1, 2)
Forms of Imports
Imports come in several forms:
Named imports
import week3.Rational // imports just Rational
import week3.{Rational, Hello} // imports both Rational and Hello
Wildcard import
import week3._ // imports everything in package week3
Some entities are automatically imported into any Scala program.
These are:
- All members of package scala
- All members of package java.lang
- All members of the singleton object scala.Predef.
Here are the fully qualified names
$$
\begin{array}{ll}
\text { Int } & \text { scala. Int } \
\text { Boolean } & \text { scala. Boolean } \
\text { Object } & \text { java.lang. Object } \
\text { require } & \text { scala. Predef.require } \
\text { assert } & \text { scala. Predef. assert }
\end{array}
$$
Scala’s Class Hierarchy
Any:
- The base type of all types
- Methods:
==, equals, hashCode, toString.
AnyRef:
- The base type of all reference types;
- Alias of
java.lang.Object
AnyVal:
- The base type of all primitive types.
Nothing:
- It is a subtype of every other type.
- There is no value of type Nothing
- To signal abnormal termination
- As an element type of empty collections

Example
The type of
if true then 1 else false
is AnyVal
val res0: AnyVal = 1