class A
{
String name="张三";
void qq(A a)
{
System.out.println(a.name);
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.qq(b);
}
}
class B extends A
{
String name="李四";
}
请问一下,上面的程序为什么会输出张三啊?我是这么想的:B类继承了A类,并覆盖了A类的成员变量
name,a.qq(b)传递过去的是B类的实例,应当输出李四啊?
{
String name="张三";
void qq(A a)
{
System.out.println(a.name);
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.qq(b);
}
}
class B extends A
{
String name="李四";
}
请问一下,上面的程序为什么会输出张三啊?我是这么想的:B类继承了A类,并覆盖了A类的成员变量
name,a.qq(b)传递过去的是B类的实例,应当输出李四啊?
解决方案 »
- RTMP协议 握手
- spring 注入式开发的一些问题
- 关于单选按钮的获值问题(Swing的按钮)
- java读文件
- 首先给大家拜个年,我想请教一下在struts 里怎么实现像asp.net 中的server.execute()方法呢???
- LINUX下运行jar问题,在线等。。。急!!!急
- 新手问题关于引入别的类文件提示错误
- 这样如何解决??
- jb7中怎么使用别的jdbc,怎么把已知的jdbc加入connection的driver下拉列表里!
- 请问:哪儿有oracle公司的web服务器下载?听说他自评性能很高!
- 我想问下,InputStream类中的read()方法怎么定义
- 请大家进来看一下,书上所说的这个标题,是不是错误的?
还有就是访问一个对象的变量,这个没有覆盖不覆盖的说法,父类和子类都有一个name变量,在不同的内存地址,互不影响。
class A
{
String name="张三";
A()
{
name="王刚";
}
void qq(A a)
{
System.out.println(a.name);
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.qq(b);
}
}
class B extends A
{
B()
{
super();
}
String name="李四";
}
我测试了,不会输出李四,还是输出张三.程序如下:
class A
{
String name="张三";
void qq(A a)
{
System.out.println(a.name);
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.qq(b);
}
}
class B extends A
{
void qq(A a)
{
System.out.println(a.name);
}
String name="李四";
}
{
String name="张三";
void qq(A a)
{
a.show();
System.out.println(a.name);
}
public void show(){
System.out.println("a "+this.name);
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.show();
b.show();
a.qq(b);
}
}
class B extends A
{
String name="李四";
public void show(){
System.out.println("b "+this.name);
}
}
class A
{
String name = "张三";//A.name
}
class B extends A
{
String name = "李四";//B.name
//这里注意,B其实还有一个继承下来的name成员,如果需要使用可以通过super.name来引用。
}
class MainClass
{
private static void outA(A a)
{
System.out.println("a "+a.name);
}
private static void outB(B b)
{
System.out.println("b "+b.name);
}
public static void main(String[] args)
{
B b = new B();
outA(b);//输出张三,输出了b的隐藏成员
outB(b);//输出李四,输出了b的新成员
}
}
所以这里输出什么取决于你将它当作什么类型处理
除了私有方法和静态方法,对于其他方法,jvm中有个表,这个表类似于c++里的虚函数表Vtable,在调用方法时,根据实例的类型,从表中确定应该调用哪一个,这样就实现了覆盖基类中方法的能力.
但是对于属性,没有上面这一说,任何一个属性在编译结束时即可确定其地址.换句话说,属性没有覆盖这一说.
一楼说的也是对的,但是没说到本质上.二楼是错的.
虽然java和c++不一样但是在许多方面是相通的!
回来程序来说吧:qq(A a )方法调用的参数是A类型的,在翻译期间就约定了参数A的类型,尽管被赋于B类型,jvm依然会使用翻译期间的初衷一样,认为是A类型,结果是哪样就可想而知了