Thắc mắc Interface trong Java

van.duc0409

Member
12/9/11
39
0
6
Ðề: 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
Thank bạn này. Bạn nói khá dễ hiểu. Mình cũng mới tập tọe vào java nên giải thích đơn giản như thế này mới hiểu đc;;);;)
 

piavgh

New Member
5/1/13
1
0
1
28
Ðề: 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();
((tiere) tiere[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ỉ??
Ðề: 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.
Mình cũng mới bắt đầu tự tìm hiểu về Java (trước mới học C), đọc sách cũng có y hệt cái ví dụ của chủ thớt và cũng thắc mắc y hệt chủ thớt luôn, search google thì ra link này
Đọc ví dụ của bạn nongdan thì cũng ngờ ngợ (vì lý thuyết đã học tính đa hình của Java ở phần trước) rồi sau khi đọc post của javafreak thì mình đã hiểu ra Interface là ứng dụng của tính đa hình trong Java. Cùng một tên phương thức nhưng có thể sử dụng cho các đối tượng của rất nhiều Class khác nhau

Cảm ơn 2 bạn nhé, nếu mình hiểu còn sai hoặc thiếu sót điều gì mong 2 bạn chỉ giáo thêm :)
 

qchien14

New Member
13/10/11
1
0
1
Bài viết của 2 bạn nongdan và javafreak đã giúp mình rất nhiều.
Nhân tiện cho mình hỏi luôn một vấn đề
1. Interface có thể đưa vào các thuộc tính không
2. Nếu có thì như trong đa kế thừa thì lớp con sẽ nhận được tất cả các thuộc tính của lớp cha nếu bây giờ mình cần implements nhiều Interface có thể có các thuộc tính của các Interface đó không
 

nong_dan

Active Member
21/4/11
326
95
28
Bài viết của 2 bạn nongdan và javafreak đã giúp mình rất nhiều.
Nhân tiện cho mình hỏi luôn một vấn đề
1. Interface có thể đưa vào các thuộc tính không
2. Nếu có thì như trong đa kế thừa thì lớp con sẽ nhận được tất cả các thuộc tính của lớp cha nếu bây giờ mình cần implements nhiều Interface có thể có các thuộc tính của các Interface đó không
Mình thích các đào sâu suy nghĩ của bạn nhưng trước khi mình trả lời mình muốn nhắc bạn một chú. Bạn luôn có hai người "bạn" lớn :
+ google: mọi thứ thuộc về cơ bản thì bạn nên hỏi bạn ý trước khi đặt câu hỏi.
+ bộ compiler: theo kinh nghiệm của các tiền bối trong giới lập trình thì muốn giỏi phải đào sâu suy nghĩ tự đặt các câu hỏi liên quan tới src (cái này bạn đã có ) và luôn thay đổi SRC tối ưu và chạy thử nó(cái này bạn chưa có ^^). Tại sao bạn ko thử viết luôn 1 Interface cho nó một thuộc tính, chạy nó xem nó làm gì??

Còn đây là câu trả lời của bạn:
1) Interface cũng CÓ thuộc tính nhưng tất cả các thuộc tính tự động có dạng final static.
2) nó sẽ nhận hết, tức nhiên rồi why not ^^.
 

ledaitudk

New Member
9/1/16
6
0
0
26
letucoder.com
Cãi nhau làm gì làm bài này đi rồi hiểu....
Lưu ý: Không được sửa code PaintApp Có thể tưởng tượng code PainApp các Bạn code, còn những vấn để khác do một hay nhiều khác code... miễn sao ngta có thể xuất ra theo ý.
5. Khai bao lop PaintApp voi hanh vi drawLine cho phep lap trinh vien moi xuat ra thong tin bat ky mau muc dang duoc ve ma khong thay doi code lop PaintApp
vi du : PainApp app = new PainApp();
app.drawLine() -> xuat ra chuoi ma lap trinh vien X muon xuat tren man hinh
note: lap trinh vien X ko phai la nguoi tao ra lop PainApp
 

Dapruoi

New Member
5/6/16
18
1
3
28
đọc qua mấy thread trên về mình thấy ý nghĩa của interface nó chỉ mang tính trừu tượng và khái quát hóa vấn đề , không cần quan tâm đến chi tiết vấn đề đó sẽ được giải quyết như thế nào mà chỉ quan tâm đến việc sẽ có những vấn đề gì phải ko ạ , vậy thì chắc là nó sẽ được dùng nhiều trong quá quá trình phân tích và thiết kế đối tượng để phác thảo ra 1 bản thiết kế tổng quát
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
Interface has 2 meanings or functions in JAVA
1) it's used to define a bridge to another object (or class)
2) it's the backdoor to circumvent the Single Inheritance.
Example:
1) All Listeners are interfaces: Actionistener, ItemListener, etc. These listeners are the bridges to different objects or classes which have some predefined methods to be implemented according to specific needs.
2) JAVA object is by definition an extension of object Object. And it's the paradigm of Single Inheritance. Therefore JAVA objects (other than Object) can be only derided only by ONE other object. If a JAVA object needs to be "extended" more than one objects it must go "interface" in order to circumvent the restriction of Single Inheritance. Example
PHP:
public class MyFrame extends JFrame implements ActionListener, KeyListener, ItemListener {
   ...
}
As you see MyFrame is a child of JFrame BUT it sneaks out the backdoor and goes into liaison with 3 other objects ActionListener, KeyListener, ItemListener...which are bound to some EventObject. E.g. ActionEvent, ItemEvent, KeyEvent...
GOT IT?
 

Đông Vũ

New Member
26/3/18
7
2
3
24
Ðề: 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.
Nếu bạn viết trong lớp con thì có thể bạn sẽ Viết lại rất nhiều lần.
VD: có lớp animal là cha của lớp Cat & Dog. trong lớp animal có phương thức sayHello(). lớp Cat kế thừa phương thức sayHello() và in ra "mèo kêu meo meo". Chó kế thừa và in ra "chó sủa gâu gâu". Tất cả chỉ việc override chứ ko ai rãnh ngồi viết tay từng lớp đâu :D
 

D.A.N_3002

Active Member
14/11/17
177
49
28
17
Nếu bạn viết trong lớp con thì có thể bạn sẽ Viết lại rất nhiều lần.
VD: có lớp animal là cha của lớp Cat & Dog. trong lớp animal có phương thức sayHello(). lớp Cat kế thừa phương thức sayHello() và in ra "mèo kêu meo meo". Chó kế thừa và in ra "chó sủa gâu gâu". Tất cả chỉ việc override chứ ko ai rãnh ngồi viết tay từng lớp đâu :D
Cái này lâu rồi mà, đào lên làm j nx @@
 

tranthom

New Member
11/11/19
1
0
1
26
Không biết các anh chị thảo luận từ 2011 đến giờ chắc pro java hết rồi!!! Em cũng k hiểu rõ về interface lắm nên cũng lên đây đọc mn thảo luận
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
@tranthom
I don't know what the people "discussed" about interface (because I didn't read the comments :D ) but I explain it to you.

First: Inheritance.
JAVA is designed with SINGLE INHERITANCE which is different to C++. The reason is to avoid ambiguous "inheritances" of different "forefathers". Example: C has 2 fathers A and B. Both fathers have the method get(). The ambiguity is then what get() should C inherit? A.get() or B.get(). And that is the source of undetectable bugs.

Second: Lối thoát
In some cases that a Java object is a son of another java object (i.e. extends) and needs to have some features of other objects then the only way to do that is to use an Interface to open a GATEWAY to these objects. Example:
Java:
public class MyJFrame extends JFrame implements ActionListener {
    public MyJFrame(...) {
       ...
    }
    ...
    // NOW the  Lối thoát to object ActionListener
    public void actionPerformed(ActionEvent e) {
         System.out.println("Action is heard....");
    }
    ...
}
As you see, the father of MyJFrame is JFrame and MyJFrame has a GATEWAY to Object ActionListener. This gateway is the method actionPerformed(). And you have to tell object ActionListener what "action" it should do with your OWN IMPLEMENTATION (hence: the word implements). In the example the implemented action is to print a string "Action is heard...."

Hope you got it...
 
Sửa lần cuối: