今天在测试对象在向上转型和向下转型时遇到的个问题,不解,望高手提点。class NBA {
protected double x = 10, y = 12.56;
        //当把上句改成protected static double x = 10, y = 12.56;时运行结果为红色部分
public void speak() {
System.out.println("我喜欢NBA");
} public void cry() {
y = x + y;
System.out.printf("y=%.2f\n", y);
}
}class ChildNBA extends NBA {
int y = 100, z; public void speak() {
z = 2 * y;
System.out.println("I love This Game");
System.out.printf("y=%d,z=%d", y, z);
System.out.println();
}
}public class Assignment {
public static void main(String args[]) {
ChildNBA b = new ChildNBA();
//向上转型,会丢失继承的方法
NBA nba1 = new ChildNBA();
                NBA nba2 = new NBA();
b.cry();
b.speak();
nba1.cry();
nba1.speak();
//向下转型,会不安全
                  //下面两句不能执行,为什么?是因为向下转型的原因吗?那要怎么改,使得向下转型可以执行呢?
//((ChildNBA)nba2).cry();
//((ChildNBA)nba2).speak();
}
}
另外一个问题:
(不加static)运行结果如下:
y=22.56
I love This Game
y=100,z=200
y=22.56   //y=22.56在次出现
I love This Game 
y=100,z=200(加上static运行结果如下:
y=22.56
I love This Game
y=100,z=200
y=32.56  //y=32.56发生了改变
I love This Game
y=100,z=200
如果单独用b调用cry()方法时,开始出现y=22.56,多次调用cry()方法,则会依次加10。再用nba调用的时候开始又出现y=22.56,多次调用的时候又依次加10,跟b一样的情况。
结论:如果该变量用了static后,是不是该类所有的对象共享该变量,当某个对象对其进行修改后,其他对象中的值也随之发生变化?

解决方案 »

  1.   

    代码部分红色没标记出来,再发一遍。class NBA {
        protected double x = 10, y = 12.56;
        当把上句改成protected static double x = 10, y = 12.56;时运行结果为红色部分
        public void speak() {
            System.out.println("我喜欢NBA");
        }    public void cry() {
            y = x + y;
            System.out.printf("y=%.2f\n", y);
        }
    }class ChildNBA extends NBA {
        int y = 100, z;    public void speak() {
            z = 2 * y;
            System.out.println("I love This Game");
            System.out.printf("y=%d,z=%d", y, z);
            System.out.println();
        }
    }public class Assignment {
        public static void main(String args[]) {
            ChildNBA b = new ChildNBA();
            //向上转型,会丢失继承的方法
            NBA nba1 = new ChildNBA();
                    NBA nba2 = new NBA();
            b.cry();
            b.speak();
            nba1.cry();
            nba1.speak();
            //向下转型,会不安全
             下面两句不能执行,为什么?是因为向下转型的原因吗?那要怎么改,使得向下转型可以执行呢?
            //((ChildNBA)nba2).cry();
            //((ChildNBA)nba2).speak();
        }
    }
      

  2.   

    父类对象是不能强行转化再赋值给子类引用的。
    向下转有一个前提条件,就是对象本身必须是子类的对象。也就说你子类对象经过了向上转型之后赋值给了父类的引用,然后再强行转回来才是合法的。
    但你的代码里面,NBA nba2 = new NBA();这个nba2已经是一个父类的对象了,不可能再转化为子类,否则就乱套了。
      

  3.   

    同意,还有对楼主最后一句话解释!结论:如果该变量用了static后,是不是该类所有的对象共享该变量,当某个对象对其进行修改后,其他对象中的值也随之发生变化?static变量,是属于类信息,假如A和B都是这个类的对象,所以他们俩都有这个类的信息,就是static变量!
    换句话说,static变量是类加载的时候存在JVM的方法区,而对象存在堆里,JVM里一个类只加载一次,所以这个static变量也自然而然的一个了!