第一个问题 :
测试类程序: class ParentClass {  
    private String privateField = "父类变量--private";  
  
    /* friendly */String friendlyField = "父类变量--friendly";  
  
    protected String protectedField = "父类变量--protected";  
  
    public String publicField = "父类变量--public";  
  
    // private的变量无法直接访问,因此我们给他增加了一个访问方法  
    public String getPrivateFieldValue() {  
        return privateField;  
    }  
}  
  
public class subclass extends ParentClass {  
    private String privateField = "子类变量--private";  
  
    /* friendly */String friendlyField = "子类变量--friendly";  
  
    protected String protectedField = "子类变量--protected";  
  
    public String publicField = "子类变量--public";  
 
    public String getPrivateFieldValue() {  
        return privateField;  
    }  
  
    public static void main(String[] args) {    
        ParentClass parentClass = new ParentClass();  
        System.out.println("ParentClass parentClass = new ParentClass();");  
        System.out.println(parentClass.getPrivateFieldValue());  
        System.out.println(parentClass.friendlyField);  
        System.out.println(parentClass.protectedField);  
        System.out.println(parentClass.publicField);  
  
        System.out.println();  
  
        // ParentClass类型,SubClass对象  
        ParentClass subClass = new subclass();  
        System.out.println("ParentClass subClass = new SubClass();");  
        System.out.println(subClass.getPrivateFieldValue());  
        System.out.println(subClass.friendlyField);  
        System.out.println(subClass.protectedField);  //这三个居然调用的是父类的变量,不是很理解                                                 
        System.out.println(subClass.publicField);     // ParentClass类型,SubClass对象
                                                      //莫非等价于将一个SubClass对象强制转化为ParentClass 类型
        System.out.println();  
  
        // SubClass类型,SubClass对象  
        subclass subClazz = new subclass();  
        System.out.println("SubClass subClazz = new SubClass();");  
        System.out.println(subClazz.getPrivateFieldValue());  
        System.out.println(subClazz.friendlyField);  
        System.out.println(subClazz.protectedField);  
        System.out.println(subClazz.publicField);  
    }  
}   还是老问题 superclass :class A
           subclass  : class B extends A
  A a= A();
  A aa=B();
  B aaa=B();  我原先以为 A aa=B() 完全等价于 B aaa=B(); 原来他们之间也有差异???
 从上面的测试程序看的确有差异。  请说一下他们的差异?第二问题:
测试类程序:class ParentClass_ {   
    public static String staticField = "父类静态变量";   
  
    public final String finalField = "父类常量";   
  
    public static final String staticFinalField = "父类静态常量";   
}   
  
public class SubClass_ extends ParentClass_ {

    public static String staticField = "子类静态变量";   
  
    public final String finalField = "子类常量";   
  
    public static final String staticFinalField = "子类静态常量";   
  
    public static void main(String[] args) {   
        ParentClass_ subClass = new SubClass_();   
        System.out.println(SubClass_.staticField);   
        System.out.println(subClass.finalField);   
        System.out.println(SubClass_.staticFinalField);   
    }   
}  
  在这里我也存在着一个误区
  众所周知 final class 就表示 这个类不能被派生出子类
  final 加在方法前面就 不能被子类重写 
  那加在变量前面就表示是个常量  final static修饰表示变量就唯一了,不能更改了。
  今天发现在子类还能重写这样的常量,有点诧异??  难道final static修饰变量不能更改的前提只能存在于一个类中  ……请详细说下  
  
 

解决方案 »

  1.   

    第一个问题:A是动物,B是小狗,  A aa=B(); 即是说有只小狗(B的一个对象)是一个动物,那么你用aa活动的时候,你就只能使用它作为动物的属性,比如奔跑和叫。至于狗叫声是“汪汪”这种狗的专有属性,你就不能用了。(因为在你眼里你只把aa看成是一只动物,而不是一只具体的狗)第二个问题,完全是无理取闹型的故意难为人。。static型变量为类所有,出了类就没用了。也就是说,父类和子类的staticField是不同的,分属两个类。SubClass_.staticField调用它专有的staticField(因此输出子类静态变量),subClass.finalField(注意 有无下划线的区别)调用 的是
    ParentClass_的finalField,因此输出“父类常量”.另外,既然都知道是常量了,怎么存在重写这种说法?重写是针对方法的。
      

  2.   

    第一个问题:是父类的引用指向子类对象,private的子类不能继承,其他三个都从父类继承过来了;父类的引用只能调用共同的成员变量。故private的只能用子类的成员变量,其他的要用父类的。
      

  3.   

     final 和 static 作用域只是在一个类中
     final在这个类中不能再赋值,static就表示变量地址唯一了
     
     在子类中可以对父类的这些变量进行重写 
     注意变量override只有隐藏而不能覆盖