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 Cơ chế Upcasting và Downcasting trong java

Cơ chế Upcasting và Downcasting trong java

Đăng vào 05/11/2017 Được đăng bởi GP Coder 26595 Lượt xem

Trong bài Ép kiểu trong Java tôi đã giới thiệu với các bạn chuyển kiểu đối với kiểu dữ liệu cơ bản. Trong bài này, tôi sẽ giới thiệu với các bạn cơ chế Upcasting và Downcasting trong java. Đây là cơ chế được sử dụng để chuyển kiểu đối với kiểu dữ liệu tham chiếu.

Ví dụ chương trình sau:


class Animal {
	public void eat() {
		System.out.println("eating...");
	}
}

public class Cat extends Animal {
	public void meow() {
		System.out.println("meowing...");
	}
}

Nội dung

  • 1 Upcasting
  • 2 Downcasting

Upcasting

Khi biến tham chiếu của lớp cha tham chiếu tới đối tượng của lớp con, thì đó là Upcasting.

Ví dụ:


public class Upcasting {

	public static void main(String[] args) {
		Cat cat = new Cat();
		Animal animal1 = cat; // Chuyển kiểu không tường minh
		Animal animal2 = (Animal) cat; // Chuyển kiểu tường minh

		cat.eat();
		cat.meow();
		animal1.eat();
		animal2.eat();
		// animal2.meow(); // Không thể gọi phương thức meow()
	}

}

Kết quả thực thi chương trình trên:

eating...
meowing...
eating...
eating...

Với nội dung hàm main như trên, tôi đã thực hiện upcasting khi gán đối tượng cat thuộc lớp Cat cho đối tượng animal1 và animal2 thuộc lớp Animal.

Đối với upcasting, chúng ta hoàn toàn có thể sử dụng chuyển kiểu tường mình hoặc không tường minh, cả hai cách đều được chấp nhận.

Một lưu ý nhỏ: Mọi phương thức của lớp Animal hoàn toàn có thể gọi qua 1 đối tượng thuộc lớp Cat do giữa Animal và Cat có quan hệ IS_A. Tuy nhiên, nếu thực hiện override bất kỳ phương thức nào của lớp Animal tại lớp Cat thì trong quá trình runtime hàm được gọi sẽ là hàm của lớp Cat .

Quay trở lại ví dụ phía trên. Nếu trong lớp Cat, thực hiện override hàm eat như sau:


public class Cat extends Animal {

	@Override
	public void eat() {
		System.out.println("Eat meat");
	}

	public void meow() {
		System.out.println("meowing...");
	}
	
}

Kết quả thực thi lại chương trình trên như sau:

Eat meat
meowing...
Eat meat
Eat meat

Downcasting

Khác với upcasting, Downcasting là dạng chuyển kiểu chuyển 1 đối tượng là một thể hiện của lớp cha xuống thành đối tượng là thể hiện của lớp con trong quan hệ kế thừa.

Thông thường, khi thực hiện dòng mã nguồn:

Animal cat = new Cat();

Ta hoàn toàn có thể gọi những phương thức đã được override của lớp Animal tại lớp Cat qua đối tượng animal. Tuy nhiên, vấn đề phát sinh khi ta muốn gọi mọi phương thức của lớp Cat thông qua việc ép kiểu đối tượng thuộc lớp Animal. Khi đó, ta sử dụng downcasting .

Ví dụ:

public class Downcating {

	public static void main(String[] args) {
		Animal animal = new Cat();
		Cat cat = (Cat) animal; // downcasting
		cat.meow();
	}

}

Ta thấy, meow() là phương thức chỉ có ở lớp Cat. Tuy nhiên, thông qua downcasting ta hoàn toàn có thể gọi ra phương thức đó thông qua đối tượng cat mà không cần new Cat() bằng việc downcasting đối tượng animal có kiểu Animal mà không xảy ra vấn đề trong quá trình biên dịch (compile) và thực thi (runtime).

Lưu ý: khi thực hiện downcasting có thể sẽ gặp lỗi ClassCastException nếu không thể thực hiện downcassting được. Để an toàn chúng ta nên kiểm tra một đối tượng có phải là thể hiện của một kiểu dữ liệu cụ thể không trước khi thực hiện downcasting. Xem thêm hướng dẫn ở bài viết Toán tử instanceof trong java.

Tài liệu tham khảo:

  • https://www.stdio.vn/articles/read/267/chuyen-kieu-trong-java
4.9
20
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

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

Tính trừu tượng (Abstraction) trong Java
Lớp lồng nhau trong java (Java inner class)

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

  • Toán tử instanceof trong java (03/11/2017)
  • Tính kế thừa (Inheritance) trong java (05/11/2017)
  • Một số nguyên tắc, định luật trong lập trình (22/08/2018)
  • Từ khóa this và super trong Java (01/11/2017)
  • Các nguyên lý thiết kế hướng đối tượng – SOLID (09/08/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • 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
  • Sử dụng Alternate Exchange trong RabbitMQ 10/06/2020

Xem nhiều

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

Nội dung bài viết

  • 1 Upcasting
  • 2 Downcasting

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 Performance PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern 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.

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 2023 © 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
Google
Hacker News
Line
LinkedIn
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
Xing
Yahoo! Mail

Copy short link

Copy link