2012-08-25 63 views
12

Làm cách nào để gọi phương thức toString bằng biến tham chiếu của giao diện Test, phương thức này không có phương thức toString?Giao diện có phương thức toString không?

interface Test 
{ 
    void show(); 
    String toHi(); 
} 
class Demo implements Test 
{ 
    public void show(){ 
     System.out.println("Show"); 
    } 
    public String toString(){ 
     return "Hello"; 
    } 
    public String toHi(){ 
     return "Hi";  
    } 

    public static void main(String[] args) 
    { 
     Test t=new Demo(); 
     String s=t.toString(); 
     System.out.println(s); 
    } 
} 
+0

gì đã xảy ra khi bạn cố gắng nó? Ngoài ra, làm thế nào bạn sẽ xây dựng một thực hiện giao diện mà không mở rộng đối tượng? – EJP

+0

actully tôi muốn biết rằng phương thức toString() được gọi bằng biến tham chiếu giao diện m. –

+0

Bởi vì, như tôi đã gợi ý, bạn * không thể * xây dựng một triển khai giao diện mà * không * mở rộng Object. Vì vậy, bất kỳ triển khai nào tuyên bố hoặc kế thừa phương thức toString(), vì vậy bạn có thể gọi nó. – EJP

Trả lời

10

Các Java Documentation nói ...

When an interface has no direct SuperInterface, it will create abstract public method for all those public methods present in the Object class.

Đây là lý do tại sao bạn có thể gọi phương thức toString() trên tham chiếu giao diện

+1

nếu nó mặc định đã tạo ra một phương thức trừu tượng công khai .. tại sao chúng ta không buộc phải thực hiện phương thức trong lớp cụ thể thực hiện nó ???. nó không đưa ra bất kỳ ngoại lệ biên dịch nào. !!! trong giao diện ngắn A đã ghi đè lên toString() từ đối tượng. Lớp B triển khai IA. không nên thực hiện class toString() ?? –

+0

@PunithRaj Nếu lớp B không mở rộng bất kỳ lớp nào thì lớp này mở rộng hoàn toàn lớp Object. Lớp đối tượng có thực hiện cho các phương thức trừu tượng đó. –

5

Bất kỳ Object có phương thức toString(). Bất cứ điều gì sẽ thực hiện một giao diện sẽ ngầm mở rộng Object, do đó cũng sẽ có phương thức toString().

11

Object có phương thức toString(), vì vậy mọi thứ (trừ các loại nguyên thủy) có phương thức toString(). Java sẽ xử lý bất cứ điều gì, ngay cả một giao diện trống rỗng, như có tất cả các phương pháp của Object, bởi vì nó luôn luôn.

+0

Nhưng, nó không được viết trong tài liệu java rằng một giao diện mở rộng một lớp Object. Lớp đối tượng là gốc của phân cấp lớp. Mỗi lớp có đối tượng là một lớp cha. Tất cả các đối tượng, kể cả mảng, thực hiện các phương thức của lớp này. và giả sử, nếu một giao diện mở rộng lớp Object thì phương pháp không trừu tượng nào được định nghĩa trong lớp Object .. và như tôi biết rằng giao diện chỉ có thể mở rộng giao diện, nhưng ở đây Object không phải là giao diện .... ??? –

+0

Phương thức op có nghĩa là phương thức toString() được gọi trên tham chiếu Giao diện ... Giao diện không bao giờ mở rộng lớp Đối tượng .... –

+0

@AkhileshDharDubey xem câu trả lời của tôi –

2

Lớp C thực hiện My nhưng cũng mở rộng Object, vì tất cả các đối tượng cuối cùng cũng làm trong cây thừa kế của chúng.

Lớp Object không có phương thức toString(), cùng với một số loại khác.

1

Vì lớp Demo hoàn toàn extends lớp Object, kế thừa phương thức toString. Và vì đó không phải là phương thức abstract, lớp Demo không buộc phải cung cấp triển khai, mặc dù bạn có thể trực tiếp gọi toString trên một phiên bản Demo. Để biết thêm thông tin, vui lòng xem Lesson: Interfaces and Inheritance.

Như đã nêu trong Object API,

Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

Ngoài ra, lưu ý rằng phương pháp toString không phải là một phần của định nghĩa giao diện, mà đúng hơn là định nghĩa Object lớp.

0

Mọi đối tượng (ngoại trừ kiểu nguyên thủy) trong java đều có phương thức toString().

+0

kiểu nguyên thủy không phải là đối tượng (và bạn quên đề cập rằng giao diện không phải là đối tượng) – mre

2

Lý do mà bạn có thể gọi phương thức mà thông qua đó biến interfce của bạn là vì một điều trị đặc biệt trong trường hợp các giao diện trong Java.

Mặc dù phương thức không được khai báo rõ ràng trong giao diện, điều trị đặc biệt ngầm cung cấp khai báo cho tất cả các phương thức công khai được xác định trong lớp Object. Và phương pháp toString là một trong số đó.

Nhưng, lưu ý rằng giao diện không ngầm mở rộng bất kỳ giao diện siêu (hoặc lớp) nào khác với các lớp mở rộng lớp Object.

Bạn sẽ tìm thấy giải thích tốt hơn tại đây - Do Interfaces really inherit the Object class in Java? .

2

Bạn không thể gọi cho phương thức Interface toString() vì chúng chỉ có các phương thức bạn khai báo.

Nhưng bạn có thể lừa hệ thống. Mỗi đối tượng có một phương thức toString() và rõ ràng là giao diện của bạn được thực hiện bởi lớp mở rộng đối tượng, do đó bạn cũng sẽ có nó.

Vì vậy, bạn có thể thực hiện một số điều như thế:

public static void main(String[] args) 
    { 
     My m=new C(); 
     String s= m + ""; // the toString() of the C class will be called here 
     System.out.println(s); 
    } 
Các vấn đề liên quan