public class SuperClass {
public void method(){
System.out.println("SuperClass.method()");
}
    public void method(SuperClass superObj,SuperClass subObj){
     System.out.println("SuperClass.method(SuperClass,SuperClass)");
    }
}
public class SubClass extends SuperClass{
public void method(){
System.out.println("SubClass.method()");
}
public void method(SuperClass superObj,SubClass subObj){
     System.out.println("SubClass.method(SuperClass,SubClass)");
    }
public void method(SubClass superObj,SuperClass subObj){
     System.out.println("SubClass.method(SubClass,SuperClass)");
    }
public void method(SubClass superObj,SubClass subObj){
     System.out.println("SubClass.method(SubClass,SubClass)");
    }
}
public class OverloadDemo {
public static void main(String[] args) {
SuperClass superObj=new SuperClass();
SubClass subObj=new SubClass();
        SuperClass superReferToSub=subObj;
        System.out.println();
        
        subObj.method(superObj, superObj);
        subObj.method(subObj, subObj);
        subObj.method(superReferToSub, superReferToSub);
        System.out.println();         superReferToSub.method();
        superReferToSub.method(superObj, superObj);
        superReferToSub.method(subObj, subObj);
        superReferToSub.method(superReferToSub, superReferToSub);
}
}
执行结果是:
SuperClass.method(SuperClass,SuperClass)
SubClass.method(SubClass,SubClass)
SuperClass.method(SuperClass,SuperClass)//1SubClass.method()//2
SuperClass.method(SuperClass,SuperClass)
SuperClass.method(SuperClass,SuperClass)
SuperClass.method(SuperClass,SuperClass)
     

1.既然subObj.method(superReferToSub, superReferToSub)没有调用SubClass.method(SubClass,SubClass),也就是说明SuperClass superReferToSub=subObj;的superReferToSub还是超类,但是为什么下面的2.既然superReferToSub是超类,那么应该调用超类的method函数 SuperClass superRef=superObj;
 superRef=subObj;superRef还是SuperClass 类? 我都快崩溃了,谁知道啊~~

解决方案 »

  1.   

    多态 ,SubClass subObj=new SubClass();
            SuperClass superReferToSub=subObj 方法是子类中SubClass中的,属性是SuperClass中的,调用的方法是实例化的类中的,属性是申明类中的
      

  2.   

    public class SuperClass {
     public void fritsMethod(){
         secondMethod();  
        }
        public void secondMethod(){
         System.out.print("SuperClass.secondMethod()");
        }
    }
    public class SubClass extends SuperClass{
    public void secongMethod(){
    System.out.print("SubClass.secondMethod()");
    }
    }
    public class bing { public static void main(String[] args) {
    SubClass subObj=new SubClass();
    SuperClass superRef=subObj;
    superRef.fritsMethod();
    }
    }
    但是我上面的输出结果是SuperClass.secondMethod(),如果她的调用的方法是实例化的类中的,那么就没有fritsMethod()方法。
      

  3.   

    SuperClass superReferToSub=subObj;
      新建了一个 SuperClass  的对象 superReferToSub  然后指向了对 subObj的引用,
    所以说,调用的时候,应该是SuperClass  的对象属性
      

  4.   

    如果superRef方法是子类中SubClass和SuperClass共同的,那么superReferToSub.method(subObj, subObj);应调用SubClass.method(SubClass,SubClass),superRef到底属于谁?是什么类?
      

  5.   

    我觉得严重矛盾:说superRef调用的超类方法,superRef=subObj;
           superRef.method();却调用的是子类的方法输出为SubClass.method(),
    superRef调用的子类方法:SuperClass superRef=subObj;
    superRef.fritsMethod();却调用的是超类的方法输出为SuperClass .fritsMethod(),他到底调用什么?
      

  6.   

    如果优先调用子类方法,那么superReferToSub.method(subObj, subObj);应调用SubClass.method(SubClass,SubClass)但是他又调用父类方法?郁闷坏了,到底它凭借什么来调用的?谁知道?
      

  7.   

    不要抑闷,语言是不会有问题的.
    你子类里的方法除了第一个方法method(){}覆盖了父类的方法外,其它都只是重写了父类的方法,
    相当于在父类的基础上添加了三个新的方法,跟父类method(SuperCalss s, SuperClass s)是平起平座的,superRef=subObj;superRef是SubClass类了,不过因为父类的方法没有被覆盖,那么这种现象肯定是正常的了
      

  8.   

    就是一个父类引用指向子类对象的问题.
    父类的对象调用父类的方法,但是method()方法被重写,所以调用了子类的method()方法.
    子类却可以调用父类的方法subObj.method(superObj, superObj);