SlideShare una empresa de Scribd logo
1 de 92
Descargar para leer sin conexión
Dr. Martin Chapman
programming@kcl.ac.uk
martinchapman.co.uk/teaching
Programming Practice and Applications (4CCS1PPA)
Topic 3: Organising Your Code
Q: Do programs always execute line-by-line? 1
Thursday 6th October
To understand how to organise code
• In the same file
• Into different files
ORGANISING YOUR CODE: OBJECTIVES
2
Each file can only contain one public class.
The name of this class must match the name of the file in
which the class resides.
Therefore, at this stage, we will consider classes to be
roughly equivalent to files.
• One file for each class.
• Later on in the course, we’ll see that this isn’t strictly
true.
REMEMBER: CLASSES AND FILES
3
Organising Your Code Within The Same File
4
REMEMBER: A SLIGHTLY MORE COMPLEX PROGRAM
5
public class MartinPrinter {
public static void main(String[] args) {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
}
When we have more than one line in a program, the program
is executed line-by-line.
MartinPrinter.java
Being self-centred, I want to print my name three times to
the terminal.
Cool.
CODE REPETITION (1)
6
public class MartinPrinter {
public static void main(String[] args) {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
} MartinPrinter.java
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
ystem.out.println("|Martin|");
ystem.out.println("+------+");
ystem.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.pruntln("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
System.out.println("+------+");
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
System.out.println("|M
System.out.println("+-
System.out.println("+-
Being very self-centred, I want to print my name fifty times
to the terminal.
What.
CODE REPETITION (2)
7
This will take time, and I’m likely to make mistakes.
Did you spot the `pruntln’?
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
It would be useful if we could somehow label our print statement code,
it wouldn’t execute until we specifically said to, and we could call it as
many times as we like (3 times, for example).
LABELLING CODE (1)
8
`Print Martin’:
Go to `Print Martin’
Go to `Print Martin’
Go to `Print Martin’
We would still have to reference the label
(later, we’ll see how we can address this
issue), but the reference is simpler, it
would reduce the lines we need by a third,
and we would only have to write the print
code once.
These steps are not yet in a language that the computer can
understand.
We’re expressing or designing the solution we want using
written English.
We call this pseudocode.
There is no particular standard pseudocode syntax
(although efforts have been made to construct a standard
language), but personal consistency is important.
You will be expected to write pseudocode for your
assignment documentation (see KEATS).
ASIDE: PSEUDOCODE
9
🙈
If we were to be able to do the below, we would no longer be
executing our code line-by-line. We would start at the arrow,
and then:
EXECUTION ORDER
10
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
`Print Martin’:
Go to `Print Martin’
Go to `Print Martin’
Go to `Print Martin’
The arrow returns to the next `go to’
statement after each Martin is printed
because the JVM must execute all of
our requested lines of code.
Fortunately, we can do just this in Java by creating something called a method.
METHODS
11
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
}
We’ve already
seen a main
method.
This is now one of our
own methods and we can
have as many as we like.
MartinPrinter.java
Methods provide us with the labels we saw in the previous example in
the form of named sections of code.
METHODS: AN EXAMPLE (1) (LABELS)
12
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
}
`Print Martin’:
Go to `Print Martin’
Go to `Print Martin’
Go to `Print Martin’
MartinPrinter.java
The methods in a
class can be
called by any
other method in
that class
(usually).
🙈
We block off our code accordingly, so it is clear where these sections are.
METHODS: AN EXAMPLE (1) (BLOCKED OFF CODE)
13
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
}
Note the merit of
indentation once
multiple
methods are
introduced.
Everything is
still within
the same
class (the
same file).
MartinPrinter.java
🙈
When we want to run the code within a method, we write the name of the method
(including the brackets) and Java matches the correct place for execution to move to.
METHODS: AN EXAMPLE (1) (CALLING A METHOD)
14
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
}
Like matching method names, much of Java’s
control structure is about matching labels.
The location of
the target
method in the
class (before or
after) is
unimportant.
Unlike class names,
which are typically
nouns, methods names
are typically verbs
because they do
something.
MartinPrinter.java
We’ll discuss
the function of
the brackets
after the name
of the method
shortly.
As such, for now, we will implement methods
with unique names to avoid match conflicts.
🙈
Thus, the program runs as seen previously:
METHODS: AN EXAMPLE (1) (EXECUTION ORDER)
15
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
} MartinPrinter.java
Even though the
JVM is asked to
move to a different
place in the
program to execute
code, it cannot just
ignore other
statements that
have been entered
into our main
method. Thus, it
moves back to
execute them.
METHODS: AN EXAMPLE (1) (OUTPUT)
16
😴
It’s true that by labelling our code, we are able to facilitate the alteration of the
execution order of our program.
• Currently this allows us to call the same code multiple times within the
same class.
• I always aim to show you what certain syntax gives us in practice.
But also, more abstractly, when we label our code, we split our code into
distinct sections.
• This allows us to separate functionality in our class.
• Each method should perform a specific task.
• Thus, methods may only be used once.
We will see examples of this when we look at larger pieces of code.
METHODS AS A TOOL FOR CODE ORGANISATION (1)
17
Let’s write a class called , which contains a
method that prints the result of the second
millionth prime number (32452843) minus the first millionth
prime number (15485863).
Let’s call our method twice.
The syntax for subtraction is available in Topic 2.
LECTURE EXERCISE: LARGE PRIMES (1)
18
LargePrimes
subtractPrimes
LECTURE EXERCISE: LARGE PRIMES (2)
19
public class LargePrimes {
public static void subtractPrimes() {
System.out.println(32452843 - 15485863);
}
public static void main(String[] args) {
subtractPrimes();
subtractPrimes();
}
}
😴
We still aren’t really in a position to talk about public or static.
METHODS: AN EXAMPLE (1) (PUBLIC AND STATIC)
20
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
}
But, for now, it’s important to know that
any method called from a static method
must also be static.
MartinPrinter.java
But we can talk about void.
METHODS: AN EXAMPLE (1) (RETURN TYPES)
21
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
} MartinPrinter.java
I mentioned earlier that much of Java’s control structure
works with matching labels.
When something can be matched it can also be substituted (if
possible).
• e.g. Y = X, X = 7
• We can match X, substitute it for 7, and end up with Y = 7.
• Let’s code this…
METHOD RETURN VALUES (SUBSTITUTION) (1)
22
🙈
METHOD RETURN VALUES (SUBSTITUTION) (2)
23
Y = X, X = 7 so Y = 7
public class Substitutor {
public static void X() {
return 7;
}
public static void main(String[] args) {
int y = X();
System.out.println(y);
}
} (This will not compile)
X = 7Y = X Y = 7
?
?
🙈
METHOD RETURN VALUES (THE RETURN KEYWORD)
24
public class Substitutor {
public static void X() {
return 7;
}
public static void main(String[] args) {
int y = X();
System.out.println(y);
}
} (This will not compile)
When we use the
keyword return in
a method, any
matched
references to that
method will be
substituted by the
value given after
the return
statement.
The method
becomes the value
it returns.
7;
Return almost
always has to
be the last
action in a
method.
We noted previously that Java forces us to declare the type of
variables.
METHOD RETURN VALUES (RETURN TYPES) (1)
25
This allows assignment errors to be caught at compile time, and
increases the readability of our code.
The same is true of methods: we must specify which type of value will
be substituted if we call that method.
• This allows Java to check that we are doing sensible things with
the returned values, like not assigning them to unreasonable
types.
• From the previous example:
return 7; int y = X();
int myFirstIntegerVariable
7.07.0;
METHOD RETURN VALUES (RETURN TYPES) (2)
26
public class Substitutor {
public static void X() {
return 7;
}
public static void main(String[] args) {
int y = X();
System.out.println(y);
}
} (This will not compile)
So in reality, this
code will not work
if we continue to
use void.
Void means we do
not intend to
return anything,
which is clearly not
true in this case.
🙈
METHOD RETURN VALUES (RETURN TYPES) (3)
27
public class Substitutor {
public static int X() {
return 7;
}
public static void main(String[] args) {
int y = X();
System.out.println(y);
}
} (This will compile; Substitutor.java)
Instead we need to
change void to the
type of data we
intend to return.
In this case int.
🙈
METHODS: FLOW OF DATA
28
public class Substitutor {
public static int X() {
return 7;
}
public static void main(String[] args) {
int y = X();
System.out.println(y);
}
} Substitutor.java
It might be useful
to think about the
return value
following a path
back to the place
in which it was
called.
7
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
} MartinPrinter.java
Back in MartinPrinter however, it is perfectly acceptable to write void
as we do not have a return statement.
SUBSTITUTION DOESN’T ALWAYS OCCUR
29
Moreover, the
method’s function
does not necessitate
a return value.
Thus, there is no real substitution
in this instance.
🤐
ASIDE: WHAT HAPPENS WHEN YOU CALL A METHOD
30
All the storage elements pertinent to a method are pushed onto
an abstract stack structure, and then popped off once the method
finishes, and we return to where we started.
main
printMartin
Let’s alter the operation of so that it
instead returns the result of subtracting two prime numbers,
rather than simply printing the result.
We can then print inside the main method (twice).
LECTURE EXERCISE: LARGE PRIMES (3)
31
subtractPrimes
LECTURE EXERCISE: LARGE PRIMES (4)
32
public class LargePrimes {
public static int subtractPrimes() {
return 67867967 - 49979687;
}
public static void main(String[] args) {
System.out.println(subtractPrimes());
System.out.println(subtractPrimes());
}
}
😴
WE’RE STARTING TO BUILD UP A TEMPLATE FOR METHODS
33
public static int X() {
return 7;
}
Methods, so
far, have to be
public and
static.
We specify the
return type We give our
method a name
What about these
brackets?
So far we have considered what methods output (return).
METHODS: INPUT AND OUTPUT
34
System.out.println("+------+");
System.out.println("| |");
System.out.println("+------+");
?
return 7;
What about method input?
What if I didn’t just want to print `Martin’ in a box to the
screen, but any number, an arbitrary number of times?
AIM: BOXED NUMBERS
35
I don’t just want to reuse the same code, I want to alter its
operation, in some small way.
🙈
It would be useful if we could not only label the code, but
also provide placeholders for information to be filled in later.
LABELLING CODE (2)
36
System.out.println("+------+");
System.out.println("| |");
System.out.println("+------+");
`Print number’:
<NUM>
Go to `Print number’ set NUM = 1
Go to `Print number’ set NUM = 2
Go to `Print number’ set NUM = 3
123
ASIDE: MAIL MERGE PLACEHOLDERS
37
Fortunately, we can do just this in Java.
METHODS: AN EXAMPLE (2)
38
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
`Print number’:
Go to `Print number’
Go to `Print number’
Go to `Print number’
<NUM>
set NUM = 1
set NUM = 2
set NUM = 3
NumberPrinter.java
😴
Whenever a piece of text (e.g. ) is added, using the plus symbol,
to a variable (or another piece of text), and then printed to the
terminal, they will appear side-by-side.
This is known as concatenation (loosely).
Open questions:
• Where else does concatenation occur?
• Is this the only way in which the `+’ symbol is used?
• How is a variable converted to text?
ASIDE: CONCATENATION (1)
39
"|"
In this example, you will see the following syntax:
System.out.println("|" + num + "|");
ASIDE: CONCATENATION (2)
40
METHODS: AN EXAMPLE (2) (BRACKETS)
41
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
Let’s talk about the brackets.
NumberPrinter.java
We use the brackets at the end of a method to define our
placeholders (e.g. <NUM>).
• These are variable declarations, of a form you should be
familiar with from Topic 2.
PARAMETERS
42
• We call these placeholder variable declarations parameters.
Once defined, these parameters (placeholders) can be referenced
anywhere inside the method.
If we want to replace our parameters with values (like replacing
<NUM> with the values 1, 2 and 3 previously) we have to assign
values to these parameters.
printNumber(int num) {
METHODS: AN EXAMPLE (2) (PASSING DATA) (1)
43
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
To assign a parameter, we have to call the method
with a value written in brackets next to it.
NumberPrinter.java
🙈
Remember that changing Java execution order, for simple method
calls, relies on matching labels; we have to match the method name
(and the brackets) in order to call the method and alter the flow of
the program.
MATCHING LABELS
44
public static void printName() {
printName();
public static void printNumber(int number) {
printNumber(1);
This same is true for methods with parameters: we have to match
the name, the existence of a parameter and the type of the
parameter in order to call the method.
The format of a method is often
referred to as its signature.
METHODS: AN EXAMPLE (2) (PASSING DATA) (2)
45
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
When this line is executed, the method will be matched (name, brackets, value and type),
and any data in the brackets will be pushed to the waiting parameters of the method.
NumberPrinter.java
METHODS: AN EXAMPLE (2) (PASSING DATA) (3)
46
public class NumberPrinter {
public static void printNumber(int num = 1) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
Thus we effectively transform the parameter into an assigned variable.
(Not real Java code.)
🙈
METHODS: AN EXAMPLE (2) (PASSING DATA) (4)
47
public class NumberPrinter {
public static void printNumber(1) {
System.out.println("+------+");
System.out.println("|" + 1 + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
As such, we effectively transform all references to this parameter into the
value that is pushed.
(Not real Java code.)
3
3
2
2
1
1
We then repeat for the
remaining calls, and receive
the desired output…
OUTPUT: BOXED NUMBERS
48
🙈
METHODS AND PARAMETERS: FLOW OF DATA
49
Again, It can be helpful to think about data flowing through the program.
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
1
NumberPrinter.java
We will show data
flow like this again.
😴
So we now know that methods offer us (within the same
class) the ability to:
• Use the same code multiple times.
• Separate functionality.
• Use the same code in different ways.
METHODS AS A TOOL FOR CODE ORGANISATION (2)
50
😴
A further matching constraint: the number of parameters must
be the same and the types must be in the same order.
The parameter syntax gives us a lot of freedom.
We can write a method with as many parameters as we like.
MULTIPLE PARAMETERS
51
But we can only ever return one thing (not equivalent to value).
• Otherwise, which returned entity would we substitute the
call to the method with?
public static void printNumber(int num1, double num2) {
printNumber(1, 1.0);
FITTING THE RIGHT PARAMETERS
52
int num1
int
double num2
double
Let’s evolve the functionality from our class
into a new class that contains a method which
allows us to subtract any two numbers from each other.
Then, let’s subtract 15485863 from 32452843 again, and then
go ahead and subtract 49979687 from 67867967.
LECTURE EXERCISE: SUBTRACTION (1)
53
LargePrimes
Subtractor
LECTURE EXERCISE: SUBTRACTION (2)
54
public class Subtractor {
public static void subtract(int firstOperand, int secondOperand) {
System.out.println(firstOperand - secondOperand);
}
public static void main(String[] args) {
subtract(32452843, 15485863);
subtract(67867967, 49979687);
}
}
Anytime we now want to perform a subtraction in our class, we can simply
call the subtract method (because we’re lazy).
Open question: Should we
print the result, or return it
for printing?
😴
So far, we’ve only passed literal values to our methods, but
there’s no reason we can’t pass variables instead, as the
matching rules relating to type are still maintained.
PASS BY REFERENCE VS. PASS BY VALUE (1)
55
When we do this, a natural question to ask is, if we change
the passed variable inside the method, does the original
value change?
int numberOne = 1;
printNumber(numberOne);
printNumber(1);
🖥
Caveat: This is quite a weak example, more to come.
PASS BY REFERENCE VS. PASS BY VALUE (2)
56Topic3-1
public class NumberChanger {
public static void changeNumber(int changeMe) {
changeMe = 2;
}
public static void main(String[] args) {
int numberOne = 1;
changeNumber(numberOne);
System.out.println(numberOne);
}
}
Will the print
statement print 1 or
2?
Does Java pass the
variable itself (the
reference) or a copy
of the value held in
the variable?
Try this out in the
lab.NumberChanger.java
We now know a little bit more about main.
• We know that main can never return anything (where would it go
anyway?)
• This is a parameter, so main must accept some information.
• But unfortunately, we still aren’t in a position to discuss what is
passed to the main method.
• And of course poor old public and static are neglected again.
BACK TO MAIN
57
public static void main(String[] args) {
🖥
Type out all the method syntax we have seen (which you should
be doing anyway), and annotate each method with a brief
description of what that method does:
METHOD ANNOTATION
58Topic3-2
/**
* Prints the supplied number surrounded by a box.
*/
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
ASIDE: COMMENT TYPES
59
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
// Previously we use single line methods to annotate our code
/* We can also use multi-line comments, if we like,
* which start with a single star after a slash.
*/
/**
* For methods, we should use special documentation comments,
* which start with a double star after a slash.
*/
🖥
Once you’ve typed out all the methods and added documentation
comments you should try and break things.
• Remove parameters, remove names, change names, change
return types. Call the method in different ways.
BREAKING THE RULES, AGAIN
60Topic3-2
• Use single line comments to make notes for yourself again.
// We can't call methods with a non-castable type
changeNumber(1.0);
Organising Your Code Into Different Files
61
So far, we’ve introduced two key methods, one for printing
Martin…
MARTIN PRINTER AND NUMBER PRINTER (1)
62
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void main(String[] args) {
printMartin();
printMartin();
printMartin();
}
} MartinPrinter.java
…and one for printing numbers.
MARTIN PRINTER AND NUMBER PRINTER (2)
63
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
public static void main(String[] args) {
printNumber(1);
printNumber(2);
printNumber(3);
}
}
NumberPrinter.java
I kept these methods in distinct classes (in different files) to
enable you to run most of the examples you find
independently, in the laboratory sessions.
But what if we wanted to call both of these methods from
the same main method?
• We want to print `Martin’ followed by his IQ (191).
MARTIN PRINTER AND NUMBER PRINTER (3)
64
printMartin();
printNumber(191);
SEPARATING FUNCTIONALITY
65
Because we can have as many methods as we wish in a class,
we could just move these methods into the same class and call
them from the same main method.
Issues with this? What would we call this class?
It was actually
quite nice having
separate
functionality in
different classes,
while using the
class name as a
label for that
functionality.
public class {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
public static void printNumber(int num) {
System.out.println("+------+");
MartinPrinterAndNumberPrinter
There’s also the risk of saturating a single class with too
many methods (remember we can have as many methods in
a class as we wish).
What’s the solution?
TOO MANY METHODS
66
🤓
The solution is to have have neither
__________________ in the same class as the main method!
Instead, we create a new class that will only hold the main method.
We are going to call this class Driver because it is going to drive
the rest of the code in our program, and serve as a hub for making
things happen.
This class will communicate with both the and
_______________classes from which we will remove the main
method.
• If we’re trying to run multiple pieces of code in different files,
typically we can only have one main method.
SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (1)
67
printMartin() or
printNumber(int num)
NumberPrinter
MartinPrinter
Stored in a file called MartinPrinter.java
SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (2)
68
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
}
SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (3)
69
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
}
}
Stored in a file called NumberPrinter.java
SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (4)
70
public class Driver {
public static void main(String[] args) {
}
}
Stored in a file called Driver.java
ASIDE: FILES, CLASSES AND FOLDERS
71
If you wish to use the code from one class in another class
without any additional code, those classes must be in the
same folder.
SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (4)
72
public class Driver {
public static void main(String[] args) {
}
}
What now?
printMartin();
printNumber(191);
Stored in a file called Driver.java
Not that easy.
ERROR: CANNOT FIND SYMBOL
73
🤓
If we want to access a method in another class (file), we have to go
through a very specific process.
This process involves making a copy of all the code in that class and
storing it inside a variable (!).
We can then interact with the copied code through the variable in order
to call methods within that code.
ACCESSING A METHOD IN ANOTHER CLASS (FILE)
74
🙈
LET’S IMAGINE WHAT THIS MIGHT LOOK LIKE…
75
public class Driver {
public static void main(String[] args) {
copyOfMartinPrinter
}
}
Type
Driver.java
This is our special variable
declaration, which is still a type
followed by a name (we have chosen).
😴
public class Driver {
public static void main(String[] args) {
copyOfMartinPrinter
}
}
Remember that for something to be a variable it must have
a type followed by a name.
Given that we have a variable, storing a copy of a class, what
should the type of this variable be?
THE VARIABLE TYPE USED TO STORE A COPY OF A CLASS (1)
76
Type
Driver.java
😴
public class Driver {
public static void main(String[] args) {
copyOfMartinPrinter
}
}
The answer is the name of the class we’re copying.
This makes sense because a variable type describes (the
format of) what the variable will contain (in this case a copy of
a particular class).
THE VARIABLE TYPE USED TO STORE A COPY OF A CLASS (2)
77
TypeMartinPrinter
Driver.java
🙈
public class Driver {
public static void main(String[] args) {
MartinPrinter copyOfMartinPrinter
}
}
MAKING A COPY OF A CLASS
78
new MartinPrinter();
Driver.java
=
How do we do this?
We need to request a new copy of the class. We use the labelled name of
the class so that Java is able to match the class we want.
Then we need to put this copy inside the variable, using an assignment,
in the same way that we put values inside variables.
We will call a variable that contains a copy of a class an object.
(We’ll come back to what the
brackets mean).
This process is called making an object of a class, and
forms the foundation of object-oriented programming.
79
🤓
If we want to access a method in another class (file), we have to go
through a very specific process.
This process involves making a copy of all the code in that class and
storing it inside a variable (!).
We can then interact with the copied code through the variable in order
to call methods within that code.
ACCESSING A METHOD IN ANOTHER CLASS (FILE)
80
In order to interact with the code stored in a variable (object),
and thus call methods, we need to open the variable (object)
up and look inside.
To do this we write our variable (object) name and then a dot.
INTERACTING WITH COPIES OF CLASSES (OBJECTS) (1)
81
public class Driver {
public static void main(String[] args) {
MartinPrinter copyOfMartinPrinter
}
}
new MartinPrinter();=
copyOfMartinPrinter.
Driver.java
When we write a dot after an object (a variable containing a
copy of a class), we can see inside the object, into the
copied class, and have the option to reference any of the
(public) identifiers within it.
INTERACTING WITH COPIES OF CLASSES (OBJECTS) (2)
82
public class Driver {
public static void main(String[] args) {
MartinPrinter copyOfMartinPrinter
copyOfMartinPrinter.
}
}
new MartinPrinter();=
printMartin();
In other words, we can call any
of the methods within the copy.
Driver.java
INTERACTING WITH COPIES OF CLASSES (OBJECTS) (3)
83
public class MartinPrinter {
public static void printMarti
System.out.println("+-----
System.out.println("|Marti
System.out.println("+-----
}
}
copyOfMartinPrinter.
To reiterate: The dot is an
entry point through the
object into the class copy
through which we
reference items in that
copy of the class.
public class Driver {
public static void main(String[] args) {
MartinPrinter copyOfMartinPrinter = new MartinPrinter();
copyOfMartinPrinter.printMartin();
NumberPrinter copyOfNumberPrinter = new NumberPrinter();
copyOfNumberPrinter.printNumber(191);
}
}
Driver.java
ACHIEVING OUR GOAL
84
• We want to print `Martin’ followed by his IQ (191).
I’m using blank lines here more liberally than
usual, in order to make my code clearer.
When accessing a method through an object,
we call methods with parameters in exactly
the same way.
THE OUTPUT
85
Note that we only need to compile the driver class directly, the
compiler will automatically compile any other referenced classes.
🙈
ASIDE: DOCUMENTING OUR CODE WITH CLASS DIAGRAMS
86
The names of the classes
You can ignore these for now
You will need to produce these diagrams (i.e. draw them yourselves) as
part of your documentation for each assignment.
Now that we have a program of reasonable structural complexity, it’s
useful to have a documentation technique to visualise our class structure.
The names of the methods
Parameters return values
😴
public class MartinPrinter {
public static void printMartin() {
System.out.println("+------+");
System.out.println("|Martin|");
System.out.println("+------+");
}
}
public class NumberPrinter {
public static void printNumber(int num) {
System.out.println("+------+");
System.out.println("|" + num + "|");
System.out.println("+------+");
Methods have to be static if they are called from a method
that is also static.
ONE FINAL THING: REMEMBER OUR RULE ABOUT STATIC
87
Because these
methods are now
being called
through an object
we can drop the
static keyword.
Object-oriented purists would be angry that I’m only selling
classes (and their associated objects) as a way to organise
code, because the idea is much more powerful.
• But I think this is a good initial way to understand
things.
• We will gradually see more important reasons for using
classes and objects going forward.
If any of the further information on objects and classes
confuses you, just come back to this idea that an object is
just a copy of the code in a class.
CLASSES AND OBJECTS
88
🤐
ASIDE: OBJECTS IN MEMORY
89
In reality, unlike primitive values, objects are stored in
another area of the JVM’s memory known as the heap. The
variable containing the copy of the class is actually a
memory reference from a variable on the stack to an object
on the heap.
We’ll look at
this in more
detail next
semester.
We will use the definition of an object quite loosely in the first
semester of PPA, in order to simplify things, and help your initial
understanding.
Let’s wrap the `Hello World’ functionality from Topic 1 (i.e. a
single print statement printing `Hello World’) in a method
called , within a class called ,
and then make an object of this class in a ______ class in
order to call the method.
LECTURE EXERCISE: HELLO WORLD (1)
90
printHelloWorld
Driver
HelloWorld
printHelloWorld
LECTURE EXERCISE: HELLO WORLD (2)
91
public class HelloWorld {
public void printHelloWorld() {
System.out.println("Hello World");
}
}
public class Driver {
public static void main(String[] args) {
HelloWorld copyOfHelloWorld = new HelloWorld();
copyOfHelloWorld.printHelloWorld();
}
}
Dr. Martin Chapman
programming@kcl.ac.uk
martinchapman.co.uk/teaching
Programming Practice and Applications (4CCS1PPA)
Topic 3: Organising Your Code
These slides will be available on KEATS, but will be subject to
ongoing amendments. Therefore, please always download a new
version of these slides when approaching an assessed piece of work,
or when preparing for a written assessment. 92
Thursday 6th October

Más contenido relacionado

La actualidad más candente

MS.Net Interview Questions - Simplified
MS.Net Interview Questions - SimplifiedMS.Net Interview Questions - Simplified
MS.Net Interview Questions - SimplifiedMohd Manzoor Ahmed
 
Chapter 9 Interface
Chapter 9 InterfaceChapter 9 Interface
Chapter 9 InterfaceOUM SAOKOSAL
 
Templates and Exception Handling in C++
Templates and Exception Handling in C++Templates and Exception Handling in C++
Templates and Exception Handling in C++Nimrita Koul
 
Programming in Java: Storing Data
Programming in Java: Storing DataProgramming in Java: Storing Data
Programming in Java: Storing DataMartin Chapman
 
Polymorphism presentation in java
Polymorphism presentation in javaPolymorphism presentation in java
Polymorphism presentation in javaAhsan Raja
 
Xamarin: Inheritance and Polymorphism
Xamarin: Inheritance and PolymorphismXamarin: Inheritance and Polymorphism
Xamarin: Inheritance and PolymorphismEng Teong Cheah
 
Exception Handling in C#
Exception Handling in C#Exception Handling in C#
Exception Handling in C#Abid Kohistani
 

La actualidad más candente (8)

MS.Net Interview Questions - Simplified
MS.Net Interview Questions - SimplifiedMS.Net Interview Questions - Simplified
MS.Net Interview Questions - Simplified
 
Chapter 9 Interface
Chapter 9 InterfaceChapter 9 Interface
Chapter 9 Interface
 
Java
JavaJava
Java
 
Templates and Exception Handling in C++
Templates and Exception Handling in C++Templates and Exception Handling in C++
Templates and Exception Handling in C++
 
Programming in Java: Storing Data
Programming in Java: Storing DataProgramming in Java: Storing Data
Programming in Java: Storing Data
 
Polymorphism presentation in java
Polymorphism presentation in javaPolymorphism presentation in java
Polymorphism presentation in java
 
Xamarin: Inheritance and Polymorphism
Xamarin: Inheritance and PolymorphismXamarin: Inheritance and Polymorphism
Xamarin: Inheritance and Polymorphism
 
Exception Handling in C#
Exception Handling in C#Exception Handling in C#
Exception Handling in C#
 

Similar a Programming in Java: Organising Your Code

Programming in Java: Why Object-Orientation?
Programming in Java: Why Object-Orientation?Programming in Java: Why Object-Orientation?
Programming in Java: Why Object-Orientation?Martin Chapman
 
01-ch01-1-println.ppt java introduction one
01-ch01-1-println.ppt java introduction one01-ch01-1-println.ppt java introduction one
01-ch01-1-println.ppt java introduction onessuser656672
 
Ch01 basic-java-programs
Ch01 basic-java-programsCh01 basic-java-programs
Ch01 basic-java-programsJames Brotsos
 
ch01-basic-java-programs.ppt
ch01-basic-java-programs.pptch01-basic-java-programs.ppt
ch01-basic-java-programs.pptMahyuddin8
 
Programming in Java: Library Classes
Programming in Java: Library ClassesProgramming in Java: Library Classes
Programming in Java: Library ClassesMartin Chapman
 
Desing pattern prototype-Factory Method, Prototype and Builder
Desing pattern prototype-Factory Method, Prototype and Builder Desing pattern prototype-Factory Method, Prototype and Builder
Desing pattern prototype-Factory Method, Prototype and Builder paramisoft
 
Objectives Assignment 09 Applications of Stacks COS.docx
Objectives Assignment 09 Applications of Stacks COS.docxObjectives Assignment 09 Applications of Stacks COS.docx
Objectives Assignment 09 Applications of Stacks COS.docxdunhamadell
 
Java method present by showrov ahamed
Java method present by showrov ahamedJava method present by showrov ahamed
Java method present by showrov ahamedMd Showrov Ahmed
 
TypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersRutenis Turcinas
 
import java.util.Scanner;Henry Cutler ID 1234 7202.docx
import java.util.Scanner;Henry Cutler ID 1234  7202.docximport java.util.Scanner;Henry Cutler ID 1234  7202.docx
import java.util.Scanner;Henry Cutler ID 1234 7202.docxwilcockiris
 
Programming in Java: Getting Started
Programming in Java: Getting StartedProgramming in Java: Getting Started
Programming in Java: Getting StartedMartin Chapman
 
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides:  Let's build macOS CLI Utilities using SwiftMobileConf 2021 Slides:  Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides: Let's build macOS CLI Utilities using SwiftDiego Freniche Brito
 

Similar a Programming in Java: Organising Your Code (20)

Programming in Java: Why Object-Orientation?
Programming in Java: Why Object-Orientation?Programming in Java: Why Object-Orientation?
Programming in Java: Why Object-Orientation?
 
01-ch01-1-println.ppt java introduction one
01-ch01-1-println.ppt java introduction one01-ch01-1-println.ppt java introduction one
01-ch01-1-println.ppt java introduction one
 
Ch01 basic-java-programs
Ch01 basic-java-programsCh01 basic-java-programs
Ch01 basic-java-programs
 
ch01-basic-java-programs.ppt
ch01-basic-java-programs.pptch01-basic-java-programs.ppt
ch01-basic-java-programs.ppt
 
02 prepcode
02 prepcode02 prepcode
02 prepcode
 
Methods in Java
Methods in JavaMethods in Java
Methods in Java
 
java intro.pptx.pdf
java intro.pptx.pdfjava intro.pptx.pdf
java intro.pptx.pdf
 
Java practical
Java practicalJava practical
Java practical
 
Programming in Java: Library Classes
Programming in Java: Library ClassesProgramming in Java: Library Classes
Programming in Java: Library Classes
 
Java Programming
Java ProgrammingJava Programming
Java Programming
 
Desing pattern prototype-Factory Method, Prototype and Builder
Desing pattern prototype-Factory Method, Prototype and Builder Desing pattern prototype-Factory Method, Prototype and Builder
Desing pattern prototype-Factory Method, Prototype and Builder
 
Objectives Assignment 09 Applications of Stacks COS.docx
Objectives Assignment 09 Applications of Stacks COS.docxObjectives Assignment 09 Applications of Stacks COS.docx
Objectives Assignment 09 Applications of Stacks COS.docx
 
Java method present by showrov ahamed
Java method present by showrov ahamedJava method present by showrov ahamed
Java method present by showrov ahamed
 
Tech talks#6: Code Refactoring
Tech talks#6: Code RefactoringTech talks#6: Code Refactoring
Tech talks#6: Code Refactoring
 
Computer programming 2 Lesson 15
Computer programming 2  Lesson 15Computer programming 2  Lesson 15
Computer programming 2 Lesson 15
 
TypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack Developers
 
import java.util.Scanner;Henry Cutler ID 1234 7202.docx
import java.util.Scanner;Henry Cutler ID 1234  7202.docximport java.util.Scanner;Henry Cutler ID 1234  7202.docx
import java.util.Scanner;Henry Cutler ID 1234 7202.docx
 
Programming in Java: Getting Started
Programming in Java: Getting StartedProgramming in Java: Getting Started
Programming in Java: Getting Started
 
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides:  Let's build macOS CLI Utilities using SwiftMobileConf 2021 Slides:  Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
 
Maxbox starter
Maxbox starterMaxbox starter
Maxbox starter
 

Más de Martin Chapman

Principles of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningPrinciples of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningMartin Chapman
 
Principles of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsPrinciples of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsMartin Chapman
 
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Martin Chapman
 
Technical Validation through Automated Testing
Technical Validation through Automated TestingTechnical Validation through Automated Testing
Technical Validation through Automated TestingMartin Chapman
 
Scalable architectures for phenotype libraries
Scalable architectures for phenotype librariesScalable architectures for phenotype libraries
Scalable architectures for phenotype librariesMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Using AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsUsing AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Principles of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwarePrinciples of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwareMartin Chapman
 
Principles of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwarePrinciples of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwareMartin Chapman
 
Principles of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthPrinciples of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthMartin Chapman
 
Principles of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcarePrinciples of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcareMartin Chapman
 
Principles of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsPrinciples of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsMartin Chapman
 
Principles of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgePrinciples of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgeMartin Chapman
 
Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Martin Chapman
 
Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Martin Chapman
 
Principles of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsPrinciples of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsMartin Chapman
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Martin Chapman
 
Using Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareUsing Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareMartin Chapman
 
Using CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingUsing CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingMartin Chapman
 

Más de Martin Chapman (20)

Principles of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learningPrinciples of Health Informatics: Artificial intelligence and machine learning
Principles of Health Informatics: Artificial intelligence and machine learning
 
Principles of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systemsPrinciples of Health Informatics: Clinical decision support systems
Principles of Health Informatics: Clinical decision support systems
 
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
Mechanisms for Integrating Real Data into Search Game Simulations: An Applica...
 
Technical Validation through Automated Testing
Technical Validation through Automated TestingTechnical Validation through Automated Testing
Technical Validation through Automated Testing
 
Scalable architectures for phenotype libraries
Scalable architectures for phenotype librariesScalable architectures for phenotype libraries
Scalable architectures for phenotype libraries
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Using AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patientsUsing AI to autonomously identify diseases within groups of patients
Using AI to autonomously identify diseases within groups of patients
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Principles of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical softwarePrinciples of Health Informatics: Evaluating medical software
Principles of Health Informatics: Evaluating medical software
 
Principles of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical softwarePrinciples of Health Informatics: Usability of medical software
Principles of Health Informatics: Usability of medical software
 
Principles of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile healthPrinciples of Health Informatics: Social networks, telehealth, and mobile health
Principles of Health Informatics: Social networks, telehealth, and mobile health
 
Principles of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcarePrinciples of Health Informatics: Communication systems in healthcare
Principles of Health Informatics: Communication systems in healthcare
 
Principles of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systemsPrinciples of Health Informatics: Terminologies and classification systems
Principles of Health Informatics: Terminologies and classification systems
 
Principles of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledgePrinciples of Health Informatics: Representing medical knowledge
Principles of Health Informatics: Representing medical knowledge
 
Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...Principles of Health Informatics: Informatics skills - searching and making d...
Principles of Health Informatics: Informatics skills - searching and making d...
 
Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...Principles of Health Informatics: Informatics skills - communicating, structu...
Principles of Health Informatics: Informatics skills - communicating, structu...
 
Principles of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systemsPrinciples of Health Informatics: Models, information, and information systems
Principles of Health Informatics: Models, information, and information systems
 
Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...Using AI to understand how preventative interventions can improve the health ...
Using AI to understand how preventative interventions can improve the health ...
 
Using Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research SoftwareUsing Microservices to Design Patient-facing Research Software
Using Microservices to Design Patient-facing Research Software
 
Using CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotypingUsing CWL to support EHR-based phenotyping
Using CWL to support EHR-based phenotyping
 

Último

Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Mark Reed
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONHumphrey A Beña
 
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSGRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSJoshuaGantuangco2
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4MiaBumagat1
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceSamikshaHamane
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxnelietumpap1
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxthorishapillay1
 
ACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfSpandanaRallapalli
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...Postal Advocate Inc.
 
Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxAshokKarra1
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxMaryGraceBautista27
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptxmary850239
 
How to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPHow to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPCeline George
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Celine George
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPCeline George
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxDr.Ibrahim Hassaan
 

Último (20)

Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
 
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSGRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in Pharmacovigilance
 
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptxYOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptx
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptx
 
ACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdf
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
 
Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptx
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptx
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx
 
How to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPHow to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERP
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERP
 
YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptxYOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptx
 

Programming in Java: Organising Your Code

  • 1. Dr. Martin Chapman programming@kcl.ac.uk martinchapman.co.uk/teaching Programming Practice and Applications (4CCS1PPA) Topic 3: Organising Your Code Q: Do programs always execute line-by-line? 1 Thursday 6th October
  • 2. To understand how to organise code • In the same file • Into different files ORGANISING YOUR CODE: OBJECTIVES 2
  • 3. Each file can only contain one public class. The name of this class must match the name of the file in which the class resides. Therefore, at this stage, we will consider classes to be roughly equivalent to files. • One file for each class. • Later on in the course, we’ll see that this isn’t strictly true. REMEMBER: CLASSES AND FILES 3
  • 4. Organising Your Code Within The Same File 4
  • 5. REMEMBER: A SLIGHTLY MORE COMPLEX PROGRAM 5 public class MartinPrinter { public static void main(String[] args) { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } } When we have more than one line in a program, the program is executed line-by-line. MartinPrinter.java
  • 6. Being self-centred, I want to print my name three times to the terminal. Cool. CODE REPETITION (1) 6 public class MartinPrinter { public static void main(String[] args) { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } } MartinPrinter.java
  • 7. ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); ystem.out.println("|Martin|"); ystem.out.println("+------+"); ystem.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.pruntln("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); System.out.println("+------+"); System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- System.out.println("|M System.out.println("+- System.out.println("+- Being very self-centred, I want to print my name fifty times to the terminal. What. CODE REPETITION (2) 7 This will take time, and I’m likely to make mistakes. Did you spot the `pruntln’?
  • 8. System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); It would be useful if we could somehow label our print statement code, it wouldn’t execute until we specifically said to, and we could call it as many times as we like (3 times, for example). LABELLING CODE (1) 8 `Print Martin’: Go to `Print Martin’ Go to `Print Martin’ Go to `Print Martin’ We would still have to reference the label (later, we’ll see how we can address this issue), but the reference is simpler, it would reduce the lines we need by a third, and we would only have to write the print code once.
  • 9. These steps are not yet in a language that the computer can understand. We’re expressing or designing the solution we want using written English. We call this pseudocode. There is no particular standard pseudocode syntax (although efforts have been made to construct a standard language), but personal consistency is important. You will be expected to write pseudocode for your assignment documentation (see KEATS). ASIDE: PSEUDOCODE 9
  • 10. 🙈 If we were to be able to do the below, we would no longer be executing our code line-by-line. We would start at the arrow, and then: EXECUTION ORDER 10 System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); `Print Martin’: Go to `Print Martin’ Go to `Print Martin’ Go to `Print Martin’ The arrow returns to the next `go to’ statement after each Martin is printed because the JVM must execute all of our requested lines of code.
  • 11. Fortunately, we can do just this in Java by creating something called a method. METHODS 11 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } We’ve already seen a main method. This is now one of our own methods and we can have as many as we like. MartinPrinter.java
  • 12. Methods provide us with the labels we saw in the previous example in the form of named sections of code. METHODS: AN EXAMPLE (1) (LABELS) 12 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } `Print Martin’: Go to `Print Martin’ Go to `Print Martin’ Go to `Print Martin’ MartinPrinter.java The methods in a class can be called by any other method in that class (usually).
  • 13. 🙈 We block off our code accordingly, so it is clear where these sections are. METHODS: AN EXAMPLE (1) (BLOCKED OFF CODE) 13 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } Note the merit of indentation once multiple methods are introduced. Everything is still within the same class (the same file). MartinPrinter.java
  • 14. 🙈 When we want to run the code within a method, we write the name of the method (including the brackets) and Java matches the correct place for execution to move to. METHODS: AN EXAMPLE (1) (CALLING A METHOD) 14 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } Like matching method names, much of Java’s control structure is about matching labels. The location of the target method in the class (before or after) is unimportant. Unlike class names, which are typically nouns, methods names are typically verbs because they do something. MartinPrinter.java We’ll discuss the function of the brackets after the name of the method shortly. As such, for now, we will implement methods with unique names to avoid match conflicts.
  • 15. 🙈 Thus, the program runs as seen previously: METHODS: AN EXAMPLE (1) (EXECUTION ORDER) 15 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } MartinPrinter.java Even though the JVM is asked to move to a different place in the program to execute code, it cannot just ignore other statements that have been entered into our main method. Thus, it moves back to execute them.
  • 16. METHODS: AN EXAMPLE (1) (OUTPUT) 16
  • 17. 😴 It’s true that by labelling our code, we are able to facilitate the alteration of the execution order of our program. • Currently this allows us to call the same code multiple times within the same class. • I always aim to show you what certain syntax gives us in practice. But also, more abstractly, when we label our code, we split our code into distinct sections. • This allows us to separate functionality in our class. • Each method should perform a specific task. • Thus, methods may only be used once. We will see examples of this when we look at larger pieces of code. METHODS AS A TOOL FOR CODE ORGANISATION (1) 17
  • 18. Let’s write a class called , which contains a method that prints the result of the second millionth prime number (32452843) minus the first millionth prime number (15485863). Let’s call our method twice. The syntax for subtraction is available in Topic 2. LECTURE EXERCISE: LARGE PRIMES (1) 18 LargePrimes subtractPrimes
  • 19. LECTURE EXERCISE: LARGE PRIMES (2) 19 public class LargePrimes { public static void subtractPrimes() { System.out.println(32452843 - 15485863); } public static void main(String[] args) { subtractPrimes(); subtractPrimes(); } }
  • 20. 😴 We still aren’t really in a position to talk about public or static. METHODS: AN EXAMPLE (1) (PUBLIC AND STATIC) 20 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } But, for now, it’s important to know that any method called from a static method must also be static. MartinPrinter.java
  • 21. But we can talk about void. METHODS: AN EXAMPLE (1) (RETURN TYPES) 21 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } MartinPrinter.java
  • 22. I mentioned earlier that much of Java’s control structure works with matching labels. When something can be matched it can also be substituted (if possible). • e.g. Y = X, X = 7 • We can match X, substitute it for 7, and end up with Y = 7. • Let’s code this… METHOD RETURN VALUES (SUBSTITUTION) (1) 22
  • 23. 🙈 METHOD RETURN VALUES (SUBSTITUTION) (2) 23 Y = X, X = 7 so Y = 7 public class Substitutor { public static void X() { return 7; } public static void main(String[] args) { int y = X(); System.out.println(y); } } (This will not compile) X = 7Y = X Y = 7 ? ?
  • 24. 🙈 METHOD RETURN VALUES (THE RETURN KEYWORD) 24 public class Substitutor { public static void X() { return 7; } public static void main(String[] args) { int y = X(); System.out.println(y); } } (This will not compile) When we use the keyword return in a method, any matched references to that method will be substituted by the value given after the return statement. The method becomes the value it returns. 7; Return almost always has to be the last action in a method.
  • 25. We noted previously that Java forces us to declare the type of variables. METHOD RETURN VALUES (RETURN TYPES) (1) 25 This allows assignment errors to be caught at compile time, and increases the readability of our code. The same is true of methods: we must specify which type of value will be substituted if we call that method. • This allows Java to check that we are doing sensible things with the returned values, like not assigning them to unreasonable types. • From the previous example: return 7; int y = X(); int myFirstIntegerVariable 7.07.0;
  • 26. METHOD RETURN VALUES (RETURN TYPES) (2) 26 public class Substitutor { public static void X() { return 7; } public static void main(String[] args) { int y = X(); System.out.println(y); } } (This will not compile) So in reality, this code will not work if we continue to use void. Void means we do not intend to return anything, which is clearly not true in this case.
  • 27. 🙈 METHOD RETURN VALUES (RETURN TYPES) (3) 27 public class Substitutor { public static int X() { return 7; } public static void main(String[] args) { int y = X(); System.out.println(y); } } (This will compile; Substitutor.java) Instead we need to change void to the type of data we intend to return. In this case int.
  • 28. 🙈 METHODS: FLOW OF DATA 28 public class Substitutor { public static int X() { return 7; } public static void main(String[] args) { int y = X(); System.out.println(y); } } Substitutor.java It might be useful to think about the return value following a path back to the place in which it was called. 7
  • 29. public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } MartinPrinter.java Back in MartinPrinter however, it is perfectly acceptable to write void as we do not have a return statement. SUBSTITUTION DOESN’T ALWAYS OCCUR 29 Moreover, the method’s function does not necessitate a return value. Thus, there is no real substitution in this instance.
  • 30. 🤐 ASIDE: WHAT HAPPENS WHEN YOU CALL A METHOD 30 All the storage elements pertinent to a method are pushed onto an abstract stack structure, and then popped off once the method finishes, and we return to where we started. main printMartin
  • 31. Let’s alter the operation of so that it instead returns the result of subtracting two prime numbers, rather than simply printing the result. We can then print inside the main method (twice). LECTURE EXERCISE: LARGE PRIMES (3) 31 subtractPrimes
  • 32. LECTURE EXERCISE: LARGE PRIMES (4) 32 public class LargePrimes { public static int subtractPrimes() { return 67867967 - 49979687; } public static void main(String[] args) { System.out.println(subtractPrimes()); System.out.println(subtractPrimes()); } }
  • 33. 😴 WE’RE STARTING TO BUILD UP A TEMPLATE FOR METHODS 33 public static int X() { return 7; } Methods, so far, have to be public and static. We specify the return type We give our method a name What about these brackets?
  • 34. So far we have considered what methods output (return). METHODS: INPUT AND OUTPUT 34 System.out.println("+------+"); System.out.println("| |"); System.out.println("+------+"); ? return 7; What about method input? What if I didn’t just want to print `Martin’ in a box to the screen, but any number, an arbitrary number of times?
  • 35. AIM: BOXED NUMBERS 35 I don’t just want to reuse the same code, I want to alter its operation, in some small way.
  • 36. 🙈 It would be useful if we could not only label the code, but also provide placeholders for information to be filled in later. LABELLING CODE (2) 36 System.out.println("+------+"); System.out.println("| |"); System.out.println("+------+"); `Print number’: <NUM> Go to `Print number’ set NUM = 1 Go to `Print number’ set NUM = 2 Go to `Print number’ set NUM = 3 123
  • 37. ASIDE: MAIL MERGE PLACEHOLDERS 37
  • 38. Fortunately, we can do just this in Java. METHODS: AN EXAMPLE (2) 38 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } `Print number’: Go to `Print number’ Go to `Print number’ Go to `Print number’ <NUM> set NUM = 1 set NUM = 2 set NUM = 3 NumberPrinter.java
  • 39. 😴 Whenever a piece of text (e.g. ) is added, using the plus symbol, to a variable (or another piece of text), and then printed to the terminal, they will appear side-by-side. This is known as concatenation (loosely). Open questions: • Where else does concatenation occur? • Is this the only way in which the `+’ symbol is used? • How is a variable converted to text? ASIDE: CONCATENATION (1) 39 "|" In this example, you will see the following syntax: System.out.println("|" + num + "|");
  • 41. METHODS: AN EXAMPLE (2) (BRACKETS) 41 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } Let’s talk about the brackets. NumberPrinter.java
  • 42. We use the brackets at the end of a method to define our placeholders (e.g. <NUM>). • These are variable declarations, of a form you should be familiar with from Topic 2. PARAMETERS 42 • We call these placeholder variable declarations parameters. Once defined, these parameters (placeholders) can be referenced anywhere inside the method. If we want to replace our parameters with values (like replacing <NUM> with the values 1, 2 and 3 previously) we have to assign values to these parameters. printNumber(int num) {
  • 43. METHODS: AN EXAMPLE (2) (PASSING DATA) (1) 43 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } To assign a parameter, we have to call the method with a value written in brackets next to it. NumberPrinter.java
  • 44. 🙈 Remember that changing Java execution order, for simple method calls, relies on matching labels; we have to match the method name (and the brackets) in order to call the method and alter the flow of the program. MATCHING LABELS 44 public static void printName() { printName(); public static void printNumber(int number) { printNumber(1); This same is true for methods with parameters: we have to match the name, the existence of a parameter and the type of the parameter in order to call the method. The format of a method is often referred to as its signature.
  • 45. METHODS: AN EXAMPLE (2) (PASSING DATA) (2) 45 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } When this line is executed, the method will be matched (name, brackets, value and type), and any data in the brackets will be pushed to the waiting parameters of the method. NumberPrinter.java
  • 46. METHODS: AN EXAMPLE (2) (PASSING DATA) (3) 46 public class NumberPrinter { public static void printNumber(int num = 1) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } Thus we effectively transform the parameter into an assigned variable. (Not real Java code.)
  • 47. 🙈 METHODS: AN EXAMPLE (2) (PASSING DATA) (4) 47 public class NumberPrinter { public static void printNumber(1) { System.out.println("+------+"); System.out.println("|" + 1 + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } As such, we effectively transform all references to this parameter into the value that is pushed. (Not real Java code.) 3 3 2 2 1 1 We then repeat for the remaining calls, and receive the desired output…
  • 49. 🙈 METHODS AND PARAMETERS: FLOW OF DATA 49 Again, It can be helpful to think about data flowing through the program. public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } 1 NumberPrinter.java We will show data flow like this again.
  • 50. 😴 So we now know that methods offer us (within the same class) the ability to: • Use the same code multiple times. • Separate functionality. • Use the same code in different ways. METHODS AS A TOOL FOR CODE ORGANISATION (2) 50
  • 51. 😴 A further matching constraint: the number of parameters must be the same and the types must be in the same order. The parameter syntax gives us a lot of freedom. We can write a method with as many parameters as we like. MULTIPLE PARAMETERS 51 But we can only ever return one thing (not equivalent to value). • Otherwise, which returned entity would we substitute the call to the method with? public static void printNumber(int num1, double num2) { printNumber(1, 1.0);
  • 52. FITTING THE RIGHT PARAMETERS 52 int num1 int double num2 double
  • 53. Let’s evolve the functionality from our class into a new class that contains a method which allows us to subtract any two numbers from each other. Then, let’s subtract 15485863 from 32452843 again, and then go ahead and subtract 49979687 from 67867967. LECTURE EXERCISE: SUBTRACTION (1) 53 LargePrimes Subtractor
  • 54. LECTURE EXERCISE: SUBTRACTION (2) 54 public class Subtractor { public static void subtract(int firstOperand, int secondOperand) { System.out.println(firstOperand - secondOperand); } public static void main(String[] args) { subtract(32452843, 15485863); subtract(67867967, 49979687); } } Anytime we now want to perform a subtraction in our class, we can simply call the subtract method (because we’re lazy). Open question: Should we print the result, or return it for printing?
  • 55. 😴 So far, we’ve only passed literal values to our methods, but there’s no reason we can’t pass variables instead, as the matching rules relating to type are still maintained. PASS BY REFERENCE VS. PASS BY VALUE (1) 55 When we do this, a natural question to ask is, if we change the passed variable inside the method, does the original value change? int numberOne = 1; printNumber(numberOne); printNumber(1);
  • 56. 🖥 Caveat: This is quite a weak example, more to come. PASS BY REFERENCE VS. PASS BY VALUE (2) 56Topic3-1 public class NumberChanger { public static void changeNumber(int changeMe) { changeMe = 2; } public static void main(String[] args) { int numberOne = 1; changeNumber(numberOne); System.out.println(numberOne); } } Will the print statement print 1 or 2? Does Java pass the variable itself (the reference) or a copy of the value held in the variable? Try this out in the lab.NumberChanger.java
  • 57. We now know a little bit more about main. • We know that main can never return anything (where would it go anyway?) • This is a parameter, so main must accept some information. • But unfortunately, we still aren’t in a position to discuss what is passed to the main method. • And of course poor old public and static are neglected again. BACK TO MAIN 57 public static void main(String[] args) {
  • 58. 🖥 Type out all the method syntax we have seen (which you should be doing anyway), and annotate each method with a brief description of what that method does: METHOD ANNOTATION 58Topic3-2 /** * Prints the supplied number surrounded by a box. */ public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); }
  • 59. ASIDE: COMMENT TYPES 59 public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } // Previously we use single line methods to annotate our code /* We can also use multi-line comments, if we like, * which start with a single star after a slash. */ /** * For methods, we should use special documentation comments, * which start with a double star after a slash. */
  • 60. 🖥 Once you’ve typed out all the methods and added documentation comments you should try and break things. • Remove parameters, remove names, change names, change return types. Call the method in different ways. BREAKING THE RULES, AGAIN 60Topic3-2 • Use single line comments to make notes for yourself again. // We can't call methods with a non-castable type changeNumber(1.0);
  • 61. Organising Your Code Into Different Files 61
  • 62. So far, we’ve introduced two key methods, one for printing Martin… MARTIN PRINTER AND NUMBER PRINTER (1) 62 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void main(String[] args) { printMartin(); printMartin(); printMartin(); } } MartinPrinter.java
  • 63. …and one for printing numbers. MARTIN PRINTER AND NUMBER PRINTER (2) 63 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } public static void main(String[] args) { printNumber(1); printNumber(2); printNumber(3); } } NumberPrinter.java
  • 64. I kept these methods in distinct classes (in different files) to enable you to run most of the examples you find independently, in the laboratory sessions. But what if we wanted to call both of these methods from the same main method? • We want to print `Martin’ followed by his IQ (191). MARTIN PRINTER AND NUMBER PRINTER (3) 64 printMartin(); printNumber(191);
  • 65. SEPARATING FUNCTIONALITY 65 Because we can have as many methods as we wish in a class, we could just move these methods into the same class and call them from the same main method. Issues with this? What would we call this class? It was actually quite nice having separate functionality in different classes, while using the class name as a label for that functionality. public class { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } public static void printNumber(int num) { System.out.println("+------+"); MartinPrinterAndNumberPrinter
  • 66. There’s also the risk of saturating a single class with too many methods (remember we can have as many methods in a class as we wish). What’s the solution? TOO MANY METHODS 66
  • 67. 🤓 The solution is to have have neither __________________ in the same class as the main method! Instead, we create a new class that will only hold the main method. We are going to call this class Driver because it is going to drive the rest of the code in our program, and serve as a hub for making things happen. This class will communicate with both the and _______________classes from which we will remove the main method. • If we’re trying to run multiple pieces of code in different files, typically we can only have one main method. SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (1) 67 printMartin() or printNumber(int num) NumberPrinter MartinPrinter
  • 68. Stored in a file called MartinPrinter.java SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (2) 68 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } }
  • 69. SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (3) 69 public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); } } Stored in a file called NumberPrinter.java
  • 70. SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (4) 70 public class Driver { public static void main(String[] args) { } } Stored in a file called Driver.java
  • 71. ASIDE: FILES, CLASSES AND FOLDERS 71 If you wish to use the code from one class in another class without any additional code, those classes must be in the same folder.
  • 72. SEPARATING OUT THE MAIN METHOD INTO A DRIVER CLASS (4) 72 public class Driver { public static void main(String[] args) { } } What now? printMartin(); printNumber(191); Stored in a file called Driver.java
  • 73. Not that easy. ERROR: CANNOT FIND SYMBOL 73
  • 74. 🤓 If we want to access a method in another class (file), we have to go through a very specific process. This process involves making a copy of all the code in that class and storing it inside a variable (!). We can then interact with the copied code through the variable in order to call methods within that code. ACCESSING A METHOD IN ANOTHER CLASS (FILE) 74
  • 75. 🙈 LET’S IMAGINE WHAT THIS MIGHT LOOK LIKE… 75 public class Driver { public static void main(String[] args) { copyOfMartinPrinter } } Type Driver.java This is our special variable declaration, which is still a type followed by a name (we have chosen).
  • 76. 😴 public class Driver { public static void main(String[] args) { copyOfMartinPrinter } } Remember that for something to be a variable it must have a type followed by a name. Given that we have a variable, storing a copy of a class, what should the type of this variable be? THE VARIABLE TYPE USED TO STORE A COPY OF A CLASS (1) 76 Type Driver.java
  • 77. 😴 public class Driver { public static void main(String[] args) { copyOfMartinPrinter } } The answer is the name of the class we’re copying. This makes sense because a variable type describes (the format of) what the variable will contain (in this case a copy of a particular class). THE VARIABLE TYPE USED TO STORE A COPY OF A CLASS (2) 77 TypeMartinPrinter Driver.java
  • 78. 🙈 public class Driver { public static void main(String[] args) { MartinPrinter copyOfMartinPrinter } } MAKING A COPY OF A CLASS 78 new MartinPrinter(); Driver.java = How do we do this? We need to request a new copy of the class. We use the labelled name of the class so that Java is able to match the class we want. Then we need to put this copy inside the variable, using an assignment, in the same way that we put values inside variables. We will call a variable that contains a copy of a class an object. (We’ll come back to what the brackets mean).
  • 79. This process is called making an object of a class, and forms the foundation of object-oriented programming. 79
  • 80. 🤓 If we want to access a method in another class (file), we have to go through a very specific process. This process involves making a copy of all the code in that class and storing it inside a variable (!). We can then interact with the copied code through the variable in order to call methods within that code. ACCESSING A METHOD IN ANOTHER CLASS (FILE) 80
  • 81. In order to interact with the code stored in a variable (object), and thus call methods, we need to open the variable (object) up and look inside. To do this we write our variable (object) name and then a dot. INTERACTING WITH COPIES OF CLASSES (OBJECTS) (1) 81 public class Driver { public static void main(String[] args) { MartinPrinter copyOfMartinPrinter } } new MartinPrinter();= copyOfMartinPrinter. Driver.java
  • 82. When we write a dot after an object (a variable containing a copy of a class), we can see inside the object, into the copied class, and have the option to reference any of the (public) identifiers within it. INTERACTING WITH COPIES OF CLASSES (OBJECTS) (2) 82 public class Driver { public static void main(String[] args) { MartinPrinter copyOfMartinPrinter copyOfMartinPrinter. } } new MartinPrinter();= printMartin(); In other words, we can call any of the methods within the copy. Driver.java
  • 83. INTERACTING WITH COPIES OF CLASSES (OBJECTS) (3) 83 public class MartinPrinter { public static void printMarti System.out.println("+----- System.out.println("|Marti System.out.println("+----- } } copyOfMartinPrinter. To reiterate: The dot is an entry point through the object into the class copy through which we reference items in that copy of the class.
  • 84. public class Driver { public static void main(String[] args) { MartinPrinter copyOfMartinPrinter = new MartinPrinter(); copyOfMartinPrinter.printMartin(); NumberPrinter copyOfNumberPrinter = new NumberPrinter(); copyOfNumberPrinter.printNumber(191); } } Driver.java ACHIEVING OUR GOAL 84 • We want to print `Martin’ followed by his IQ (191). I’m using blank lines here more liberally than usual, in order to make my code clearer. When accessing a method through an object, we call methods with parameters in exactly the same way.
  • 85. THE OUTPUT 85 Note that we only need to compile the driver class directly, the compiler will automatically compile any other referenced classes.
  • 86. 🙈 ASIDE: DOCUMENTING OUR CODE WITH CLASS DIAGRAMS 86 The names of the classes You can ignore these for now You will need to produce these diagrams (i.e. draw them yourselves) as part of your documentation for each assignment. Now that we have a program of reasonable structural complexity, it’s useful to have a documentation technique to visualise our class structure. The names of the methods Parameters return values
  • 87. 😴 public class MartinPrinter { public static void printMartin() { System.out.println("+------+"); System.out.println("|Martin|"); System.out.println("+------+"); } } public class NumberPrinter { public static void printNumber(int num) { System.out.println("+------+"); System.out.println("|" + num + "|"); System.out.println("+------+"); Methods have to be static if they are called from a method that is also static. ONE FINAL THING: REMEMBER OUR RULE ABOUT STATIC 87 Because these methods are now being called through an object we can drop the static keyword.
  • 88. Object-oriented purists would be angry that I’m only selling classes (and their associated objects) as a way to organise code, because the idea is much more powerful. • But I think this is a good initial way to understand things. • We will gradually see more important reasons for using classes and objects going forward. If any of the further information on objects and classes confuses you, just come back to this idea that an object is just a copy of the code in a class. CLASSES AND OBJECTS 88
  • 89. 🤐 ASIDE: OBJECTS IN MEMORY 89 In reality, unlike primitive values, objects are stored in another area of the JVM’s memory known as the heap. The variable containing the copy of the class is actually a memory reference from a variable on the stack to an object on the heap. We’ll look at this in more detail next semester. We will use the definition of an object quite loosely in the first semester of PPA, in order to simplify things, and help your initial understanding.
  • 90. Let’s wrap the `Hello World’ functionality from Topic 1 (i.e. a single print statement printing `Hello World’) in a method called , within a class called , and then make an object of this class in a ______ class in order to call the method. LECTURE EXERCISE: HELLO WORLD (1) 90 printHelloWorld Driver HelloWorld printHelloWorld
  • 91. LECTURE EXERCISE: HELLO WORLD (2) 91 public class HelloWorld { public void printHelloWorld() { System.out.println("Hello World"); } } public class Driver { public static void main(String[] args) { HelloWorld copyOfHelloWorld = new HelloWorld(); copyOfHelloWorld.printHelloWorld(); } }
  • 92. Dr. Martin Chapman programming@kcl.ac.uk martinchapman.co.uk/teaching Programming Practice and Applications (4CCS1PPA) Topic 3: Organising Your Code These slides will be available on KEATS, but will be subject to ongoing amendments. Therefore, please always download a new version of these slides when approaching an assessed piece of work, or when preparing for a written assessment. 92 Thursday 6th October