Tại sao có thể gọi private method từ 1 object được khai báo từ, trong class trùng tên chứa private method đó?
Mình vô tình mò được đoạn code java sau và không hiểu sao nó lại chạy đc:
public class test {
private int a = 10;
private void printA() {
System.out.println(a);
}
public test(int a) {
this.a = a;
}
public void callPrintA() {
test bla = new test(1000);
bla.printA();
}
}
Tại sao object bla lại có thể gọi được method printA() trong khi nó là private? Và mình có đọc thì private chỉ cho phép trong nội bộ class hiện hành. Vậy khi new bla() thì nó ra 1 object mới nhưng sao vẫn có truyền truy cập printA() mọi người nhỉ? Trong khi nếu mình làm như code dưới thì sẽ báo lỗi đúng như tính chất của nó.
public class Blabla {
public static void main(String[] args) throws IOException {
test bla = new test(100);
//bla.printA(); Netbean sẽ báo lỗi
bla.callPrintA(); // in ra 1000
}
}
Vậy không lẽ 2 object trên có bản chất khác nhau? @_@
Mình nghĩ là khác nhau :? Nhưng không rõ khác chỗ nào.
Mọi người giải thích giúp mình với. Ko rõ Kw nên chả biết GG như thế nào
Thanks nhiều
EDIT: Phát hiện ra là object như trên có thể truy cập đc mọi thứ chứ ko riêng gì private method. :c
private là riêng của class chứ không phải của object. Chúng cùng class thì không có gì che dấu hết
Vậy tức là
bla.printA là gọi private method trong class, chứ không phải từ object ư?
Kiểu như printA(test) { print test.a }
Chứ không phải là printA(bla) {print bla.a} phải không gió???
Trong khi hàm main, thì nó mới đúng là
printA(bla) {print bla.a} :???
Hiểu thế này nhé. Hàm
printA
thì private rồi. Nó không thể gọi ngoài class. Còn cái callprintA vì this là 1 ojebct của test nên có thể gọi hàm printA của blaCảm ơn gió.
Nhưng vẫn chưa thông đc gió ơi @_@
Kiểu như sao this gọi đc printA của bla ấy :?
Đang định đi ngủ lại thấy topic hay [quote=“Gio, post:4, topic:23066”]
this
[/quote]
Em thấy ở đây có 2 object khác nhau mà, nếu this.printA() thì sẽ ra 100, OK, hợp lí, cơ mà bla.printA() thì có gì đó không ổn
Ví dụ:
Với code này:
Aha, Kiếm được mấy cái link
Why can a "private" method be accessed from a different instance?
Why can I invoke a private method on an instance of the sub-class when it shouldn't be visible to the instance?
Topic hay, cái này C++ cũng làm được. Miễn là vẫn còn nằm trong đoạn code định nghĩa class đó thì cái gì, thuộc về class đó, ta cũng gọi được.
Lúc trước có dùng mẹo này để code cái gì đấy mà không nhớ nên viết tạm cái ví dụ này trong C++.
Ideone.com
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.
Cảm ơn mọi người :))
môngNão đã được thông rồi.Và câu trên có vẻ như áp dụng cho inner class, outer class luôn.
stackoverflow.com
Inner class có thể gọi được cả private member từ outer class và outer class có thể chơi được luôn với cả inner class member.
In Java nested classes, can the enclosing class access private members of inner classes?
Why do inner classes make private methods accessible?
Có phải là hàm equals hoặc compare không a
Lúc đầu em cứ nghĩ private là chỉ truy cập bằng this, hóa ra private ý là chỉ truy cập được ở trong class (nằm trong phần code class đó)
À đúng rồi, chính xác =)) lúc làm mấy cái Operators Overloading. Không có cái này thì làm sao mà lấy được mấy cái biến private
Code ví dụ
Ở đây
feet
vàinches
là private, nhưng trong hàmvoid operator=(const Distance &D )
ta gọi thoải mái.Nguồn: http://www.tutorialspoint.com/cplusplus/assignment_operators_overloading.htm
Có thể bạn đã hiểu rồi nhưng mình sẽ giải thích cho bạn 1 cách đơn giản hơn như sau:
hàm private printA() nó được gọi bởi hàm anh em trong cùng 1 class là hàm public callPrintA() nên việc gọi hàm printA() là hoàn toàn có thể và đúng luật.
trong hàm main() bạn gọi tới hàm public callPrintA() -> hợp lệ. hàm callPrintA() gọi tới anh em của nó là hàm printA() -> hợp lệ (dù có là hàm private vì 2 hàm đó là anh em với nhau chứ không phải trong hàm main() gọi trực tiếp đến hàm private printA() thì mới là không hợp lệ).