this= "chính tôi" — reference đến object hiện tại.super= "phiên bản parent" — truy cập member cha đã bị override/che.
class Animal {
String name;
Animal(String name) { this.name = name; }
void describe() { System.out.println("Animal: " + name); }
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // gọi constructor parent — phải đứng ĐẦU
this.breed = breed; // phân biệt field this.breed với param breed
}
@Override
void describe() {
super.describe(); // gọi version Animal
System.out.println("Breed: " + breed);
}
}this dùng cho: phân biệt field/param trùng tên, gọi constructor khác cùng class this(...), truyền chính object (register(this)), method chaining (return this).
super dùng cho: gọi constructor cha super(...), gọi method bị override (super.toString()).
Quy tắc cứng: this(...) và super(...) đều phải là câu lệnh đầu tiên trong constructor → không gọi được cả hai. Không có thì compiler ngầm chèn super().
this/super không tồn tại trong static method.
this= "myself" — reference to the current object.super= "the parent's version" — access overridden/shadowed parent members.
class Animal {
String name;
Animal(String name) { this.name = name; }
void describe() { System.out.println("Animal: " + name); }
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // call parent constructor — must be FIRST
this.breed = breed; // disambiguate field from parameter
}
@Override
void describe() {
super.describe(); // call Animal's version
System.out.println("Breed: " + breed);
}
}this for: disambiguating field vs parameter, calling another constructor (this(...)), passing current object (register(this)), method chaining (return this).
super for: calling parent constructor super(...), calling overridden methods (super.toString()).
Hard rule: this(...) and super(...) must be the first statement in a constructor → you cannot call both. Omit them and the compiler inserts super().
this/super do not exist inside static methods.