class A{
public void fun1(){
System.out.println("A类对象");
}
public void fun2(){
this.fun1();
}
}
class B extends A{
public void fun1(){
System.out.println("B类中的实例");
}
public void fun3(){
System.out.println("B类中3的实例");
}
}
class C extends A{
public void fun1(){
System.out.println("C类中的实例");
}
public void fun4(){
System.out.println("C类中的4实例");
}
}
class DTest4{
public static void main(String args[]){
fun(new A());
fun(new B());
fun(new C());
}
public static void fun(A a){
a.fun2();
if(a instanceof B){
System.out.println(a instanceof B);
 B b =(B)a;
 b.fun3();
}
if(a instanceof C){
System.out.println(a instanceof C);
C c = (C)a;
c.fun4();
}
}
}主类的代码帮我分析下  谢谢

解决方案 »

  1.   

    http://rodney.cnblogs.com/archive/2005/08/18/instanceof.html
      

  2.   

    稍微注释了一下,这样你或许就能明白了。拆分方式比较简单,一共涉及四个类:A、B、C和TestExtend ,这四个类都可以单独写成一个java文件,其中TestExtend 类是含有main函数的,程序的运行就从这里开始,class A {
    public void fun1() {
    System.out.println("A类对象");
    } public void fun2() {
    this.fun1();
    }
    }class B extends A {
    //覆盖了父类A中的方法fun1()
    public void fun1() {
    System.out.println("B类中的实例");
    } public void fun3() {
    System.out.println("B类中3的实例");
    }
    }class C extends A {
    //覆盖了父类A中的方法fun1()
    public void fun1() {
    System.out.println("C类中的实例");
    } public void fun4() {
    System.out.println("C类中的4实例");
    }
    }public class TestExtend {
    public static void main(String args[]) {
    fun(new A());
    System.out.println("*** end fun(new A())");
    fun(new B());
    System.out.println("*** end fun(new B())");
    fun(new C());
    System.out.println("*** end fun(new C())");
    } public static void fun(A a) {
    a.fun2();
    if (a instanceof B) {
    System.out.println("a instanceof B");
    B b = (B) a;
    b.fun3();
    }
    if (a instanceof C) {
    System.out.println("a instanceof C");
    C c = (C) a;
    c.fun4();
    }
    }}运行结果:
    A类对象
    *** end fun(new A())
    B类中的实例
    a instanceof B
    B类中3的实例
    *** end fun(new B())
    C类中的实例
    a instanceof C
    C类中的4实例
    *** end fun(new C())
      

  3.   

    class A {
    public void fun1() {
    System.out.println("A类对象");// 4
    } public void fun2() {
    this.fun1();// 3
    }
    }class B extends A {
    public void fun1() {
    System.out.println("B类中的实例");
    } /**
     * 此方法是存在的 public void fun2() { this.fun1();// 3 }
     */
    public void fun3() {
    System.out.println("B类中3的实例");
    }
    }class C extends A {
    public void fun1() {
    System.out.println("C类中的实例");
    } public void fun4() {
    System.out.println("C类中的4实例");
    }
    }public class DTest4 {
    public static void main(String args[]) {
    /**
     * 调用A类构造方法生成A类实例,将A类实例作为参数传入fun方法,到2 调用A类实例的fun2方法,到3
     * fun2方法中再调用当前类实例的fun1方法,this关键字代表当前类 的一个实例,进入步骤4,打印A类对象
     * 返回步骤2处继续执行,因为A既不是B的实例,也不是C的实例,该方法结束
     */
    fun(new A());// 1
    /**
     * new B()调用B类构造方法声明B类实例,B类实例作为参数传入fun方法,进入步骤2,该B类实例调用
     * fun2方法,到B类中找fun2方法,因为B继承了A类的fun2方法,因此调用当前实例的fun1方法, 
     * B类重写了A类的fun1方法,调用B类fun1方法,打印B类中的实例,返回到2处继续执行,因为该实例
     *【 new B()】是B类的实例,到6,打印a instanceof B值为true,7处将B类实例转型为B类实例,此处
     *似乎没有必要,调用B实例fun3方法,打印出B类中3的实例,结束
     */
    fun(new B());// 5
    /**
     * 此处就不写了吧,看懂了上面的,这个依此类推,ok了
     */
    fun(new C());
    } public static void fun(A a) {
    a.fun2();// 2
    if (a instanceof B) {//6
    System.out.println(a instanceof B);
    B b = (B) a;//7
    b.fun3();
    }
    if (a instanceof C) {
    System.out.println(a instanceof C);
    C c = (C) a;
    c.fun4();
    }
    }
    }
      

  4.   

    建议把Java SE中的继承和多态好好复习一下。class A{
        public void fun1(){
            System.out.println("A类对象");
        }
        public void fun2(){
            this.fun1();
        }
    }
    class B extends A{
        public void fun1(){
            System.out.println("B类中的实例");
        }
        public void fun3(){
            System.out.println("B类中3的实例");
        }
    }
    class C extends A{
        public void fun1(){
            System.out.println("C类中的实例");
        }
        public void fun4(){
            System.out.println("C类中的4实例");
        }
    }
    public class DTest4{
        public static void main(String args[]){
            fun(new A());//将A丢进fun里当然调用它自己的fun1(),下面的两个条件都不成了。这一句只是打印“A类对象”。
            fun(new B());//将B类的一个对象丢进去,多态其实执行的是B重写父类的fun1()。下面的分之一会执行。
            fun(new C());//跟上面的差不多的分析
        }
        public static void fun(A a){//多态在这里被体现了,
            a.fun2();
            if(a instanceof B){
                System.out.println(a instanceof B);
                 B b =(B)a;
                 b.fun3();
            }
            if(a instanceof C){
                System.out.println(a instanceof C);
                C c = (C)a;
                c.fun4();
            }
        }
    }