Misc
Advanced Programming
SUT • Spring 2019
Outline
-
Package
-
Package access
-
-
Static
-
this
-
Method overloading
-
toString
-
equals
Access Specifiers
Access Specifiers
-
public
-
Interface access
-
-
private
-
Don’t touch!
-
Example
public class Person {
public String name;
private Integer age;
public String getName() {
return this.name;
}
private Integer age() {
return this.age;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.name = "Ali Alavi";
p.age = 12; // Compile Error
}
}
Public classes
-
You can declare a class which is not public
-
The class is visible within the file
-
There can be only one public class per file
-
The name of the public class must exactly match the name of the file
-
including capitalization
-
-
It is possible to have a java file with no public class
-
not typical
-
Object Access or Class Access
-
Access specifiers are declared for classes
-
Not for objects
-
-
When a member is declared as private
-
It is not visible in methods outside this class
-
It is visible by other objects of the same class
-
init() Method
public class Access {
private String name;
public Access(String name) {
this.name = name;
}
public void check(Access access){
access.name = name;
}
public static void main(String[] args) {
Access a = new Access("Ali");
Access b = new Access("Taghi");
a.check(b);
System.out.println(a.name);
System.out.println(b.name);
}
}
-
a can touch private property (name) of b
-
Because a and b has the same class
-
name is not private for b
-
name is private for Access
Package
-
A package contains a group of classes
-
Organized together under a single namespace
-
Packages organize classes belonging to the same category or providing similar functionality
-
A package provides a unique namespace for the types it contains
-
Classes in one package has the same folder
Packages may contain other packages-
Hierarchy of packages
-
Packages and Folders
Packages and Folders
Some famous java packages
-
java.util
-
java.lang
-
java.io
Package Access
-
Remember public and private access specifiers
-
The default access has no keyword
-
It is commonly referred to as package access
-
friendly
-
-
Other classes in the current package have access to that member
-
To classes outside of this package, the member appears to be private
Java Packages
-
import keyword
-
Class Qualified Name = package-name + class-name
-
For example
java .lang.String
java.lang.Math
double sqrt = Math.sqrt(123);
java.util.Scanner
java.awt.Event
org.w3c.dom.events.Event
Using packages
import java.util.Arrays;
import java.util.*;
public class Swapping {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int nextInt = scanner.nextInt();
System.out.println(nextInt);
int[] original = new int[5];
int[] copy = Arrays.copyOf(original, 10);
}
}
Using packages
public class Swapping {
public static void main(String[] args) {
Integer a = 5;
java.lang.Integer b = 5;
java.lang.String s = "asd";
java.lang.Boolean bb = true;
}
}
-
java.lang is implicitly imported
No import in Byte Code
-
Unused imports have a trivial impact on the compiler
-
But there are no imports in the byte code or at runtime
-
Unused import have no impact in runtime
-
But it is better to remove them
-
-
Organize Imports
Static Members and this
Writing eBay for Cars
class Peykan{...}
public class Pride {
int color;
int price;
boolean isHatchBack;
int designYear;
int length, width;
}
Properties of objects
Properties of class
Static
-
When you create a class
-
You describe how objects of that class look
-
And how they will behave
-
-
You don’t actually get an object until you create one
-
using new
-
-
At that point storage is allocated and methods become available.
-
There are two situations in which this approach is not sufficient.
-
Class data or static property
-
Class method or static method
-
Class Data
-
You want to have only a single piece of storage for a particular field
-
regardless of how many objects of that class are created
-
or even if no objects are created
-
Example:
-
Pride.designYear
-
Person.?
-
-
Class data = static properties
Class Methods
-
if you need a method that isn’t associated with any particular object of this class.
-
You need a method that you can call even if no objects are created
-
Class methods = static methods
Static properties
-
static properties are shared among all the objects
-
static properties are properties of classes
-
Not objects
-
-
Example:
-
Integer.MAX_VALUE
-
Player.NumberOfObjects
-
Static methods
- Static methods can access only static properties
- Static methods are actually class operations
- If a method uses only static fields, make it static!
- Static methods are accessible via classes
- double d = Double.parseDouble("12");
- String s = String.valueOf(12);
- public static void main(String[] args)
- Static properties and methods are invoked on class name
- Are not invoked on objects
Sample
public class Person {
private String name;
private int age;
public static int MAX_AGE = 150;
public void setAge(int age) {
if (age < MAX_AGE)
this.age = age;
}
public static int getMaxAge() {
return MAX_AGE;
//no access to age and name
}
}
Static Initialization
-
Static properties are class data, not object data
-
Constructors are created for initializing object data
-
How to initialize class data?
-
Two ways:
-
Inline values
-
Static block
-
-
Static initialization is done when Class Loader loads the class
Inline initialization
public static int MAX_AGE = 150;
private static double PI = 3.14;
static String defaultName = theDefaultName();
private static String theDefaultName() {
return "Ali Alavi";
}
Static Block
public class Person {
public static int MAX_AGE;
private static double PI;
static String defaultName;
private static String theDefaultName() {
return "Ali Alavi";
}
static {
MAX_AGE = 150;
PI = 3.14;
String s = theDefaultName();
if (s != null)
defaultName = theDefaultName();
}
}
Initialization Block
public class SomeClass {
private int value = 0;
{
System.out.println("initialization block: value = " + value + ".");
value = 1;
}
public SomeClass(){
System.out.println("SomeClass(): value = " + value + ".");
value = 2;
}
public SomeClass(int param){
System.out.println("SomeClass(int param): value = " + value + ".");
value = 3;
}
public static void main(String[] args){
SomeClass c1 = new SomeClass();
SomeClass c2 = new SomeClass(2);
}
}
Order of initialization
-
Once per class
-
Static variable declaration
-
Static block
-
-
Once per object
-
variable declaration
-
Initialization block
-
Constructor
-
Sample
public class Person {
public static int MAX_AGE;
private static double PI = 3.14;
static {
MAX_AGE = 150;
}
private String nation = "Iran";
private int age;
private String name;
{
name = "Ali";
}
public Person() {
age = 10;
}
public Person(int a, String n) {
age = a;
name = n;
}
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(20, "Taghi");
}
this
Method-property access
-
How does getArea() know where radius is?
public class Circle {
private double radius;
public Circle(double r) {
this.radius = r;
}
public double getArea() {
return this.radius * this.radius * 3.14;
}
public static void main(String[] args){
Circle c = new Circle(2);
System.out.println(c.getArea());
}
}
Compiler solution
-
A reference to the object is implicitly passed to methods
-
circle.getArea()
-
-
is converted (by compiler) to something like:
-
Circle.getArea(circle)
-
-
What if you want to access this circle object?
-
Use this keyword
-
-
this is available within non-static methods
Sample Application of this
public class Lead {
int i = 0;
Leaf increment() {
i++;
return this;
}
void print(){
System.out.println("i = " + i);
}
public static void main(String[] args){
Leaf x = new Leaf();
x.increment().increment().increment().print();
}
}
Sample Application of this (2)
public class Book {
private String name;
private Person author;
public void setName(String name) {
this.name = name;
}
public void setAuthor(Person author) {
this.author = author;
}
}
Static and this
-
What are static methods?
-
Methods without implicit this
-
Static methods are bound to classes, not objects
Overloading
Method Overloading
-
Methods with the same name in the same class
-
With different parameters
-
Different Signatures
Sample
class Circle {
void f() {
System.out.println("f is called");
}
void f(int number) {
System.out.println("f is called with number = " + number);
}
void f(String s) {
System.out.println("f is called with s = " + s);
}
void f(String s, int number) {
System.out.println("f is called with s = " + s +
" and number = " + number);
}
public static void main(String[] args){
Circle circle = new Circle();
circle.f();
circle.f(5);
circle.f("salam");
circle.f("salam", 5);
}
}
No Return type method overloading
Why this is not permitted?
class Circle {
void f() {
System.out.println("f is called");
}
int f() {
System.out.println("f is called");
return 0;
}
}
Type Operations
Type Casting
- You can change the type by type casting
- Casting in reference types and other objects is not so simple
- See It Later
long longValue = 98127391827L;
int iad = longValue; // Compiler Error
int i = (int) longValue;
Integer intValue = 391827;
Long lad = (Long) intValue; // Runtime Error
Type Conversion
-
Sometimes we want to convert an object to another type
-
Type casting is not the solution here
-
We should write some methods to convert the types
Type Conversion (2)
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int intValue = Integer.parseInt(s);
Integer i = 12;
String str = i.toString();
toString
-
toString() is a special method
-
You can write it for every class
Sample
public class Rectangle {
private int length, width;
public Rectangle(int length, int width) {
this.length = length;
this.width = width;
}
public String toString() {
return "Retangle[length=" + length + ", width=" + width + "]";
}
public int getArea(){
return width + length;
}
public static void main(String[] args){
Rectangle r = new Rectangle(10, 2);
System.out.println(r.getArea());
System.out.println(r.toString());
System.out.println("Here: " + r.toString());
}
}
Checking equality in java
int i = 5;
int j = 4+1;
System.out.println("i is equal to j: " + (i == j))
String i = new String("ali");
String j = new String("ali");
System.out.println("i is equal to j: " + (i == j))
String i = "ali";
String j = "ali";
System.out.println("i is equal to j: " + (i == j))
String i = new String("ali");
String j = new String("ali");
System.out.println("i is equal to j: " + (i.equals(j)))
Creating Your Own Equals()
public class Person {
private String nationalID;
private String name;
private String email;
private int age;
public boolean equals(Person other) {
return nationalID.equals(other.nationalID);
}
}
Person p1 = new Person("1290786547", "Ali Alavi");
Person p2 = new Person("1290786547", "Taghi Taghavi");
Person p3 = new Person("0578905672", "Taghi Taghavi");
System.out.println(p1.equals(p2));
System.out.println(p2.equals(p3));
Creating Your Own Equals()
-
In fact, equals() is more complicated
-
The parameter should be an Object
-
Person as the parameter was incorrect
-
-
More checks are required
-
IDE Support for writing equals
-
Use your IDE for
-
getters, setters, constructors, …
-
-
Sample
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (nationalID == null) {
if (other.nationalID != null)
return false;
} else if (!nationalID.equals(other.nationalID))
return false;
return true;
}
Title Text
Misc
By Behnam Hatami
Misc
Misc / Advanced Programming Course @ SUT, Spring 2019
- 1,287