问题程序如下
class A{
double n;//隐藏的成员变量
int m;
// private int k;
void f(){
System.out.printf("子类将继承这个方法,n=%f,m=%d\n",n,m);
}
void g(){
System.out.printf("你好,n=%f\n",n,m);
}
}
class B extends A{
int n =12;
// private int k;
void g(){//重写的方法
System.out.printf("我重写的方法,n=%d,m=%d\n",n,m);
// System.out.println(k);
}
void cry(){
System.out.printf("我是子类新增的方法,n=%d,m=%d\n",n,m);
}
}
public class UpConvertExample{
public static void main(String[] args){
A a = new B();
// a.k = 99;
a.n = 0.618;
a.m = 200;
a.f();
a.g();
B b =(B)a;
b.n = 555;
b.cry();
}
}
对于对象的创建过程,我现在的理解程度为 A a = new A(); 其中a为引用类似指针,new A()则是类中的构造函数,为其成员变量分配存储空间,并在执行构造函数的时候会自动将其成员变量进行初始化(这里不知道理解有没有问题)。
但当我遇到上转型的引用时,A a = new B();
1)其创建的对象,到底分配的是哪个类里的成员变量的空间?如何分配的?
2)在 A a; a = new A(); a = new B(),A a 中A是什么含意?在这两处应用是否相同?
3)作程序时,发现上转型对象不能对父类private成员变量和方法调用,但老师说是可以的,对否?
class A{
double n;//隐藏的成员变量
int m;
// private int k;
void f(){
System.out.printf("子类将继承这个方法,n=%f,m=%d\n",n,m);
}
void g(){
System.out.printf("你好,n=%f\n",n,m);
}
}
class B extends A{
int n =12;
// private int k;
void g(){//重写的方法
System.out.printf("我重写的方法,n=%d,m=%d\n",n,m);
// System.out.println(k);
}
void cry(){
System.out.printf("我是子类新增的方法,n=%d,m=%d\n",n,m);
}
}
public class UpConvertExample{
public static void main(String[] args){
A a = new B();
// a.k = 99;
a.n = 0.618;
a.m = 200;
a.f();
a.g();
B b =(B)a;
b.n = 555;
b.cry();
}
}
对于对象的创建过程,我现在的理解程度为 A a = new A(); 其中a为引用类似指针,new A()则是类中的构造函数,为其成员变量分配存储空间,并在执行构造函数的时候会自动将其成员变量进行初始化(这里不知道理解有没有问题)。
但当我遇到上转型的引用时,A a = new B();
1)其创建的对象,到底分配的是哪个类里的成员变量的空间?如何分配的?
2)在 A a; a = new A(); a = new B(),A a 中A是什么含意?在这两处应用是否相同?
3)作程序时,发现上转型对象不能对父类private成员变量和方法调用,但老师说是可以的,对否?
解决方案 »
- Eclipse的快捷方式后面加 -clean是什么意思
- public static void main (String[] args)各单词的意思
- 请问电信类软件需要学习java什么知识
- 这个是怎么实现的?跨浏览器读取
- 如何将png格式的图片转成bmp格式的图片?
- 怎么样给applet添加数字签名?
- 为什么大家都说候捷翻译的书好,我看了《think in java》,感觉好象很晦涩
- 题外话 关于华容道游戏的小问题
- 请教一个 runtime的问题!
- Exception in thread "main" java.lang.NoClassDefFoundError: xunhuan
- 请问如何将数组的值输出到一个文件啊??
- 高分求救java加密解密xml文件,最好有源程序,谢谢
(2)A a; a = new A(); 是先定义一个变量(引用)a,没有初始化,之后是新建一个A类对象并让a引用它。而a = new B()是新建一个B类对象并让a引用它。
(3)不仅仅是向上转型之后,不管转型不转型,外部的任何东西都不能调用一个类(不管是子类还是父类)的private方法。你可能想糊涂了,private方法只能从自己类的方法内部自己用,不能从外部以a.f();的形式调用,这一个跟转型没有任何关系。
但在第二个问题中我仍然有些不明白,
究竟 A a = new A(); 与 B a = new A()会有什么区别?
这太危险了。
你可以:
A a = new A();
B b = (B)a;
但太危险。运行时会有ClassCastException。
父类引用可以引用子类对象,反之不可。
中的A B 是什么意思?应该怎么理解?从理论上说......谢谢!!!
但是引用的不同类型之间有什么区别?谢谢!!
比如说在你的程序中,B有个cry方法,所以B型的引用x上就可以调用x.cry,而A型的引用x上就不可以调用cry,不管对象的实际类型是什么。
Basic,Perl那种弱类型的语言中则未必。
class FlyingDog{
wing w; // 属性:有翅膀
fly(); // 行为:会飞
}Dog dog = new Dog(); // 一条狗,可能会飞也可能不会飞
FlyingDog fdog = new FlyingDog(); // 一条会飞的狗
Dog dog = new FlyingDog(); // 本来是一条会飞的狗,可惜被埋没了才华
FlyingDog fdog = (FlyingDog)new Dog(); // 要是正好这条狗会飞,那真是狗尽其才,否则的话...
--
修正:
FlyingDog fdog = (FlyingDog)dog;//要是正好这条狗会飞,那真是狗尽其才,否则参考下文
FlyingDog fdog = (FlyingDog)new Dog();//不会飞的狗硬让它飞,也是飞不起来的...