2012-02-08 72 views
11

Giả sử tôi có hai Lớp, A và B. Lớp A được định nghĩa là trừu tượng, trong khi B mở rộng lớp trừu tượng này và cuối cùng tôi kiểm tra kết quả và cả hai lớp là một phần của cùng một gói .Hiểu mục đích của các lớp trừu tượng trong Java

public abstract class A { 

    protected abstract void method1(); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1() { 
     System.out.println("This is B's implementaiton of A's method"); 
    } 
} 

và bây giờ khi tôi kiểm tra chúng:

B b = new B(); 
b.method1(); 
b.method2(); 

tôi nhận được sản lượng dự kiến:

This is B's implementaiton of A's method 
This is Class A's method 

CÂU HỎI:

  • mục đích @Override k là gì từ ngữ, bởi vì nếu tôi bỏ qua nó, nó vẫn hoạt động giống nhau.
  • Nếu tôi không triển khai phương pháp trừu tượng, tôi gặp lỗi biên dịch. Vậy sự khác biệt giữa việc triển khai giao diện là gì?
  • Ngoài ra, tôi cũng có thể triển khai method2() trong B. Sau đó, đầu ra thay đổi cho những gì được sử dụng trong B. Không phải điều này cũng ghi đè phương pháp lớp cha mẹ? Sau đó, mục đích của việc xác định rõ ràng một phương thức là trừu tượng trong Lớp A là gì?
+2

đôi khi nhanh hơn để yêu cầu hoặc trả lời tại đây: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino

+5

google bị chặn trong trường học của chúng tôi – 911TurboS

+6

Internet của bạn tồn tại mà không cần Google? – jondavidjohn

Trả lời

13

@ Override

@ Override đã được giới thiệu trong Java 5 (và mở rộng một chút trong Java 6). Nó chỉ mang tính thông tin. Nó nói rằng "Tôi giả sử để ghi đè một cái gì đó đã tồn tại trong lớp cha hoặc giao diện.

IDE giống như Eclipse có thể cảnh báo bạn trong trường hợp không có phương thức cha mẹ như vậy (ví dụ: nếu bạn nhầm tên). phương pháp này sẽ không được áp dụng (vì mispelling).

Nhưng đừng lo lắng quá nhiều về nó.

lớp abstract vs giao diện

một lớp trừu tượng cho phép bạn xác định một chức năng cơ bản để lại Giao diện không cho phép bạn o thực hiện bất cứ điều gì. Bạn có thể lập trình mọi thứ ngoại trừ phần thực sự thay đổi trong mỗi trường hợp. Vì vậy, khi bạn cần nó, bạn kế thừa và thực hiện phần còn thiếu.

Ghi đè hai phương pháp

Yes. Trong Java, bạn có thể ghi đè lên tất cả các phương thức không khai báo là cuối cùng trong lớp cha. Được rồi. Nếu bạn muốn làm cho nó không thể sửa đổi, bạn có thể khai báo nó cuối cùng. By Ví dụ, nếu bạn muốn khai báo một trật tự bạn có thể:

public abstract class Ordering<X> 
{ 
abstract boolean isLower(X a, X b); 
abstract boolean isEquals(X a, X b); 
    final boolean isGreater(X a, X b) { 
     return !isLower(a, b) && !isEquals(a, b); 
    } 
} 

Tất nhiên nó có thể có ý nghĩa để ghi đè isGreater để thực hiện nó một cách hiệu quả hơn (tưởng tượng nó là tốn kém để so sánh). Nhưng có những tình huống khi bạn muốn cung cấp chức năng cơ bản đã được triển khai (và sau đó là khi lớp trừu tượng tốt hơn giao diện) hoặc khi bạn muốn bắt buộc thực hiện một số (khi từ khóa cuối cùng hiển thị hữu ích).

+1

cảm ơn đã dành thời gian để giải thích tuyệt vời ý tưởng – 911TurboS

+2

Cảm ơn rất nhiều! Dù sao bạn sẽ quen với việc trừu tượng/giao diện và hơn thế nữa bằng cách xem các ví dụ. Spring framework là một ví dụ điển hình. Và trên thực tế, nếu bạn biết về các mẫu thiết kế: các lớp trừu tượng liên quan rất gần với phương thức mẫu trong khi các giao diện liên quan đến (trong rất nhiều thứ khác) mẫu chiến lược. Mẫu được mở rộng bằng cách thừa kế trong khi chiến lược được mở rộng theo thành phần. Một lần nữa: Khung công tác Spring với tất cả các khuôn mẫu và các thành phần của nó là một ví dụ rất tốt. Bạn sẽ tìm ra với thời gian. – helios

4

lớp trừu tượng cho phép bạn lưu trữ triển khai cấp cơ sở (thừa kế), đồng thời cũng tạo ra một hợp đồng đảm bảo các lớp kế thừa sẽ thực hiện chức năng cụ thể (giao diện) của riêng mình ...

Trong khi đó sẽ không bao giờ một thể hiện của một lớp trừu tượng, bạn có thể lưu trữ chức năng chia sẻ giữa những người thừa kế ...

tôi luôn nghĩ về chúng như giao diện cho phép triển khai mức độ cơ bản của phương pháp nhất định ...

+1

+1 cho các lớp trừu tượng là "các giao diện với việc thực hiện mức cơ sở của một số phương thức" – helios

+1

câu trả lời của bạn là điều khiến tôi hiểu rõ sự khác biệt. – 911TurboS

17
  1. @Override không phải là từ khóa, đó là chú thích tùy chọn giúp trình biên dịch kiểm tra xem bạn thực sự có ghi đè phương thức hay không. Nếu bạn nói @Override nhưng không có phương pháp để ghi đè lên, trình biên dịch sẽ cho bạn biết rằng bạn có thể đã thực hiện một lỗi đánh máy. Đổi tên method1 thành method12 để xem hiệu ứng.
  2. Giao diện không thể có bất kỳ triển khai nào, trong khi lớp trừu tượng có thể tùy chọn cung cấp các triển khai cho một số phương pháp của nó. Ngoài ra, các giao diện không thể có các thành viên dữ liệu.
  3. Xác định phương thức là phương tiện trừu tượng mà lớp dẫn xuất phải cung cấp triển khai. Không khai báo nó trừu tượng nói rằng các lớp dẫn xuất chỉ đơn giản là có thể cung cấp việc triển khai của riêng chúng, nhưng chúng không cần.
+0

cảm ơn câu trả lời của bạn – 911TurboS

+0

@ 911TurboS Bạn nên đánh dấu câu trả lời là đã trả lời nếu nó đúng (nút bên dưới biểu tượng mũi tên xuống). – Rohan

+0

có nhưng nó không cho phép tôi, nó nói chờ 2 phút – 911TurboS

0

Cách sử dụng thực tế được đưa vào ảnh khi bạn triển khai nhiều lớp và phương thức1 được gọi từ phương thức 2. Trong trường hợp này, sau khi thực hiện phương thức 2, phương thức1 trong lớp tương ứng sẽ được thực thi.

public abstract class A { 

    protected abstract void method1(int val); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
     //Let us I calculated something here, may be sum of two ints 
     method1(//pass above calculated int); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1(int val) { 
     System.out.println("This is B's implementaiton of A's method"); 
     //Here you may do this class specific manipulation on val. 
    } 
} 

Giống như trong lớp C, bạn có thể thao tác một số tính toán phổ biến.

2

Sự khác biệt chính giữa lớp trừu tượng và giao diện, là giao diện chỉ xác định giao diện và lớp trừu tượng cũng có thể có triển khai và trường/thuộc tính.

Lớp trừu tượng có thể được xem là mối quan hệ IS-A (ví dụ: một con ngựa là một con vật). Đối với giao diện, chủ yếu là một số tính năng mà một lớp có thể có (ví dụ: Không thể truy cập, Không thể thực hiện được).

Cũng không thể khởi tạo các phương thức trừu tượng (không giao diện).

Chức năng ghi đè để cho thấy rằng một hàm có triển khai lớp cơ sở.

Ngoài ra nhiều thừa kế không thể thực hiện/được khuyến khích với các lớp, do đó, tối đa. chỉ sử dụng một lớp cơ sở và kế thừa từ các giao diện cho các tính năng khác.

+0

cảm ơn điều này rất hữu ích. – 911TurboS

1

Mục đích của từ khóa @Override là gì, vì nếu tôi bỏ qua, nó vẫn hoạt động như cũ.

Tính rõ ràng.

Nếu tôi không triển khai phương pháp trừu tượng, tôi sẽ gặp phải lỗi biên dịch. Vì vậy, sự khác biệt của để triển khai giao diện là gì?

Giao diện không cho phép bạn bao gồm mã.

Ngoài ra, tôi cũng có thể triển khai phương thức 2() trong B. Sau đó, đầu ra thay đổi cho những gì được sử dụng trong B. Không phải điều này cũng ghi đè lên lớp cha mẹ phương pháp. Sau đó, mục đích của việc xác định rõ ràng phương thức trừu tượng trong lớp A là gì?

Có nó đang ghi đè phương thức gốc. Bạn thường định nghĩa một phương thức trừu tượng để rời khỏi việc thực hiện cho đứa trẻ (mà PHẢI thực hiện nó hoặc là trừu tượng). Nếu nó không trừu tượng, bạn phải thực hiện nó.

+0

hoàn hảo cho câu trả lời cho những gì tôi đã hỏi :) – 911TurboS

+1

Giao diện cho phép bạn bao gồm 'mã', chúng là một tuyên bố về cách khách hàng có thể tương tác (giao diện) với các đối tượng triển khai giao diện đó. Chúng có thể được sử dụng làm kiểu tham chiếu mà thực tập quảng bá đa hình bằng cách đóng gói cho khách hàng từ bất kỳ triển khai trừu tượng hoặc cụ thể nào. Các biến có thể được khai báo trong các giao diện tuy nhiên theo mặc định (và định nghĩa) là tĩnh vì sẽ không bao giờ có một thể hiện của giao diện. Bạn sử dụng các phương thức trừu tượng để thực thi các triển khai cụ thể hoặc là không xác định hoặc có thể thay đổi giữa các triển khai con –

+0

Bạn nói đúng. Tôi chỉ đang cố gắng tiếp tục;) – m0skit0

1

What is the purpose of @Override keyword

Sau này là phần bổ sung Java, để tự kiểm soát yếu. Đó là chú thích, tức là lớp thư viện chứ không phải từ khóa.

So what is the difference to implementing an interface?

Ít. Iterface là một lớp mà tất cả các phương thức đều trừu tượng. Ngoài ra, chỉ có một lớp cha được phép, trong khi nó có thể là nhiều giao diện. Ngoài ra, bạn có thể đưa các thành viên vào lớp, nhưng không đưa vào giao diện.

Then what is the purpose of explicitly Defining a method abstract in Class A?

Bạn chỉ nên khai báo tóm tắt nếu không có nội dung. Nó là cần thiết cho JVM để biết rằng tất cả các hậu duệ sẽ có nó.

+0

cảm ơn câu trả lời của bạn – 911TurboS

Các vấn đề liên quan