Answer
this and super Keywords in Java
this — Current Object Reference
Refers to the current class instance. Used to distinguish instance variables from local variables, call other constructors, and pass current object as argument.
1. Distinguish instance vs local variable
Java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name; // this.name = instance variable
this.age = age; // age (right side) = parameter
}
}
2. Call another constructor — this()
Java
public class Car {
String brand;
String color;
int speed;
public Car() {
this("Toyota", "White", 0); // calls 3-arg constructor
}
public Car(String brand) {
this(brand, "Black", 0); // calls 3-arg constructor
}
public Car(String brand, String color, int speed) {
this.brand = brand;
this.color = color;
this.speed = speed;
}
}
3. Pass current object to method
Java
public class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this; // return current object — enables method chaining
}
public Builder setAge(int age) { return this; }
public User build() { return new User(this); }
}
// Method chaining
User user = new Builder()
.setName("Alice")
.setAge(30)
.build();
✦
super — Parent Class Reference
Refers to the immediate parent class. Used to access parent fields, methods, and constructors.
1. Call parent constructor — super()
Java
class Animal {
String name;
Animal(String name) {
this.name = name;
System.out.println("Animal created: " + name);
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // MUST be first statement — calls Animal()
this.breed = breed;
System.out.println("Dog created: " + breed);
}
}
2. Access overridden parent method
Java
class Shape {
public void draw() {
System.out.println("Drawing a shape");
}
}
class Circle extends Shape {
@Override
public void draw() {
super.draw(); // calls Shape.draw() first
System.out.println("Drawing a circle");
}
}
3. Access parent field (when hidden by child)
Java
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20; // hides parent x
void display() {
System.out.println(x); // 20 — child's x
System.out.println(super.x); // 10 — parent's x
}
}
In Automation (Page Object Model)
Java
public class BasePage {
protected WebDriver driver;
protected WebDriverWait wait;
public BasePage(WebDriver driver) {
this.driver = driver; // this = current BasePage instance
this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
PageFactory.initElements(driver, this); // pass this object
}
public void waitForElement(By locator) {
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
}
}
public class LoginPage extends BasePage {
@FindBy(id = "username") WebElement usernameField;
@FindBy(id = "password") WebElement passwordField;
public LoginPage(WebDriver driver) {
super(driver); // super = BasePage constructor
}
public void login(String user, String pass) {
super.waitForElement(By.id("username")); // parent method
usernameField.sendKeys(user);
passwordField.sendKeys(pass);
}
}
