Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Thắc mắc Interface trong Java

Discussion in 'Xây dựng ứng dụng chạy console, applet' started by Doan_Chi_Binh, 8/7/11.

  1. Doan_Chi_Binh

    Doan_Chi_Binh New Member

    Tôi là người hoàn toàn mới làm quen với ngôn ngữ Java. Khi đọc các tài liệu về Java căn bản phần nói đến giao diện tôi cảm thấy còn rất mù mờ và xin đặt câu hỏi như sau

    Tại sao lại phải định nghĩa một giao diện rồi phải hiện thực (implements) giao diện trong một lớp ? Vì tôi thấy (cách hiểu của tôi có thể là chưa đúng) giao diện thực chất chỉ là việc khai báo các phương thức public với tên và đối số mà nó cần,chứ không có mã để chỉ ra hành vi của nó. Các mã hành vi của nó sau đó sẽ được chỉ rõ ra trong lớp hiện thực nó. Như vậy việc hiện thực giao diện (Interface) khác với việc thực hiện phương thức Public của chính lớp đó như thế nào. Mục đích của Giao diện là gì? và lợi ích ra sao?
    Tôi thấy trong một số tài liệu là dùng để khắc phục tình trạng 1 class chỉ được phép có 1 lớp cha, nhưng tại sao phải sử dụng interface trong khi bản thân class hoàn toàn có thể định nghĩa được những method theo ý muốn của nó.
    Xin giải thích giùm tôi một cách rõ ràng để tôi dễ nắm bắt nhất.

    Hãy xem 2 thí dụ sau

    PHP:
    Thí vụ 1
    //Thí dụ định ngghĩa giao diện

    public interface myinterface

    {

     public 
    void add(int x,int y);

     public 
    void volume(int x,int y,int z);

    }

    //Định nghĩa một lớp hiện thực giao diện
    import java.io.*;

    class 
    Demo implements myinterface

    {

     public 
    void add(int x,int y)

     {

       
    System.out.println(“ “+(x+y));

       
    //Giả sử phương thức add được khai báo trong giao diện

     
    }

     public 
    void volume(int x,int y,int z)

     {

       
    System.out.println(“ “+(x*y*z));

       
    //Giả sử phương thức volume được khai báo trong giao diện 

     
    }

     public static 
    void main(String args[])

     {

      
    Demo d=new Demo();

      
    d.add(10,20);

      
    d.volume(10,10,10);

     }

    }

      

    Thí vụ 2

    Nếu định nghĩa một lớp không có 
    Implements như sau

    import java
    .io.*;

    class 
    Demo

    {

     public 
    void add(int x,int y)

     {

       
    System.out.println(“ “+(x+y));

     }

     public 
    void volume(int x,int y,int z)

     {

       
    System.out.println(“ “+(x*y*z));

    }

     public static 
    void main(String args[])

     {

      
    Demo d=new Demo();

      
    d.add(10,20);

      
    d.volume(10,10,10);

     }

    }

    Việc thực thi các câu lệnh

      d
    .add(10,20);

      
    d.volume(10,10,10);

    trong thí dụ 1 và trong thí dụ 2 có gì khác nhau?
    Xin cảm ơn ;)
     
  2. @Q_Q@

    @Q_Q@ Member

    Ðề: Thắc mắc Interface trong Java

    Chào bạn. Mình cũng có biết chút chút về java, sau đây những gì mình hiểu về interface của java và góp ý cùng bạn nến có sai sót xin các cao thủ chỉ giáo thêm.

    Class Interface chỉ là những ý tưởng đầu tiên của dự án cũng như những việc cần phải làm trong một dự án lớn có thể cần đến 1000 công việc chẳn hạn thì nó tương đương với 1000 phương thức cần được ta cài đặt với những chức năng và công việc khác nhau. Ta không thể cùng một lúc nhớ hết những việc cần làm trong dự án, hay là đã làm đến đâu, đã cài đặt xong các công việc đó hay chưa. Nên ta cần tạo một interface và đẫn xuất nó cho các từ lớp cần cài đặt.
     
    thuandoan likes this.
  3. Doan_Chi_Binh

    Doan_Chi_Binh New Member

    Ðề: Thắc mắc Interface trong Java

    Mình ko nghĩ như vậy, bạn có làm bao nhiêu công việc đi chăng nữa thì bạn cũng phải định nghĩa chúng trong class, và khi dùng interface thì cũng phải định nghĩa các method như vậy thôi.
     
  4. meocon123

    meocon123 New Member

    Ðề: Thắc mắc Interface trong Java

    Câu hỏi hay đấy. Ai trả lời đi cho tui học hỏi với.
     
  5. Ðề: Thắc mắc Interface trong Java

    Việc dùng interface là để giải quyết vấn đề đa kế thừa trong lập trình hướng đối tượng.
    Ví dụ thế này: Bạn có 2 lớp
    1. lớp A, có 2 method là: A1, A2
    2. lớp B, có 2 method là B1,B2
    Giờ có một lớp C nào đó, có method A1 của lớp A và có method B2 của lớp B. Vậy thì làm thế nào?
     
    thuandoan likes this.
  6. meocon123

    meocon123 New Member

    Ðề: Thắc mắc Interface trong Java

    Vậy sao mình không viết cả 4 phương thức đó trong lớp C luôn, chứ implement 2 lớp A,B làm gì, dù sao thì trong 2 lớp A,B đó các phương thức cũng chỉ mới được đưa ra thôi chứ cũng đâu có làm gì?
    Hôm bữa có đi phỏng vấn về Java, anh kia hỏi mình thế nào là Override, mình trả lời Override là phương thức đã xuất hiện ở lớp Cha được dùng ở lớp con nhưng đã bị sửa đổi. Anh hỏi tiếp: Vậy sao em không viết luôn phương thức đó trong lớp con luôn, sao lại phải viết trong lớp cha rồi lại phải đi viết lại tiếp trong lớp con làm gì. Mình còn gà Java quá nên suy nghĩ mãi không biết câu trả lời. Coi như lấy kinh nghiệm cho những lần sau.
     
  7. Ðề: Thắc mắc Interface trong Java

    mềnh nói 2 phương thức chỉ là ví dụ, khi implement phải có cả 4 chứ :P. Giờ lại nảy sinh một lớp D nào đó có phương thức A1,A2, chẳng lẽ lại viết mới một class nữa? như thế còn gì là Hướng Đối Tượng (OOP)8-x.

    Tính kế thừa trong OOP :D
     
    manhvv99 likes this.
  8. meocon123

    meocon123 New Member

    Ðề: Thắc mắc Interface trong Java

    Bởi vậy mới nói: Để hiểu được thừa kế hay đa hình là gì thì dễ chứ để hiểu được thừa kế hay đa hình được dùng để làm gì và dùng trong trường hợp nào quả là không hề đơn giản, vài lời góp ý vậy thôi.
     
    minhhn0205 likes this.
  9. nong_dan

    nong_dan Active Member

    Ðề: Thắc mắc Interface trong Java

    Hi All!
    mình có chút hiểu biết về OOP nên muốn đóng góp chút kiến thức về interface(chỉ là theo ý hiểu của mình) có gì mong các cao thủ chỉ giáo...

    Interface là gì thì ai cũng biết nhưng đúng như bạn Doan_chi_binh có câu hỏi rất hay: tại sao lại phải rườm rà dùng nó??
    Quả thật khi bạn làm một Project nhỏ thì interface nói chung và abtract Class nói riêng(tại sao có cả abtract Class ở đây mình sẽ nói sau) thì chả có ý nghĩa gì nhưng với Project lớn thì nó rất hữu ích ...
    =>Mình có một ví dụ sau:
    PHP:
    public class maus {
        public 
    void stimme(){
            
    System.out.println("chit! chit!");
        }
    }
    public class 
    katze {
        public 
    void stimme(){
            
    System.out.println("meo! meo!");
        }
    }
    public class 
    hund implements tiere{
        public 
    void stimme(){
            
    System.out.println("gau! gau!");
        }
    }
    giờ bạn phải cho tất cả vào một Object array rồi gọi chúng ra xem kết quả thế nào?? Hoàn toàn ko được mặc dù chúng có cùng một phương thức stimme() ~X(
    => để giải quyết vấn đề này ta cho nó implements một interface tiere
    PHP:
    public interface tiere {
        
    void stimme();
    }
    giờ thì hoàn toàn oki rồi phải ko nào?! ;))
    PHP:
    public class test {
        
        public static 
    Object[] tiere = {new hund(), new maus(),new katze()};
        
    public static 
    void main(String [] args)
    {
        new 
    test();
         ((
    tieretiere[2]).stimme();
        }
    }
    => Nào bạn thấy nó hữu dụng chưa??

    Nhân tiện đây mình cũng nói luôn về abtract Class vì nó cũng có câu hỏi giống như thế...
    Thật ra abtract Class hoàn toàn giống như Interface.
    Interface chỉ ra đời vì lý do trong Java ko được thừa kế nhiều lớp. còn implements thì thoải mái.

    đó chỉ là một ví dụ nho nhỏ. Để tìm hiểu kĩ bạn nên tìm hiểu về design patterns thì sẽ rõ hơn (chịu khó cầy cái này khoai nhưng mà xong thì lương sẽ cao đó ;)) )
    => làm xong Project mình sẽ cố gắng viết một tut hoàn chỉnh về cái này... Mà sao ko mở dc thread mới trong một số forum con nhỉ??
     
    manhvv99 likes this.
  10. nong_dan

    nong_dan Active Member

    Ðề: Thắc mắc Interface trong Java

    bạn nói thế thì bạn mới chính là người hiểu chưa chuẩn về OOP. Mình hỏi bạn nhé
    Interface chỉ viết về định nghĩa của một lớp thôi. Ví dụ như interface A thì nó liệt kê các method(phương thức) của A là A1, và A2 thôi. Rôi sau đó khi bạn implemets vào thì sao??
    bạn vẫn phải viết lại hoàn toàn chả thiếu một chữ =)) .... Khi viết Class D cũng chả phải viết lại nữa.. bạn thừa kế dc cái gì nào???
     
  11. Ðề: Thắc mắc Interface trong Java

    Bạn nên đọc post trên của mềnh, có thể ví dụ của mềnh nó chưa rõ ràng cho lắm.
     
  12. meocon123

    meocon123 New Member

    Ðề: Thắc mắc Interface trong Java

    @nong_dan: Interface chỉ viết về định nghĩa của một lớp thôi. Ví dụ như interface A thì nó liệt kê các method(phương thức) của A là A1, và A2 thôi. Rôi sau đó khi bạn implemets vào thì sao??
    bạn vẫn phải viết lại hoàn toàn chả thiếu một chữ .... Khi viết Class D cũng chả phải viết lại nữa.. bạn thừa kế dc cái gì nào???

    --> Đấy đấy, vấn đề với những người mới học như mình là không hiểu tại sao lại phải dùng interface, mà sao bác nongdan cho cái vị dụ sao mà khó hiểu thế, mình xem mà cứ thấy tậm tịt thế nào, huhuhu...!
     
  13. nong_dan

    nong_dan Active Member

    Ðề: Thắc mắc Interface trong Java

    Mình đọc hết rồi... Như bạn ví dụ thì phải viết A và B ở dạng Interface, mà đã là interface thì chỉ viết định nghĩa cho methede mà thôi.
    Khi bạn implement vào thì bạn sẽ phải viết lại hoàn toàn. Như vậy cho dù cần phải viết Class D như bạn nói thì cũng vẫn phải viết lại thôi => câu hỏi lại trở về như bạn Doan_Chi_Binh hỏi: tạo interface là cái quái gì, đằng nào chả phải viết lại. Thừa kế ở đây chả có tác dụng gì.... Hơn nữa đã implement một Interface thì lại phải viết lại hết các methode của Class cha. Như ví dụ của bạn:
    interface A : method A1, A2
    interface B : method B1, B2
    => D implement A, B => bình thường thì D chỉ phải viết 2 method A1, B1 giờ phải viết thêm cả A2 và B2 (mặc dù để trống) như vậy xem ra dài dòng và chả có lợi gì => như vậy tại sao nói lập trình OOP là thế mạnh của java???

    Cái mình nói đó là để "phản" bác lại vấn đề bạn nguoi.tap.code giải thích, bạn ý đi một vòng rồi quay về điểm xuất phát...:(
    Còn code của mình thì rất đơn giản. Mỗi Class (quan trọng gì tên) có cùng một method là void stimme().
    Bình thường nếu có Class test() (dùng để chạy) muốn gọi phương thức đó của một Class nào đó ra thì ta gọi là:
    new hund().stimme(); // nếu của class hund
    new maus().stimme();//nếu gọi class maus
    => chung lại là new xxx.stimme();
    giờ ta cho 3 class đó vào một array để gọi ra tùy lúc . Nếu ko có interface thì điều này ko thể. Ngược lại nếu có thì làm như mình đó thôi ...=> Xin lỗi văn dốt nát nên gt hơi khó hiểu. Cách đơn giản nhất là bạn viết code chạy thử sẽ hiểu liền:
    +thử với ko có Interface
    + thử với có....
     
  14. Ðề: Thắc mắc Interface trong Java

    Ẹc, thế giờ lớp D nó có thêm method D1,D2 nữa thì sao?
    Cái ví dụ mình đưa ra là để cố lý giải tính "đa kế thừa" khi dùng interface.
    Còn việc tại sao lại phải dùng interface thì như ban ở #2 nói đó
    ps: mình vẫn ko hiểu cái ví dụ của bạn nói lên cái gì? :(
     
  15. nong_dan

    nong_dan Active Member

    Ðề: Thắc mắc Interface trong Java

    oki.. Nhưng bạn giải thích như thế thì ko trả lời dc câu hỏi của chủ "thởt" đưa ra. Dẫn đi dẫn lại => quay lại điểm khởi đầu...

    => người ta hiểu sai nên mới nói thế...
     
  16. rucvan

    rucvan New Member

    Ðề: Thắc mắc Interface trong Java

    Mình cũng là người mới chuyển từ C# sang java, theo mình thì có hai điểm quan trọng dẫn đến việc chúng ta phải thực hiện interface.
    1. Interface có thể được coi là một cái khung của chương trình. Dựa và yêu cầu của dự án mà chúng ta xây dựng các interface thích hợp. Interface cũng góp phần chia nhỏ dự án của bạn ra(đúng). giả sử đơn giản là bạn à không nhóm của bạn đang phải xây dựng một ứng dụng theo mô hình 3 lớp. Công việc tiến hành từ dưới lên. tức là bắt đầu xây dựng các CSDL => viết các logic nghiệp vụ => xây dựng giao diện. Như vậy thì người thực hiện các logic nghiệp vụ phải ngồi đợi người làm CSDL xong thì mới làm được, tương tự người xây dựng giao diện cũng phải ngồi đợi 2 người kia làm xong. Như thế sẽ mất rất nhiều thời gian cho một dự án. Nhưng thay vì ngồi đợi, mọi người cùng xây dựng theo các interface có sẵn trước đó....
    2. Như bạn biết Java khác với C/C++: nó chỉ có khả năng đơn kế thừa. Như vậy dùng interface cũng là một dạng của đa kế thừa
     
    thuandoan likes this.
  17. Ðề: Thắc mắc Interface trong Java

    Bạn chỉ cần hiểu đơn giản là Interface có tính năng đa thừa kế còn class thì ko .
    Một ví dụ đơn giản để bạn thấy rõ:
    Khi khai báo :
    Interface A{}; Interface B{}; Class C{}; Class D{};

    Nếu bạn ghi là: Class F extends C,D => là sai do class không hỗ trợ đa kế thừa nhưng bạn có thể ghi là Interface R extends A,B => do Interface có hỗ trợ đa kế thừa . Điều quan trọng không kém là bạn có thể implements A,B từ Class E => Tức là class có thể không mang tính chất đa kế thừa nhưng có thể implement nhiều Interface . Nói chung mối quan hệ của class và Interface là ở chỗ này .
    Mình nghĩ bạn cần tìm hiểu thêm về Abstract để hiểu rõ hơn vấn đề, để thấy rõ lợi hại của Interface qua implement :D
     
  18. Ðề: Thắc mắc Interface trong Java

    -Tại sao người ta không xây luôn cái nhà mà phải thuê kiến trúc sư về vẽ bản thiết kế.
    -Tại sao những người thợ xây lại có thể chia công việc cho nhau, phối hợp đồng bộ như vậy.
    Chuyển qua câu hỏi của bạn:
    -Tại sao không xây dựng Class luôn mà lại phải viết trước Interface cho Class.
    -Tại sao các thành viên trong đội ngũ lâp trình lại có thể chia nhau công vệc và phối hợp nhịp nhàng đến thế.

    ----------------Giải quyết xong thắc mắc của chủ thớt nhé.

    Câu hỏi của bạn chủ thớt khá hay. Theo kinh nghiệm lập trình của mình thi Interface có rất rất...rất nhiều công dụng của nó từ các ứng dụng lớn đến các ứng ứng nhỏ (tất nhiên khi adự án của bạn càng lớn càng dễ thấy lợi ích từ việc sử dụng giao diện), đặc biệt là trong việc xây dựng thư viện hàm chuẩn.
     
    nguyenvanminh_289 likes this.
  19. Ðề: Thắc mắc Interface trong Java

    Cứ tìm hiểu tiếp bạn sẽ hiểu rõ Interface có vai trò rất lớn, đặc biệt là trong một ngôn ngữ thuần hướng đối tương nhu Java
     
  20. javafreak

    javafreak New Member

    Ðề: Thắc mắc Interface trong Java

    Thấy các bạn bàn luận sôi nổi quá, mình cũng xin phép được góp vui một tí.
    Theo mình hiểu thì mục đích chính của interface là để giúp những lớp riêng biệt, ko liên quan đến nhau có thể dùng chung một phương thức nào đó, phương thức này được khai báo trong class interface. Đây cũng chính là nền tảng của tính đa hình (polymorphism) trong Java.
    Ví dụ như bạn có 2 lớp là ô tô và máy bay, muốn sử dụng chung phương thức movement(). Bạn sẽ xây dựng một interface trong đó có phương thức movement() mà 2 lớp kia implements tới.
    PHP:
    public interface phuong_tien
    {
        
    void movement ();
    }

    public class 
    car implements phuong_tien
    {
        
    void movement () {
        }
    }

    public class 
    plane implements phuong_tien
    {
        
    void movement () { // your code goes here ...
        
    }
    }

    public static 
    void main (String[] args)
    {
        
    phuong_tien pt[] = new phuong_tien [2];
        
    pt [0] = new car ();
        
    pt [1] = new plane ();
        
    pt [0].movement ();
        
    pt [1].movement ();
    }
    Từ đối tượng của lớp cha gửi cùng một thông điệp tới các đối tượng của lớp con (ở đây là phương thưc movement ()), các đối tượng con biết cách thực hiện thông điệp này theo cách riêng của chúng => tính đa hình trong Java.
     
    huymq likes this.

Chia sẻ trang này

Loading...