Java和c#中受保护的成员差异

Posted

技术标签:

【中文标题】Java和c#中受保护的成员差异【英文标题】:Protected member difference in Java and c# 【发布时间】:2014-05-13 13:17:09 【问题描述】:

我在 Java 中有以下代码

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
    

所以我可以通过创建base 类的对象来访问z

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;
    

所以如果通过基类对象,我无法访问a。从OOP 的角度来看,我发现Java 和C# 相似,protected 成员的两种语言之间有什么区别吗?

with reference to this doc

【问题讨论】:

Java 中的“protected”等同于 C# 中的“protected internal”——即,可由定义类、派生类或同一包/程序集中的类访问。 【参考方案1】:

我同意 tibtof 的回答。我唯一要说的是,您的 Java 示例与 C# 示例不同。

您可以通过将您的测试类的“public static void main...”方法放在第二类中,删除测试类并使第二类公开,从而使两个代码相似。

结果与您的结果相同:它适用于 Java,但不适用于 C#。

【讨论】:

【参考方案2】:

不同之处在于,在 java 中,可以从同一个包中访问受保护的成员。在 C++ 中,java 中的包级别可见性没有等价性。

【讨论】:

@tibtof 只是想确认 protected 在 c3 和 java 中具有不同的行为 在 c# 中它的工作方式如下:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 详解:codeproject.com/Articles/1078878/…

以上是关于Java和c#中受保护的成员差异的主要内容,如果未能解决你的问题,请参考以下文章

.Net中受保护的内部意味着啥[重复]

Java中受保护的访问修饰符

c#中受保护和私有保护有啥区别? [复制]

C++ - 在派生类中静态初始化基类受保护的成员变量

在java中的继承上下文中通过对象调用类成员时会发生啥

在 C# 中是不是可以使用内部和受保护的成员? [复制]