01/10/2018, 14:22

Tính đa hình trong java

Không tìm thấy thuộc tính major đâu?

class People {
private String name;
public String getName() {
return name;
 }

public void setName(String name) {
this.name = name;
}
}

class Teacher extends People{
String major;

 public String getMajor() {
 return major;
}

public void setMajor(String major) {
this.major = major;
 }
 }

ublic class TestProject {
public static void main(String[] args) {
 People p;
p = new Teacher();
p.setName(); // Cái này thì thấy
p.setMajor(); // Cái này không thấy
 }
}
}
Silicon viết 16:28 ngày 01/10/2018

chưa định nghĩa mà đòi thấy…

Tynk Huynk viết 16:26 ngày 01/10/2018

Bạn khai báo kiểu reference là People thì nó chỉ quan tâm các method, thuộc tính được khai báo trong People thôi

com0t viết 16:38 ngày 01/10/2018

Vậy phải làm sao mới thấy được phương thức setMajor. Vì có yêu cầu đa hình

Tynk Huynk viết 16:35 ngày 01/10/2018

nếu vậy chắc phải hard code

((Teacher)p).setMajor();

đoạn code trên mục đích tạm thời thay đổi kiểu reference thành Teacher rồi mới truy cập được method setMajor của class Teacher

anon45952904 viết 16:26 ngày 01/10/2018

p.setMajor(); // Cái này không thấy

Cái này nó chỉ có ơr class Teacher thì đâu gọi là đa hình. Bạn declare p là People mà lại gọi method của Teacher thì ko có là đúng rồi.
Bạn đang “code to class” thay vì “code to interface” thì ko thể hiện được tính đa hình.
Update: VD: Khi bạn đang trong hình dạng người lớn nhưng đăng ký với công an rằng “tô là trẻ con” thì người ta ko cho bạn “làm chuyện người lớn”.

Nguyen Ca viết 16:23 ngày 01/10/2018

Cái này là về upcast, downcast trong java, đa hình đâu.-.-
Cái của em là đang downcast từ pepole xuông teacher nên phải chỉ rỏ kiểu như @huynhtinh nói.
upcast thì không cần chỉ rõ kiểu

Tên Gì Cũng Được viết 16:35 ngày 01/10/2018

cái đó chỉ là kế thừa, ko phải đa hình
muốn thể hiện được tính đa hình thì trong class Teacher cứ re-declaration methd getName là được rồi
ví dụ: trong

public String getName() {
return "Teacher " + name;
}

khi đó nếu đối tượng là People gọi getName thì trả về [name]
còn đối tượng Teacher gọi getName thì trả về “Teacher [name]”
đó là đa hình, 1 method nhưng nhiều định nghĩa

rogp10 viết 16:31 ngày 01/10/2018

Xét về ngữ nghĩa cũng không đúng vì đâu phải ai cũng có major thêm tên họ ID gì là đc.

Vì có yêu cầu đa hình

Chẵn viết 16:25 ngày 01/10/2018

Mình định demo tý code mà thấy trên này viết chi tiết lắm rồi nên bạn tham khảo để hiểu rõ hơn về đa hình nhé.

Giang Phan viết 16:30 ngày 01/10/2018

Việc bạn thực hiện:
People p = new Teacher();
Đây là cơ chế Upcasting trong java. Các phương thức setMajor(), getMajor() không hề tồn tại trong đối tượng People . Nếu bạn muốn gọi phương thức setMajor() bạn phải khởi tạo trực tiếp đối tượng Teacher:
Teacher t = new Teacher();

Bạn có thể xem thêm bài viết bên dưới để hiểu rõ hơn về tính đa hình trong Java:

GP Coder – 5 Nov 17

Tính đa hình (Polymorphism) trong Java - GP Coder (Lập trình Java)

Hướng dẫn lập trình Java, Design Pattern, Spring, JSF, Primefaces, Collection, Multi-thread, Webservice, SQL, Report, Apache POI.

Bài liên quan
0