两个有关问题

请教大家两个问题
问题一:
public class Api{
public int i= 20;
public void test(){

}
public static void main(String[] agrs){
System.out.println(new Sun().i);
}
}
class Sun extends Api{
private int i = 10;

}有谁帮我解释一下
出错的提示如下:
D:\java\pingshi\pingshi>javac Api.java
Api.java:7: i 可以在 Sun 中访问 private
  System.out.println(new Sun().i);
  ^
1 错误
这是为什么呢?


问题二:

public final class Api{
private static class String{};
public static void main(String[] agrs){
}
}
当在private static class String{};
中加上;出现错误的结果是
D:\java\pingshi\pingshi>java Api
Exception in thread "main" java.lang.NoSuchMethodError: main

而不加private static class String{}
出现错误的结果是:

D:\java\pingshi\pingshi>java Api
Exception in thread "main" java.lang.NoClassDefFoundError: Api
Caused by: java.lang.ClassNotFoundException: Api
  at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
在此请教高手帮忙介绍一下为什么?
谁的答案好我会 给高分的

------解决方案--------------------
#2楼 得分:0回复于:2011-10-12 14:32:58第一个太基础了!!!

1.不能在类外面方位private变量,继承的也不行,继承的只能访问public和protected

2.加上不能执行通过是因为String是已经定义过了的类,如果这个内部类是其他名字的话是可以通过的,不信你试试。并且去掉是可以执行通过的,你的不能通过不知道是不是你的版本问题,我的机器上是1.6,可以执行。 

------解决方案--------------------
i是私有成员,不能从外面访问
不能用String作为类名 如果楼主一定主函数中就写成java。lang。String[] args