public class aa
{
int num=99;
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}}
class bb extends aa
{String sex="男";
bb()
{
num=88;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了 wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:03:51 得分: 0
但是如果把System.out.println(f.sex);注释掉,我们输出的:System.out.println(f.num);为88
也就是说f为bb类的实例,同理可以推出f.sex也应当是bb类的,所以不应当报错的啊?
急急急!!!!!!!!111
还请高手指教. zyzsunny() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:24:14 得分: 0
我刚刚就看了你的一个问题,呵呵,记得好象有点相似.
void jj(aa f)需要一个aa的REFERENCE作为参数,但是它也可以接受任何由AA派生来得的REFERENCE.当把BB的引用传递给函数接口时向上转型就发生了.这是完全可以的---因为BB继承了AA,但BB的REFERENCE向上转型时它自身的接口会变小,String sex="男";当然也就无法访问了 dash_running() ( ) 信誉:100 Blog 加为好友 2007-04-16 00:47:25 得分: 0
这是个向上类型转换的问题,我正好想过并实验过这个问题.
当把子类的句炳赋给父类后比如f=ch后, 代码上f指向的是Child,但是实际是进行了类型转换,把ch的非Father部分截断,只剩下Father类型里的东西,所以
System.out.println(f.sex);//注释
就会出错.
向上类型转换(upcasting)
从面向对象的概念上来说就是 一个子类对象同时也是一个父类对象,举例说男人也是人(当然,女人也是人),
从java语法的角度来说可以描述为子类的句柄可以赋给父类的句柄:
Child ch=new Child;
Father f=ch;
但是反过不能把父类的句柄赋给子类的句柄 wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-04-16 07:56:42 得分: 0
上楼您好:如果把:"void jj(aa f)"改成:"void jj(bb f)"
从推理上讲应该会找到f.sex了吧?
但是我试了还是不能,请问又该如果解释呢?
{
int num=99;
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}}
class bb extends aa
{String sex="男";
bb()
{
num=88;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了 wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:03:51 得分: 0
但是如果把System.out.println(f.sex);注释掉,我们输出的:System.out.println(f.num);为88
也就是说f为bb类的实例,同理可以推出f.sex也应当是bb类的,所以不应当报错的啊?
急急急!!!!!!!!111
还请高手指教. zyzsunny() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:24:14 得分: 0
我刚刚就看了你的一个问题,呵呵,记得好象有点相似.
void jj(aa f)需要一个aa的REFERENCE作为参数,但是它也可以接受任何由AA派生来得的REFERENCE.当把BB的引用传递给函数接口时向上转型就发生了.这是完全可以的---因为BB继承了AA,但BB的REFERENCE向上转型时它自身的接口会变小,String sex="男";当然也就无法访问了 dash_running() ( ) 信誉:100 Blog 加为好友 2007-04-16 00:47:25 得分: 0
这是个向上类型转换的问题,我正好想过并实验过这个问题.
当把子类的句炳赋给父类后比如f=ch后, 代码上f指向的是Child,但是实际是进行了类型转换,把ch的非Father部分截断,只剩下Father类型里的东西,所以
System.out.println(f.sex);//注释
就会出错.
向上类型转换(upcasting)
从面向对象的概念上来说就是 一个子类对象同时也是一个父类对象,举例说男人也是人(当然,女人也是人),
从java语法的角度来说可以描述为子类的句柄可以赋给父类的句柄:
Child ch=new Child;
Father f=ch;
但是反过不能把父类的句柄赋给子类的句柄 wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-04-16 07:56:42 得分: 0
上楼您好:如果把:"void jj(aa f)"改成:"void jj(bb f)"
从推理上讲应该会找到f.sex了吧?
但是我试了还是不能,请问又该如果解释呢?
解决方案 »
- 困惑:传值和传引用! 高手请进!!~~~~谢谢~~~
- 很不明白?????????????
- 请问“子窗口关闭时候,主窗口也一起关闭了“怎么解决?
- 動態取JTextField的內容
- 为什么这样报错?Exception in thread "main" java.lang.NoSuchMethodError: main
- 有个JAVA的程序,想用DELPHI给做个界面,行不行?如果用JAVA做界面,什么工具最好呢?
- String替换的问题
- java里怎么写VB那样的定时器???
- 一对一关系
- 如何控制Frame中的组件大小,当用鼠标拖动改变frame大小时
- 从MySql中用java程序读取的中文数据为什么是乱码啊
- 求一个关于boolean赋值的问题??
public class aa
{
int num=99;
String sex="女";
void jj(aa f)
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
//System.out.println(f.sex);//注释
}}
class bb extends aa
{ String sex="男";
bb()
{
num=88;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}
改成
protected String sex="女";再想想是怎么回事
既然不会动态绑定 那当然不会输出子类的值
除非你在子类的构造函数中对超类的域赋值相当于 子类有个sex域 超类也有个sex域
但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了
=========================================
你把超类的共有特性给注释了 那num就成为子类的自有特性 当然会提示找不到
改成
protected String sex="女";
之后还是输出女啊?
String sex="女";默认的是public而你加上 protected什么意思啊.
这两种类型都可以被子类所继承啊?
照上面的程序逻辑会输出男啊?
如果在void jj(aa f)中再添加一句.
System.out.println(f.num) 则会输出f.num=88
这就更使我应该输出男才对啊?
可能我的理解是错了,还请各位指点一二.
如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了
=========================================
你把超类的共有特性给注释了 那num就成为子类的自有特性 当然会提示找不到
__________________________________________________________
对,那num就成为子类的自有特性 但是System.out.println(f.getClass().getName());输出的是
f是子类bb的实例,怎么会提示找不到呢?
不好意思,还请你再指点一下.
白是马的只有特性
难道你可以说马的颜色就是白?
改成
protected String sex="女";
之后还是输出女啊?
String sex="女";默认的是public而你加上 protected什么意思啊.
这两种类型都可以被子类所继承啊?
照上面的程序逻辑会输出男啊?
如果在void jj(aa f)中再添加一句.
System.out.println(f.num) 则会输出f.num=88
这就更使我应该输出男才对啊?
可能我的理解是错了,还请各位指点一二.===============================可以继承 但是不会动态绑定public class aa
{
int num = 99;
String sex = "女"; protected String getSex()
{
return sex;
}
void jj(aa f)
{
System.out.println(f.getSex());
System.out.println(f.getClass().getName());
// System.out.println(f.sex);//注释
}
public static void main(String args[])
{
bb b = new bb();
aa a = new aa();
a.jj(b);
}}class bb extends aa
{
String sex = "男"; protected String getSex()
{
这里区分返回超类的域 还是子类的域
// return super.sex;
return sex;
}
bb()
{
num = 88;
}}
System.out.println(f.num) 则会输出f.num=88
=====================================超类中的num 被子类继承 子类在构造函数中对其赋值 这个是正确的但是~~
你子类中重新定义了一个num的话
子类中的num跟超类中的num是没有关系的
你要得到哪个值 就看你怎么调用了
public class aa
{
int num=99;
String sex="女";
void jj(aa f)
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
System.out.println(f.sex);}}
class bb extends aa
{
bb()
{
num=88;
sex="男";
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}
public class aa
{
int num=44;
void qq()
{
System.out.println(num);
}
}
class bb extends aa
{
bb()
{
num=55;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.qq();
}
}
会输出44而不是55也就是因为num不是static 即使你子类中怎么修改父类中的num是不会改变的.
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
System.out.println(f.sex);}}
-------------------------------------
看这个方法,形参是父类,传入的却是子类
相当于是父类对子类的引用。bb b=new bb();
aa a=new aa();
a.jj(b);
-------------------------------------
这里的b作为参数传入后可以这样理解:
aa b = new bb();String sex="男";
------------------------------------
你在子类定义这个对父类是没有影响的,就像你自已说的那样
99
bb
女class aa
{
int num=99;
String sex="女";
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}}
class bb extends aa
{
String sex="男";
int num=77;
bb()
{
num=88;
sex="男";
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}
{
int num=99;
String sex="女";
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}}
class bb extends aa
{
//String sex="男";
//int num=77;
bb()
{
num=88;
sex="男";
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}
--------------------Configuration: <Default>--------------------
88
bb
男