今天在测试对象在向上转型和向下转型时遇到的个问题,不解,望高手提点。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后,是不是该类所有的对象共享该变量,当某个对象对其进行修改后,其他对象中的值也随之发生变化?
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后,是不是该类所有的对象共享该变量,当某个对象对其进行修改后,其他对象中的值也随之发生变化?
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();
}
}
向下转有一个前提条件,就是对象本身必须是子类的对象。也就说你子类对象经过了向上转型之后赋值给了父类的引用,然后再强行转回来才是合法的。
但你的代码里面,NBA nba2 = new NBA();这个nba2已经是一个父类的对象了,不可能再转化为子类,否则就乱套了。
换句话说,static变量是类加载的时候存在JVM的方法区,而对象存在堆里,JVM里一个类只加载一次,所以这个static变量也自然而然的一个了!