Hỏi về ép kiểu trong java

Mọi người có thế giải thích cho e biết việc ép kiểu trong java thực hiện như thế nào được không ạ.
ví dụ như đoạn code này

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {
public static void main(String arg [] ) {

 		Person p = new Person();

 		Employee e = new Employee();

 		Manager m = new Manager();

 		Person pArr[] = {p, e, m};
 		for (int i=0; i< pArr.length; i++){
 			System.out.println(pArr[i].getDetail());
 		}
 		
 		
 	}
}
class Person {
	public String getDetail(){
		return "Person";
	}
}
class Employee extends Person{
	@Override
	public String getDetail(){
		return "Employee";
	}
}
class Manager extends Employee{
	@Override
	public String getDetail(){
		return "Manager";
	}
}

kết quả ra là:

Person
Employee
Manager

e nghĩ là khi 3 thằng kia đã bị ép kiểu thành Person rồi thì khi gọi phương thức getDetail thì nó phải gọi của class Person chứ nhỉ.
Mong mọi người giải thích hộ e, nếu có thể có thế giải thích luôn quá trình java làm việc khi gặp trường hợp như thế này luôn được k ạ.

1 Like

extends là ép kiểu à? Tài liệu nào viết vậy?

Có thấy chỗ nào casting đâu nhỉ?

trong đoạn này e và m đều bị ép lên Person mà. nếu sai mong mọi người sửa cho

trước khi hỏi 1 câu ngớ ngẩn thì hãy đọc kĩ và nghiên cứu lại 4 tính chất của OOP trong java bạn sẽ có câu trả lời

2 Likes

ok. cám ơn bạn. mình sẽ tìm hiểu 4 tính chất này. mình mới học java và hướng đối tượng nên k biết. nếu mình thông minh như bạn chắc không phải hỏi ai rùi :smile: :smile:

Thế nên mới nói là ngớ ngẩn, bạn học chưa sâu nhưng lại muốn đi nhanh thì vấp thôi

2 Likes

okey. mình đã tìm hiểu sơ sơ về cái đa hình này rùi :smile: tiện thể bạn có thể chỉ mình luôn java làm như thế nào khi chạy đoạn code trên được không :smile:

Bạn thắc mắc chính xác mà. Đây được gọi là cơ chế Upcasting , Khi mà sự thể hiện của lớp cha được tạo thông qua đối tượng của lớp con. Trong trường hợp của bạn thì cấu trúc kế thừa theo kiểu multilevel. Trường hợp khởi tạo đối tương như trên, thì đối tượng của lớp cha được phép truy xuất các thuộc tính và phương thức được khai báo trong lớp chính nó và phương thức được overidde ở lớp con. Trong trường hợp của bạn, ví dụ lớp Manager không overrdie phương thức getDetail() của lớp Employee thì khi mà đối tượng lớp cha (Person)được tạo qua sự thể hiện của lớp Manager( Person p = new Maneger() ) khi mà nó truy xuất vào phương getDetail() , thì phương thức getDetail() được truy xuất sẽ là phương thức override gần nhất đối với lớp Manager, trong trường hợp trên là phương thức getDetail() của lớp Employee.

2 Likes

Cám ơn anh đã trả lời :smile: cái câu hỏi này là e hỏi khi chưa đọc về đa hình trong hướng đối tượng. Trước lập trình C thì thấy kiểu long bị ép kiểu về int thì biến trở thành int luôn nên tưởng bên đối tượng giống thế! Nhưng giờ biết về đa hình rùi thì hiểu rằng khi tạo đối tượng bằng từ khóa new thì bản chất đối tượng là đối tượng thuộc class sau từ khóa new. Việc upcasting chỉ là việc nhìn đối tượng như một cha của nó còn bản chất đối tượng không thay đổi. ví dụ như Manager và Employee đều là Person. vì vậy khi gọi getDetail() thì tùy theo đối tượng nào thì thì sẽ thực hiện phương thức getDetail() của đối tượng đó. Không biết e hiểu thế đúng không? :smile:

2 Likes

Bạn xem đường link này. Hi vọng bạn sẽ clear được nó. http://www.javatpoint.com/runtime-polymorphism-in-java

1 Like

Nếu có vấn đề nào không hiểu, bạn cứ đề cập, hi vọng mình có thể sáng tỏ nó giúp bạn.

2 Likes

Cám ơn anh à :smile: :smile:

Cái này gọi là cơ chế Upcasting và downcasting trong Java:

Bạn muốn biết cách thức hoạt động của nó thì xem lại tính đa hình trong Java:

You can refer to the article on polymorphism in java.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?