Java 私有访问修饰符在一个程序中导致错误,但在另一个程序中不导致错误?

Java 私有访问修饰符在一个程序中导致错误,但在另一个程序中不导致错误?,java,access-modifiers,Java,Access Modifiers,这是我的a.java文件,它编译: class a{ static int k=2; private static void main(String arg[]){ System.out.println(k); } } main函数是从外部调用的(私有成员只能在本地访问) 下面的代码给了我一个编译错误: class A{ private int data=40; private void msg(){System.out.

这是我的a.java文件,它编译:

class a{
    static int k=2;    
    private static void main(String arg[]){
        System.out.println(k);
    }
}
main
函数是从外部调用的(私有成员只能在本地访问)

下面的代码给了我一个编译错误:

class A{  
    private int data=40;  
    private void msg(){System.out.println("Hello java");}  
}  

public class Simple{  
     public static void main(String args[]){  
         A obj=new A();  
         System.out.println(obj.data);//Compile Time Error  
         obj.msg();//Compile Time Error  
     }  
}  

如果访问修饰符是在编译时确定的,那么为什么代码1不能给我一个编译时错误?

示例1中的代码是正确的,因为此代码中的方法不是从外部调用的。在示例2中,您实际上是从外部调用私有方法
msg
,这是不允许的。访问
数据
也是一样的,它也是私有的


我想知道示例1是否会运行,但我对此表示怀疑。

将编译第一个代码段,因为没有尝试调用私有方法。虽然使
main
方法
private
不会阻止编译代码,但它不会运行,因为


第二个代码段显式尝试访问另一个类的
private
成员,触发编译时错误。

这是因为您在类
a
中将变量
数据和方法
msg
声明为私有。这些只能在类
a
中访问。您无法访问类
简单
要访问
A类
的变量
数据
和方法
msg
,您需要将其声明为
公共
默认


另外,第一类
a
编译是因为您没有访问任何类的任何私有变量或方法。

您的问题不清楚-您没有提供足够的代码,在第一个示例中,这些代码不起作用,我们无法了解问题所在。您还没有指定第二种情况下的编译错误是什么。请阅读您得到的编译错误是什么?亲爱的@virendra,编译的第一个类是因为jvm从未调用私有成员,但在第二个类中,您调用的是私有成员。我不同意这个问题不清楚。我认为应该重新开放。