Object classes
Object classes
Java objects
- In Java, objects are essentially instances of classes. They represent real-world entities or concepts and contain both data and behaviors, facilitating organized and modular software design.
Common Types of Java Classes
In Java, classes are the fundamental building blocks of Object-Oriented Programming (OOP). They define the structure and behavior of objects, serving as templates or blueprints from which objects are created. Java programs typically consist of multiple classes, each designed to fulfill a specific role. One Java class that you should be familliar with is:
- Utility Classes: Utility classes contain static methods that provide common utility functions. These classes are not meant to be instantiated, and they often involve operations such as mathematical calculations, string manipulation, or date formatting. The Math class is an example of a utility class.
- Java Arrays Class
- Java HashMap Class
- Java LinkedList Class
import java.util.Arrays;
public class ArraySortExample {
public static void main(String[] args) {
int[] numbers = {5, 2, 9, 1, 5, 6};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
}
}
String[] words = {"main"};
ArraySortExample.main(words);
[1, 2, 5, 5, 6, 9]
Java Objects
An object in Java is a basic unit of Object-Oriented Programming and represents real-life entities. Objects are the instances of a class that are created to use the attributes and methods of a class.
A typical Java program creates many objects, which as you know, interact by invoking methods. An object consists of :
- State: It is represented by attributes of an object. It also reflects the properties of an object.
- Behavior: It is represented by the methods of an object. It also reflects the response of an object with other objects.
Declaring Objects
When an object of a class is created, the class is said to be instantiated. All the instances share the attributes and the behavior of the class. But the values of those attributes, i.e. the state are unique for each object. A single class may have any number of instances.
As we declare variables like (type name;). This notifies the compiler that we will use the name to refer to data whose type is type. With a primitive variable, this declaration also reserves the proper amount of memory for the variable. So for reference variables , the type must be strictly a concrete class name. In general, we can’t create objects of an abstract class or an interface.
Initializing a Java Object
The new operator instantiates a class by allocating memory for a new object and returning a reference to that memory. The new operator also invokes the class constructor.
public class Dog {
public String Name;
public int Age;
public void Bark(int times) {
for (int i = 0; i < times; i++) {
System.out.println("Bark");
}
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.Bark(5);
}
}
Dog.main(words);
Bark
Bark
Bark
Bark
Bark
Calling a non-void method
It’s possible to call a non-void method on an object so that it returns a value, the type of which is specified with the method.
public class Dog {
public String Name; //instance variables
public int Age;
public Dog(String name, int age) { //construction method
Name = name;
Age = age;
}
public String getName() { //non-void method that returns a String
return Name;
}
public static void main(String[] args) { //main code
Dog d = new Dog("Larry", 4);
System.out.println(d.getName());
}
}
Dog.main(null);
Larry
Popcorn Hacks
Modify the code below (the same code as above) to demonstrate one of the following:
- An additional Non-void method
- Multiple uses of the same Non-void method on different objects
public class Dog {
public String Name; //instance variables
public int Age;
public Dog(String name, int age) { //construction method
Name = name;
Age = age;
}
public String getName() { //non-void method that returns a String
return Name;
}
// Non void method that returns a boolean (sorry it sucks)
public Boolean isGoodDog(){
if (Age > 5) {
return true;
} else {
return false;
}
}
public static void main(String[] args) { //main code
Dog d = new Dog("Larry", 4);
Dog e = new Dog("Harry", 6);
d.isGoodDog();
e.isGoodDog();
System.out.println(d.getName() + " is a good dog:");
System.out.println(d.isGoodDog());
System.out.println(e.getName() + " is a good dog:");
System.out.println(e.isGoodDog());
}
}
Dog.main(null);
Larry is a good dog:
false
Harry is a good dog:
true
String Objects
String objects are built-in objects in Java that you’re probably pretty familiar with, but it also functions like a class, with the following properties:
- String objects can be initialized with the new keyword
- Method that acts upon String objects can’t change the String itself, it is inmmutable.
- String objects can be concatenated using the + operator, creating a new string that is the combination of the other two strings
- Escape sequences can be used to print characters that are otherwise unavailable, using the “" (backslash) symbol
- " creates a double quote
- \\ creates a regular backslash (I actually had to use 4 backslashes for this since markdown also recognizes this combination)
- \n creates a newline
public class Strings_demo {
public static void main(String[] args) { //main code
String s1 = "hello"; // The way you are probably used to for string objects
String s2 = new String("hello"); // an alternate method to create the same string variable
System.out.println(s1);// these two println statements should print the same thing
System.out.println(s2);
String s3 = s1+s2; // s3 is a concatenation of s1 and s2
System.out.println(s3);
System.out.println(s1); // the method doesn't actually change the String itself
String s4 = new String("In order to type out a \\\\ string in Java String, you need 4 \\'s \n You need 3 \\'s and 1 \" to type out a \\\""); // a demonstration of the escape sequences
System.out.println(s4);
}
}
Strings_demo.main(null);
hello
hello
hellohello
hello
In order to type out a \\ string in Java String, you need 4 \'s
You need 3 \ and 1 " to type out a \"
Here are some of the String methods we use: |Syntax|Definition| |-|-| |String(String str)|Constructs a new String object with the same sequence of characters as str| |int length()|Returns the number of characters in the String| |String substring(int from, in to)|Returns the substring beginning at from to one before to| |String substring(int from)|Returns the substring beginning at from to the end| |int indexOf(String str)|Returns the first occurence of str, returns -1 if not found| |boolean equals(String other)|Returns true if this is equal to other and vice versa| |int compareTo(String other)|Returns a value <0 if this is less than other, 0 if they are equal and a value >- if this is greater than other|
public class Strings_demo_2 {
public static void main(String[] args) { //main code
String s1 = "hello"; // Strings for demonstration
String s2 = new String("hihihellothere"); // Construction using the method
System.out.println(s2.length());
String s3 = s2.substring(4,9); // creating a substring of s1 from index 4 to 9-1
System.out.println(s3);
System.out.println(s1); // these should be the same
System.out.println(s2.indexOf(s1)); //returns the first occurence of hello in hihihellothere (4)
System.out.println(s2.equals(s1)); // returns if hello is the same as hihihellothere (it's not)
System.out.println(s2.compareTo(s1)); // compares hihihellothere to hello, since it greater since h=h and i>e, this returns a positive number
System.out.println(s1.compareTo(s2)); // the reversal of the above, returns a negative number
System.out.println(s3.equals(s1)); // returns if hello is the same as hello (it's)
System.out.println(s3.compareTo(s1)); // compares hello to hello, since they are the same, this returns a 0
System.out.println(s1);// none of these methods affect the original strings, since Strings are immutatble
System.out.println(s2);
System.out.println(s3);
}
}
Strings_demo_2.main(null);
14
hello
hello
4
false
4
-4
true
0
hello
hihihellothere
hello
Popcorn Hacks
Using the methods above, create a method that is able to return the position of a substring in a string and use s.o.pl to prove it.
public class String_Problem{
public String inputString;
public String inputSubString;
// Constructor for String_Problem class
public String_Problem(String inputString, String inputSubString) {
this.inputString = inputString;
this.inputSubString = inputSubString;
}
// Method to check if the inputString contains the inputSubString
public int containsSubString() {
int positionSubString = inputString.indexOf(inputSubString);
if (inputString == inputSubString){
System.out.println("\nThe inputString is the same as the inputSubString");
return 0;
}
else if (positionSubString != -1) {
System.out.println("\nThe inputString contains the inputSubString");
return positionSubString;
}
else {
System.out.println("\nThe inputString does not contain the inputSubString");
return -1;
}
}
}
public static void main(String[] args) { //main code
String_Problem s = new String_Problem("hello", "hi");
System.out.println("Index of Substring: " + s.containsSubString());
String_Problem t = new String_Problem("hello", "lo");
System.out.println("Index of Subtsring: " + t.containsSubString());
String_Problem u = new String_Problem("hello", "hello");
System.out.println("Index of Substring: " + u.containsSubString());
}
main(null);
The inputString does not contain the inputSubString
Index of Substring: -1
The inputString contains the inputSubString
Index of Subtsring: 3
The inputString is the same as the inputSubString
Index of Substring: 0
Wrapper Classes
You may remember the Wrapper classes from before, this will present two additional wrapper classes - Integer and Double
- Integer (not int - notice the non-shortend word and capitalization)
- int is a primitive data type, and Integer is a wrapper class
Syntax | Definition |
---|---|
Integer(int value) | Constructs a new Integer object representing the value |
Integer.MIN_VALUE | the minimum value represented by a int or Integer |
Integer.MAX_VALUE | the maximum value represented by a int or Integer |
int intValue() | Returns the value of Integer as int |
- Double (not double)
- double is a primitive data type, Double is a wrapper class
Syntax | Definition |
---|---|
Double(double value) | Constructs a new Double object representing the value |
double doubleValue() | Returns the value of the Double as a double |
(not the most exciting thing I know)
ok but why
In Java, Wrapper classes are used to convert between primitive data types (int, boolean) and only store a single value and Reference types (String, ArrayList). It provides a way for us to use primitive datas as objects
Autoboxing and Unboxing
As of Java 5.0, autoboxing and unboxing are added
Autoboxing is the automatic process that Java compiler uses to convert primitive types and their respective Wrapper classes
Unboxing is the opposite, comverting Wrapper classes to primitive types
public class Unboxing_stream {
public static void main(String[] args) { //main code
int i1 = 10; // primitive data types
double d1 = 25.5;
Integer I1 = new Integer(i1); // Construction of the Wrapper classes version (superior)
Double D1 = new Double(d1);
System.out.println(i1); // The values correspond to their original values
System.out.println(I1);
System.out.println(d1);
System.out.println(D1);
int i2 = I1.intValue()+5; //usage of the intValue function
System.out.println(i2);
double d2 = D1.intValue()-1.3; //usage of the doubleValue function
System.out.println(d2);
System.out.println(Integer.MIN_VALUE); // the actual values of the MIN_VALUE and MAX_VALUE
System.out.println(Integer.MAX_VALUE);
Integer I2 = i1; // autoboxing bypasses the need for contructor methods
Double D2 = d1;
System.out.println(I2);
System.out.println(D2);
int i3 = I2+10; // unboxing without using any methods
double d3 = D2-1.3;
System.out.println(i3);
System.out.println(d3);
}
}
Unboxing_stream.main(null);
10
10
25.5
25.5
15
23.7
-2147483648
2147483647
10
25.5
20
24.2
the Math class
Talking about the java object here, math offers several useful method for mathmatical usages.
- Math methods are static, they belong to the class instead of an object and can be used without creating an object
- the Math class is already imported as part of java.lane.Math
- However, you can use the methods without using the Math prefix with the import command import static java.lang.Math.*
Syntax | Definition |
---|---|
static int abs(int x) | Returns the absolute value of a int |
static double abs(double x) | Returns the absolute value of a double |
static double pow(double base, double exponent) | Returns the value of base to the exponent power |
static double random() | Returns a random double between 0.0 and 1.0 |
import static java.lang.Math.*; // implicit importation
public class maths_demo {
public static void main(String[] args) { //main code
double a=12.5; // ints we will use
int b=-5;
int c=4;
System.out.println(abs(a)); // prints the absolute values of a and b
System.out.println(abs(b)); // should have no effect on a but b should be turned to its opposite (the positive number)
System.out.println(pow(b,c)); // prints the result of b to c
System.out.println(random()*10>4); // returns true if a random number from 0 to 10 is greater than 4, this should return different values with different runs.
}
}
maths_demo.main(null);
12.5
5
625.0
true
Popcorn hacks
Create a variation of the number guessing game and try to use these methods in. Bonus points for creativity.
import java.util.Random;
import java.util.Scanner;
public class ExponentGuessingGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int exponent = random.nextInt(4); // Using Math random to generate an exponent
double base = 2;
double secretNumber = Math.pow(base, exponent); // Using Math pow to generate the secret number
int numberOfGuesses = 0;
System.out.println("Welcome to the Exponent Guessing Game!");
System.out.println("I've selected a random exponent between 0 and 4. Try to guess the result of " + base + " raised to that exponent.");
while (true) {
System.out.print("Enter your guess: ");
double userGuess = scanner.nextDouble();
numberOfGuesses++;
if (userGuess < secretNumber) {
System.out.println("Try a higher number.");
} else if (userGuess > secretNumber) {
System.out.println("Try a lower number.");
} else {
System.out.println("Congratulations! You've guessed the correct number, which is " + secretNumber);
System.out.println("You took " + numberOfGuesses + " guesses.");
break;
}
}
scanner.close();
}
}
ExponentGuessingGame.main(null);
Welcome to the Exponent Guessing Game!
I've selected a random exponent between 0 and 4. Try to guess the result of 2.0 raised to that exponent.
Enter your guess: Try a higher number.
Enter your guess: Try a higher number.
Enter your guess: Try a higher number.
Enter your guess: Try a lower number.
Enter your guess: Congratulations! You've guessed the correct number, which is 8.0
You took 5 guesses.
Hacks
Complete all popcorn hacks
Quiz
import java.util.Random;
public class RandomIntegersExample {
public static void main(String[] args) {
Random random = new Random();
System.out.println("Generating five random integers between 1 and 100:");
for (int i = 0; i < 5; i++) {
int randomNumber = random.nextInt(100) + 1; // Generates a random integer between 1 and 100
System.out.println(randomNumber);
}
}
}
RandomIntegersExample.main(null);
Generating five random integers between 1 and 100:
18
98
36
43
90
import java.util.ArrayList;
import java.text.DecimalFormat;
public class StudentScoresManager {
public static void main(String[] args) {
// a. Create an empty ArrayList of integers called studentScores.
ArrayList<Integer> studentScores = new ArrayList<>();
// b. Add the following scores to the studentScores list.
studentScores.add(85);
studentScores.add(92);
studentScores.add(78);
studentScores.add(95);
studentScores.add(88);
studentScores.add(91);
// c. Calculate and print the average score of the students.
int sum = 0;
for (int score : studentScores) {
sum += score;
}
double average = (double) sum / studentScores.size();
DecimalFormat df = new DecimalFormat("#.00"); // Format for two decimal places
String roundedAverage = df.format(average);
System.out.println("Average score: " + roundedAverage);
// d. Remove any scores that are below 80 from the list.
studentScores.removeIf(score -> score < 80);
// e. Add a new score of 89 to the list.
studentScores.add(89);
// f. Print the updated contents of the studentScores list.
System.out.println("Updated student scores:");
for (int score : studentScores) {
System.out.println(score);
}
}
}
StudentScoresManager.main(null);
Average score: 88.17
Updated student scores:
85
92
95
88
91
89