GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core OOP Từ khóa this và super trong Java

Từ khóa this và super trong Java

Đăng vào 01/11/2017 . Được đăng bởi GP Coder . 26589 Lượt xem . Toàn màn hình

Nội dung

  • 1 Từ khóa this trong java
  • 2 Từ khóa super trong java

Từ khóa this trong java

Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.

Từ khóa this có 6 cách sử dụng sau:

  • Tham chiếu tới biến instance của lớp hiện tại.
  • Gọi phương thức (method) của lớp hiện tại.
  • Gọi hàm dựng (constructor) của lớp hiện tại.
  • Trả về instance của lớp hiện tại
  • Được truyền như một tham số trong phương thức (method).
  • Được truyền như một tham số trong hàm dựng (constructor).

Tham chiếu tới biến của lớp hiện tại.

Từ khóa this trong java có thể được dùng để tham chiếu tới biến instance của lớp hiện tại.

Ví dụ:


package com.gpcoder.oop;

public class UsingThisExample {
	
	private int id;
	
	private String website;
	
	private String subject;
	
	public UsingThisExample(String website, String subject) {
		website = website;
		subject = subject;
	}
	
	public void print() {
		System.out.println("Id = " + id);
		this.printWebsite();
		this.printSubject();
	}
	
	private void printWebsite() {
		System.out.println("Subject = " + subject);
	}
	
	private void printSubject() {
		System.out.println("Website = " + website);
	}
	
	public static void main(String[] args) {
		UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
		ex1.print();
	}
	
}


Kết quả:

Id = 0
Subject = null
Website = null

Như chúng ta thấy, gía trị của biến được gán trong hàm construct không có tác dụng, do tên thuộc tính và tên biến giống nhau.
Để giải quyết vấn đề này ta sử dụng từ khóa this như ví dụ sau:

package com.gpcoder.oop;

public class UsingThisExample {
	
	private int id;
	
	private String website;
	
	private String subject;
	
	public UsingThisExample(String website, String subject) {
		this.website = website;
		this.subject = subject;
	}
	
	public void print() {
		System.out.println("Id = " + id);
		this.printWebsite();
		this.printSubject();
	}
	
	private void printWebsite() {
		System.out.println("Subject = " + subject);
	}
	
	private void printSubject() {
		System.out.println("Website = " + website);
	}
	
	public static void main(String[] args) {
		UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
		ex1.print();
	}
	
}

Kết quả:

Id = 0
Subject = OOP
Website = gpcoder.com

Nếu biến cục bộ và biến toàn cục có tên khác nhau thì không cần sử dụng từ khóa this. Tuy nhiên, nên sử dụng từ khóa this để chương trình được rõ ràng và dễ hiểu.

Ví dụ:
Persion.java

package com.gpcoder.oop;

public class Person {
	public void print() {
        System.out.println("This is parent class");
    }
}

Student.java

package com.gpcoder.oop;

public class Student extends Person {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public void print() {
		System.out.println("id = " + id + ", name = " + name);
	}

	public void printChild1() {
		this.print();
	}

	public void printChild2() {
		super.print();
	}

	public static void main(String args[]) {
		Student student = new Student(1, "gpcoder");
		student.print();
		System.out.println("---");
		student.printChild1();
		System.out.println("---");
		student.printChild2();
	}

}

Kết quả:

id = 1, name = gpcoder
---
id = 1, name = gpcoder
---
This is parent class

Như ví dụ trên, rõ ràng là trong trường hợp mà chương trình của bạn có nhiều class, các class có sử dụng kế thừa thì việc để từ khóa this sẽ giúp chương trình của bạn rõ ràng hơnc hạn chế sai sót do không xác định được đang gọi phương thức ở lớp cha hay lớp hiện tại.

Gọi phương thức của lớp hiện tại.

Chúng ta có thể sử dụng từ khóa this để gọi phương thức của lớp hiện tại. Nếu không sử dụng từ khóa this, trình biên dịch sẽ tự động thêm từ khóa this cho việc gọi phương thức.
Ví dụ:

package com.gpcoder.oop;

public class UsingThisExample {
	
	private int id;
	
	private String website;
	
	private String subject;
	
	public UsingThisExample(String website, String subject) {
		this.website = website;
		this.subject = subject;
	}
	
	public void print() {
		System.out.println("Id = " + id);
		this.printWebsite();
		printSubject();
	}
	
	private void printWebsite() {
		System.out.println("Subject = " + subject);
	}
	
	private void printSubject() {
		System.out.println("Website = " + website);
	}
	
	public static void main(String[] args) {
		UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
		ex1.print();
	}
	
}

Kết quả:

Id = 0
Subject = OOP
Website = gpcoder.com

Như ví dụ trên, từ khóa this được sử dụng để gọi phương thức this.printWebsite(). Phương thức printSubject() trình biên dịch sẽ tự động thêm từ khóa this cho việc gọi phương thức.

Gọi Constructor của lớp hiện tại.

Phương thức this() có thể được sử dụng để gọi constructor của lớp hiện tại. Cách sử dụng này sẽ hữu dụng hơn nếu bạn có nhiều constructor trong một lớp và bạn muốn sử dụng lại constructor.

Phương thức this() phải được khai báo dòng lệnh đầu tiên trong constructor.

Ví dụ:

package com.gpcoder.oop;

public class UsingThisExample {

	private int id;

	private String website;

	private String subject;

	public UsingThisExample() {
		this.id = 1;
		this.website = "https://gpcoder.com";
	}

	public UsingThisExample(String website ) {
		this(); // Bắt buộc phải dòng lệnh đầu tiên trong constructor
		this.website = website ;
	}

	public UsingThisExample(String website, String subject) {
		this(website); // Bắt buộc phải dòng lệnh đầu tiên trong constructor
		this.subject = subject;
	}

	public void print() {
		System.out.println("Id = " + id);
		this.printWebsite();
		this.printSubject();
	}

	private void printWebsite() {
		System.out.println("Subject = " + subject);
	}

	private void printSubject() {
		System.out.println("Website = " + website);
	}

	public static void main(String[] args) {
		UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
		ex1.print();
	}

}

Kết quả:

Id = 1
Subject = OOP
Website = gpcoder.com

Trả về instance của lớp hiện tại

Chúng ta có thể trả về instance của lớp hiện tại bằng cách sử dụng từ khóa this. Trong trường hợp này, kiểu trả về của phương thức phải là class của lớp hiện tại.
Ví dụ:

package com.gpcoder.oop;

public class UsingThisExample {

	private int id;

	private String website;

	private String subject;

	public UsingThisExample() {
		this.id = 1;
	}

	public UsingThisExample setWebsite(String website) {
		this.website = website;
		return this;
	}

	public UsingThisExample setSubject(String subject) {
		this.subject = subject;
		return this;
	}

	public void print() {
		System.out.println("Id = " + id);
		this.printWebsite();
		this.printSubject();
	}

	private void printWebsite() {
		System.out.println("Subject = " + subject);
	}

	private void printSubject() {
		System.out.println("Website = " + website);
	}

	public static void main(String[] args) {
		UsingThisExample ex1 = new UsingThisExample()
				.setSubject("OOP")
				.setWebsite("gpcoder.com");
		ex1.print();
	}

}

Kết quả:

Id = 1
Subject = OOP
Website = gpcoder.com

Như ví dụ trên, phương thức setWebsite và setSubject trả về tham chiếu tới biến instance của lớp hiện tại.

Được truyền như một tham số trong phương thức (method).

Từ khóa this có thể được dùng như một tham số trong phương thức (method). Cách dùng này chủ yếu được sử dụng trong sử lý sự kiện.

Ví dụ:

Helper.java


public class Helper {
	
	public void print(UsingThisExample ex) {
		System.out.println("Id = " + ex.getId());
		System.out.println("Website = " + ex.getWebsite());
	}
	
}

UsingThisExample.java

public class UsingThisExample {
	private int id;
	private String website;
	
	UsingThisExample () {
		this.id = 1;
		this.website = "gpcoder";
	}
	
	public void print() {
		Helper helper = new Helper();
		helper.print(this);	
	}

	public int getId() {
		return id;
	}

	public String getWebsite() {
		return website;
	}
	
	public static void main(String[] args) {
		UsingThisExample ex = new UsingThisExample();
		ex.print();
	}
}

Kết quả:

Id = 1
Website = gpcoder

Như ví dụ trên, phương thức print của lớp UsingThisExample truyền tham số là this (tham chiếu biến instance của lớp UsingThisExample) sang cho phương thức print của lớp Helper xử lý.

Được truyền như một tham số trong hàm dựng (constructor).

Từ khóa this có thể được dùng như một tham số trong constructor. Cách dùng này rất hữu ích nếu chúng ta sử dụng một đối tượng trong nhiều lớp.

Ví dụ:
Helper.java

public class Helper {
	
	private UsingThisExample ex;
	
	public Helper(UsingThisExample ex) {
		this.ex = ex;
	}
	
	public void printId() {
		System.out.println("Id = " + ex.getId());
	}
	
	public void printWebsite() {
		System.out.println("Website = " + ex.getWebsite());
	}
	
}

UsingThisExample.java

ppublic class UsingThisExample {
	private int id;
	private String website;
	
	UsingThisExample () {
		this.id = 1;
		this.website = "gpcoder";
	}
	
	public void print() {
		Helper helper = new Helper(this);
		helper.printId();	
		helper.printWebsite();
	}

	public int getId() {
		return id;
	}

	public String getWebsite() {
		return website;
	}
	
	public static void main(String[] args) {
		UsingThisExample ex = new UsingThisExample();
		ex.print();
	}
}

Kết quả:

Id = 1
Website = gpcoder

Như ví dụ trên, phương thức print gọi hàm khởi tạo của lớp Helper với tham số là this (tham chiếu biến instance của lớp UsingThisExample), sau đó gọi hàm printId và printWebsite để xử lý. Cách này hữu ích khi cần tái sử dụng object ở nhiều phương thức khác nhau, trong ví dụ này là printId và printWebsite.

Từ khóa super trong java

Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất.

Bất cứ khi nào bạn tạo ra instance (thể hiện) của lớp con, một instance của lớp cha được tạo ra ngầm định, nghĩa là được tham chiếu bởi biến super.

Từ khóa super có 3 cách sử dụng sau:

  • Gọi trực tiếp hàm dựng (constructor) của lớp cha gần nhất.
  • Gọi trực tiếp thuộc tính (field) của lớp cha gần nhất.
  • Gọi trực tiếp phương thức (method) của lớp cha gần nhất.

 Gọi trực tiếp constructor của lớp cha gần nhất.

Ví dụ:

Parent.java


public class Parent {
	
	private String website;
	
	public Parent() {
		System.out.println("This is parent");
		print();
	}
	
	public Parent(String website) {
		this.website = website;
		System.out.println("This is parent");
		print();
	}
	
	public void print() {
		System.out.println("Website = " + website);
	}
}

Child.java


public class Child extends Parent {

	public Child() {
		System.out.println("This is child");
	}

	public Child(String website) {
		super(website);
		System.out.println("This is child");
	}
	
	public static void main(String[] args) {
		Child child1 = new Child();
		System.out.println("---");
		Child child2 = new Child("gpcoder.com");
	}
}

Kết quả:

This is parent
Website = null
This is child
---
This is parent
Website = gpcoder.com
This is child

Như ví dụ trên:

  • Trong hàm main, child1 gọi hàm khởi tạo không có tham số, hàm khởi tạo Child() không gọi super(), khi đó trình biên dịch sẽ tự động thêm super() vào hàm constructor để gọi khởi tạo ở lớp cha.
  • Trong hàm main, child2 gọi hàm khởi tạo có tham số, hàm khởi tạo Child(str) gọi hàm super() để gọi khởi tạo ở lớp cha có tham số.

Gọi trực tiếp biến của lớp cha gần nhất.

Ví dụ:

Parent.java

public class Parent {
	
	public String website = "gpcoder.com";
	public String subject = "OOP";
	
	public Parent() {
		
	}
}

Child.java

public class Child extends Parent {
	
	public String website = "https://gpcoder.com";
	
	public Child() {
		
	}
	
	public void printParent() {
		System.out.println("Short link: " + super.website);
		System.out.println("Subject " + subject);
	}
	
	public void printChild() {
		System.out.println("Full link: " + website);
		System.out.println("Subject " + subject);
	}
	
	public static void main(String[] args) {
		Child child = new Child();
		child.printParent();
		System.out.println("---");
		child.printChild();
	}
}

Kết quả:

Short link: gpcoder.com
Subject OOP
---
Full link: https://gpcoder.com
Subject OOP

Như ví dụ trên:

  • Phương thức printParent() sử dụng super để sử dụng biến website của lớp Parent, do lớp Child có biến website cùng tên với lớp Parent. Nếu không gọi super, như phương thức printChild thì sẽ gọi biến website của lớp Child.
  • Trường hợp lớp Child không có biến trùng tên với lớp cha thì có thể không cần sử dụng từ khóa super. Trong ví dụ trên là biến subject, ở lớp Child không có biến này nên không cần sử dụng từ khóa super.

Gọi trực tiếp phương thức (method) của lớp cha gần nhất.

Ví dụ:

Parent.java


public class Parent {
	
	private String website;
	
	public Parent(String website) {
		this.website = website;
	}
	
	public void print() {
		System.out.println("Website = " + website);
	}
	
	public void welcome() {
		System.out.println("Welcome to gpcoder.com");
	}
}

Child.java


public class Child extends Parent {
	
	public Child(String website) {
		super(website);
	}

	public void printChild1() {
		print();
	}

	public void printChild2() {
		super.print();
		welcome();
	}
	
	public void print() {
		System.out.println("Subject = OOP");	
	}
	
	public static void main(String[] args) {
		Child child = new Child("gpcoder.com");
		child.printChild1();
		System.out.println("---");
		child.printChild2();
	}
}

Kết quả:


Subject = OOP
---
Website = gpcoder.com
Welcome to gpcoder.com

Như ví dụ trên:

  • Phương thức printChild2() sử dụng super để gọi phương thức print của lớp Parent, do lớp Child đã ghi đè (override) lại phương thức của lớp cha. Nếu không gọi super như phương thức printChild1 thì sẽ gọi hàm print của lớp Child.
  • Trường hợp lớp Child không ghi đè (override) lại phương thức của lớp cha thì có thể không cần sử dụng từ khóa super. Trong ví dụ trên là phương thức welcome(), ở lớp Child không có viết lại phương thức này.

Tài liệu tham khảo:

  • https://www.javatpoint.com/this-keyword
  • https://www.javatpoint.com/super-keyword
4.7
13
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: OOP Được gắn thẻ: Basic Java, OOP

Lập trình hướng đối tượng (OOPs) trong java
Từ khóa static và final trong java

Có thể bạn muốn xem:

  • Object cloning trong java (04/11/2017)
  • Tính đa hình (Polymorphism) trong Java (05/11/2017)
  • Cơ chế Upcasting và Downcasting trong java (05/11/2017)
  • Các nguyên lý thiết kế hướng đối tượng – SOLID (09/08/2018)
  • Toán tử instanceof trong java (03/11/2017)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98056 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97696 lượt xem)
  • Giới thiệu Design Patterns (87759 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86428 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83830 lượt xem)

Nội dung bài viết

  • 1 Từ khóa this trong java
  • 2 Từ khóa super trong java

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link