2012-02-29 23 views
5

Khi sử dụng C++ thì không được phép truy cập thuộc tính riêng bên trong một hàm chính. Ví dụ:Ý tưởng đằng sau quyền truy cập thuộc tính riêng bên trong chính là gì? Java x C++

#include <iostream> 
using namespace std; 
class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
}; 
int main (int argc, char *argv[]) { 
    Test test2(4); 
    cout << test2.a; // Compile error! Test::a is private within this context 
    cout << test2.getValue(); // OK! 
    return 0; 
} 

Rõ ràng là có lỗi khi truy cập thuộc tính riêng bên ngoài phương thức lớp, vì C++ không có chức năng chính bên trong lớp học.

Tuy nhiên, trong Java thì được phép:

public class Test { 
    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 
    public static void main (String args[]) { 
     Test test1 = new Test(4); 
     System.out.println(test1.a); 
    } 
} 

Tôi hiểu trong trường hợp này chính là INSIDE class Test. Tuy nhiên, tôi không thể hiểu được ý tưởng TẠI SAO điều này được cho phép và tác động của điều này trong việc phát triển/quản lý mã.

Khi học C++, tôi đã từng nghe "Lớp học không nên có chính. Các hành vi chính có hoặc sử dụng các phiên bản lớp".

Ai đó có thể làm sáng tỏ câu hỏi này không?

+0

'main' khá nhiều phải sống trong một lớp học trong java, vì nó sẽ là bất hợp pháp cho nó để sống bên ngoài của một lớp học. Không có phạm vi toàn cục cho các hàm trong java. – Dervall

+3

Tôi luôn luôn có điểm vào chính trong một lớp học không có gì khác ngoài chức năng chính. Nó thực sự không có ý nghĩa để có chính trong một lớp học với tôi hoặc. – L7ColWinters

+1

Bởi các câu trả lời cho đến nay tôi tin rằng đây là sự lựa chọn của các nhà phát triển ngôn ngữ: không tạo ngoại lệ cho Main(), ngay cả khi nó là một chức năng đặc biệt, cấp quyền truy cập bất kỳ phương pháp nào khác. –

Trả lời

6

Bạn đang xem xét này từ quan điểm sai trái của quan điểm.Câu hỏi không phải là lý do tại sao chính có thể truy cập nội dung lớp học. Không có một 'chính' trong Java. Sự khác biệt quan trọng đối với sự tôn trọng này là đối với C++, có một điểm vào đơn là chính, trong khi trong Java, một ứng dụng có thể có nhiều điểm vào, nhiều nhất là một điểm cho mỗi lớp. Điểm vào phải là một phương thức tĩnh (hàm thành viên trong thuật ngữ C++) của một lớp với một chữ ký cụ thể và hành vi này giống hệt với các phương thức tĩnh khác của cùng một lớp.

Lý do Java có thể có nhiều điểm vào là bạn nói với VM khi khởi động ở đâu (lớp nào) bạn muốn khởi động ứng dụng của mình. Đó là tính năng không có sẵn trong C++ (và nhiều ngôn ngữ khác)

+0

Cảm ơn. Điều đó rất thú vị, tôi đã không thực sự nhìn vào quan điểm này. –

5

Bạn thực sự có thể làm tương tự trong C++:

class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
     static void Main() 
     { 
      Test t(10); 
      cout << t.a; 
     } 
}; 

Đó là đơn giản như vậy: trong cả hai ngôn ngữ, private biến có thể truy cập chỉ từ bên trong lớp.

Tuy nhiên, tôi không thể hiểu ý tưởng TẠI SAO điều này được cho phép.

Đó chỉ là tính năng ngôn ngữ. Nếu bạn không thể truy cập các cá nhân từ bên trong lớp học, bạn có thể làm gì với họ?

Ngoài ra, không phải các cấp độ truy cập đó là toàn lớp, không phải trong toàn bộ trường hợp. Điều đó có thể ném bạn đi. Điều đó có nghĩa là bạn có thể truy cập các cá thể của cá thể khác nhau từ một cá thể của cùng một lớp. Ngoài ra, trong C++, có từ khóa friend cung cấp cho bạn các đặc quyền giống nhau.

+0

Luchain, tôi hiểu điều này, nhưng trong trường hợp này chức năng này Chính bên trong lớp không phải là một chính đúng(). Nó không biên dịch mà không có chính bên ngoài lớp. Không đúng? Nhưng trong Java nó biên dịch, chạy, và mọi thứ đều ổn. –

+0

@MoacirPontiJr. Vâng. Và? 'main()' chỉ là điểm vào trong C++, giống như 'MyClass :: main()' là trong Java. –

2

Trực giác của bạn là chính xác. Mã thứ hai là hợp lệ trong Java vì main nằm trong lớp Test. Để làm cho nó tương đương với C++ cố gắng để truy cập vào các thành viên private của một lớp khác nhau, trong đó sẽ không biên dịch:

class Test2 { 

    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 

} 

public class Test { 

    public static void main (String args[]) { 
     Test2 test2 = new Test2(4); 
     System.out.println(test2.a); // does not compile 
    } 
} 

Sự khác biệt cơ bản thực tế là một thực tế rằng trong C++ chức năng có thể tồn tại các lớp bên ngoài, trong khi ở Java bất kỳ phương thức nào cũng cần phải là một phần của một lớp.

0

Lý do này là: Java là mô hình đầy đủ Object Oriented Programming, vì vậy mọi thứ phải được xác định trong lớp hoặc đơn vị nhỏ nhất trong java là lớp học.

+0

* Lập trình hướng đối tượng đầy đủ * ... Đừng bắt đầu, thực tế là bạn bị * ép buộc * để biến mọi thứ thành một lớp không có nghĩa là * hoàn toàn * hướng đối tượng. Python là đối tượng hướng nhiều hơn Java cho những gì quan trọng ... –

+0

Tôi không so sánh Python với Java ở đây. – MJM

+1

rant của tôi là về tất cả những người tuyên bố rằng java là 100% OO bởi vì nó buộc tất cả mọi thứ được chứa trong một lớp, và đó là sai. Tôi cũng (bên không nếu bạn muốn) cung cấp một ví dụ về một ngôn ngữ có nhiều OO hơn java và có các hàm không phải là thành viên của các lớp, với ý định làm cho nó rõ ràng hơn rằng hai khái niệm không thực sự giống nhau. Lưu ý rằng bằng cách cung cấp một ví dụ nghiêm ngặt hơn về OO, có thể suy ra rằng Java không thể là 100% OO. –

1

private trong Java có thể được coi là "tệp cục bộ" c.f. gói địa phương. Ví dụ, bạn có thể truy cập các thành viên riêng của một lớp được định nghĩa trong cùng một lớp bên ngoài.

AFAIK, Giả định là bạn không cần phải tự bảo vệ mình khỏi mã trong cùng một tệp.

public interface MyApp { 
    class Runner { 
     public static void main(String... args) { 
      // access a private member of another class 
      // in the same file, but not nested. 
      SomeEnum.VALUE1.value = "Hello World"; 
      System.out.println(SomeEnum.VALUE1); 
     } 
    } 

    enum SomeEnum { 
     VALUE1("value1"), 
     VALUE2("value2"), 
     VALUE3("value3"); 
     private String value; 

     SomeEnum(final String value) { 
      this.value = value; 
     } 
     public String toString() { 
      return value; 
     } 
    } 
} 

http://vanillajava.blogspot.com/#!/2012/02/outer-class-local-access.html

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