Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
COMP 250
Lecture 33
modifiers
- (package), public, private
-final, static
Nov. 28, 2016
1
Recall package declarations
Dog.java
Trie.java
package lectures
package a3
public class Dog{
:
}
public class Trie{
:
}
2
Packages
java.lang
Object.java
String.java
Math.java
java.util
LinkedList.java
HashMap.java
lectures
Dog.java
Beagle.java
a4
Graph.java
Shape.java
3
Packages are just
directories on a file
system.
Useful for organizing
your classes.
https://docs.oracle.com/javase/tutorial/java/package/managingfiles.html
4
Package = Directory
- 250/src/
- 250/bin/
source code you write e.g. Dog.java
what the compiler outputs e.g. Dog.class
.class file is different from class descriptor (lecture 32):
5
visibility/access modifiers
• public
• (default = package)
• protected
• private
These modifiers define what is visible across classes.
6
Trie.java
Dog.java
package lectures
package a3
public class Dog{
:
}
public class Trie{
:
Dog dog;
}
Q: Does the compiler allow this?
A: Yes.
7
Trie.java
Dog.java
package lectures
package a3
class Dog{
:
}
public class Trie{
:
Dog dog;
}
Q: Does the compiler allow this?
A: No (Dog has package visibility only)
8
Dog.java
Trie.java
package lectures
package demos
class Dog{
:
}
public class Beagle extends Dog{
:
}
Q: Does the compiler allow this?
A: No (Dog has package visibility only)
9
Dog.java
Person.java
public class Dog{
public String name;
public Dog() {…}
}
public class Person {
:
main() {
Dog myDog = new Beagle();
myDog.name = “Buddy”;
}
}
Q: Does the compiler allow the above ?
A: Yes, since name is public.
10
Dog.java
package lectures;
class Dog{
String name;
Dog() {…}
}
Person.java
package lectures;
public class Person {
:
main() {
Dog myDog = new Beagle();
myDog.name = “Buddy”;
}
}
Q: Does the compiler allow the above ?
A: Yes, since name has package visiblity.
11
Dog.java
Person.java
package lectures;
class Dog{
private String name;
Dog() {…}
}
package lectures;
public class Person {
:
main() {
Dog myDog = new Beagle();
myDog.name = “Buddy”;
}
}
Q: Does the compiler allow the above ?
A: No, since name is private.
12
Dog.java
package lectures;
class Dog{
private String name;
Dog() {…}
void setName(String name);
{ this.name = name; }
}
Person.java
package lectures;
public class Person {
:
main() {
Dog myDog = new Beagle();
myDog.setName( “Buddy”);
}
}
Q: Does the compiler allow the above ?
A: Yes, since setName() has package visibility.
13
Getters and Setters (for “Encapsulation”)
Class fields should be private.
e.g. In the Java API, fields are hardly ever shown.
Getters = “accessors”
// don’t change field values
Setters = “mutators”
// change field values
Some methods act as both getter and setter.
14
public class User {
public String lastName;
public String firstName;
User(String last, String first){ … }
}
Q: Why is this bad?
A: Suppose some client program has the following:
User
user
= new User();
user.lastName = “&$(! Arggh”;
user.firstName = “---!”;
}
15
public class User {
private String lastName;
private String firstName;
User(String last, String first){
: // call setters
}
public setFirstName( String first){
// verify that firstName obeys certain rules
}
public setLastName( String last){
// verify that lastName obeys certain rules
}
}
16
visibility and inheritance
17
package a
If A had only
package visibility,
then C would not
be able to see any
of the fields of A,
even public field x.
extends
public class A
public
package
private
int x
int y
int z
extends
package a
package c
class B
class C
Q: Which of the variables in class A are inherited by
(are visible to) classes B and C ?
A: x and y (not z) are inherited by class B.
Only x is inherited by class C.
18
package java.util
public class LinkedList
:
extends
package lectures
class MySpecialLinkedList
A class can extend any public class.
19
package a4
class Shape
:
extends
package lectures
class Rectangle
Not allowed: if a class has package visibility, it cannot
be extended by a class outside that package. 20
class A
public
package
private
int x
int y
int z
class InnerA
:
InnerA has access to all fields of A,
including private ones.
21
___?_____class B
___?_____class A
(don’t care) void mB( A v ){
____?____ void mA( )
v.mA();
}
I mean that mA() and
mB(A) are methods in
one class
visibility modifier
of mA
A and B are
same class
public
(package)
private
yes
yes
yes
A and B are
different class
A and B in
A and B in
same package different package
yes
yes
no
yes
no
no
22
COMP 250
Lecture 33
modifiers
- (package), public, private
- static, final
Nov. 28, 2016
23
static modifier
class Dog{
String name;
static int numDogs = 0; // class field
Dog(){ ..
numDogs ++;
}
static int getNumDogs( ) { return numDogs; }
}
24
Class
Descriptors
Call Stack
Objects
Local variables and
parameters of
methods are here
Instance fields
are here
Methods are here
Static fields are
here.
Dog
class descriptor
(numDogs)
bark()
Beagle
object
Beagle
class descriptor
TestProgram
Test.main()
other
objects
class descriptor
25
class Test {
public int methodA( ) { ….. }
public static void main ( ) { … }
}
Q: Why static ?
A: Because main() is not invoked by an object.
Rather, it is a class method.
26
static class MyClass {
…
}
Q: This produces a compiler error. Why ?
A: You can’t instantiate it.
27
class MyClass {
static class MyStaticInnerClass {
…
}
class MyNonStaticInnerClass {
…
}
}
This is allowed. (Admittedly, an obscure detail….)
28
final modifier
final class Dog{
:
}
class Beagle extends Dog {
:
}
The compiler does not allow this. By definition here, the
final modifier specifies that you cannot extend the class.
e.g. Java.lang.{String, Math, ..}
29
class Dog{
void final bark(){ …}
}
class Beagle extends Dog {
void bark(){ …. }
}
The compiler does not allow this. By definition, the final
modifier specifies that you cannot override this method.
30
class Dog{
void final myDog;
myDog = new Beagle(“Buddy”);
:
myDog = new Poodle(“Willie”);
}
The compiler does not allow the second myDog assignment.
31
static + final modifiers
public final class Math{
public static final double PI = 3.14…;
public static final double E = 2.71…;
public static double sqrt( double x) { ….}
}
32