2014-04-02 15 views
5

Tôi có đoạn code sau trong Javachênh lệch thành viên được bảo vệ trong Java và C#

public class First { 
    protected int z; 

    First() 
    { 
     System.out.append("First const"); 
    } 

} 

class Second extends First { 

    private int b; 
    protected int a; 

} 

class Test { 
    /** 
    * @param args the command line arguments 
    */ 
    int a=0; 

    public static void main(String[] args) { 
     // TODO code application logic here 
     First t=new Second(); 
     t.z=10; work fine 
     First x=new First(); 
     x.z=1; // works fine 
    } 
} 

vì vậy tôi có thể truy cập z bằng cách tạo ra đối tượng của base lớp

C#

class A 
{ 
    protected int x = 123; 
} 

class B : A 
{ 
    static void Main() 
    { 
     A a = new A(); 
     B b = new B(); 

     // Error CS1540, because x can only be accessed by 
     // classes derived from A. 
     // a.x = 10; 

     // OK, because this class derives from A. 
     b.x = 10; 
    } 
} 

Vì vậy, tôi không thể truy cập a, nếu thông qua đối tượng lớp cơ sở. Tôi đã tìm thấy Java và C# tương tự từ quan điểm của OOP, có bất kỳ sự khác biệt nào giữa hai ngôn ngữ cho protected thành viên không?

with reference to this doc

+1

'được bảo vệ' trong Java tương đương với 'nội bộ được bảo vệ' trong C# - tức là, có thể truy cập bởi lớp xác định, lớp dẫn xuất hoặc lớp trong cùng một gói/assembly. –

Trả lời

1

Sự khác biệt là trong java thành viên bảo vệ có thể được truy cập từ cùng một gói. Trong C++ không có sự tương đương với mức hiển thị mức gói trong java.

+0

@tibtof chỉ muốn xác nhận rằng bảo vệ có hành vi khác nhau trong c3 và java –

+0

trong C# nó hoạt động như thế này: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and- structs/access-modifiers – Adam

+0

Giải thích chi tiết: https://www.codeproject.com/Articles/1078878/Differences-in-Java-and-Csharp-protected – user1068352

1

Tôi đồng ý với câu trả lời của tibtof. Nhận xét duy nhất mà tôi có là ví dụ Java của bạn không giống như ví dụ C#.

Bạn có thể tạo hai mã tương tự bằng cách đặt phương thức "public static void main ..." của lớp Test của bạn trong lớp thứ hai, xóa lớp Test và công khai lần thứ hai.

Kết quả giống như kết quả của bạn: kết quả hoạt động trong Java chứ không phải trong C#.

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