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 . 40157 Lượt xem . Toàn màn hình

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
23
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

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:

  • Object cloning trong java (04/11/2017)
  • Một số nguyên tắc, định luật trong lập trình (22/08/2018)
  • Tính kế thừa (Inheritance) trong java (05/11/2017)
  • 4 tính chất của lập trình hướng đối tượng trong Java (07/11/2017)
  • Tính trừu tượng (Abstraction) trong Java (05/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 (98033 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97681 lượt xem)
  • Giới thiệu Design Patterns (87732 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86400 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83806 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 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