一般的类是不可以定义为private或者protected类型的。只有当类作为另一个类的属性的时候才可以定义为private或者protected类型。如下:
class a {
static int a = 88;
static void a1(){
System.out.println("------");
}

protected class d{
void d1(){
System.out.println("*----*");
}
}

private class e{
void e1(){
System.out.println("&----&");
}
}
}friendly不是类的类型关键字吧?你提出的“作用域public,private,protected,以及不写时的区别”的研究对象应该是方法和变量的,不是类的。

解决方案 »

  1.   

    不知道aa.a=2;是哪里来的?
    System.out.println(a);是正确的,因为认为a是b的属性。
    既然a是属性了,a.a自然在编译的时候就必然要报错了,因为b的属性a类型为int,而int是没有属性a或方法a1()的。只要你把类或属性名换换,不要用一样的就OK了。
      

  2.   

    1. 你自己在上面的表后面已经写了:“不写时默认为friendly”,实际我我们通常把friendly叫做package,因为它的访问权限是同一package里可以访问。因为你的b类和a类是在同一个包(同为默认包)中,所以b可以从a继承。类是不能定义成private和protected的,它只有public和package两种。你可以试试在test包里定义一个非public的A类,然后再默认包里定义一个B类从test.A继承,编译器会告诉你找不到test.A的。2. a里面的成员变量没有写修饰符,当然就是默认的,也就是我说的package类型,你说的friendly类型。对于成员的修饰,是用于判断从类的外部有没有权限调用这个类的成员,而与继承无关。继承只管能不能访问到类就行,也就是说,只和类的修饰符有关。3. 看代码中的注释,顺便说一下:一般来说,写Java程序应该将类名中每个单词词的第一个字母大写。而成员的第一个字母小写,其它各单词的第一个字母大写。class A {
        static int a = 88;
        static void a1() {
            System.out.println("------");
        }
    }public class Test extends A {
        public static void main(String args[]) {
            System.out.println(a);
            a1();
            A.a = 99;
            A.a1();
            // a.a=99;  为什么会报错;a类的a变量是static的阿
            // a.a1();  为什么会报错;a类的a方法是static的阿
            // 这里报错是因为编译器认为.前面的那个a是静态变量a,而不是类a
            // 编译器总是从最近的范围往外查找标识的,
            // 既然已经在静态成员里找到了叫a的成员,那就不会去外面一层找叫a的类了
            // 如果你把类名a改成大写的A就不会出现这种冲突了
        }
    }