今天在写一个程序的时候发现一个问题,于是写了一段代码测试,代码最终的运行结果是dog.a=15,an.a=10
于是有不明白的地方,代码如下,Dog类继承了Animal类,方法f()的参数是Animal的实例,我将Dog的一个实例dog传进去,发现dog中的属性a并没有被修改,疑惑的是Animal实例an中的属性a也没有被修改,那么f()方法的an.a--究竟是在哪里减了?我自己的猜想是因为dog也是Animal的一个实例,在调用方法时被当作Animal的实例指向了一块临时为Animal实例
an(形式参数)开辟的内存,进而在那段内存里执行了方法,但是方法结束内存后内存里的变量消失了,所以最终什么也没有改变,不知道我的想法对不对,求大神解释,谢谢!
package com.test;public class demo1 {public static void main(String[] args) {
// TODO Auto-generated method stub
Animal an = new Animal();
Dog1 dog = new Dog1();
Fun fun = new Fun();
fun.f(dog);
//fun.f(an);
System.out.println("dog.a="+dog.a);
System.out.println("an.a="+an.a);
}}
class Animal
{
int a=10;
int b=20;
}class Dog1 extends Animal
{
int a=15;
}class Fun
{
public void f(Animal an)
{
an.a--;
}
}
于是有不明白的地方,代码如下,Dog类继承了Animal类,方法f()的参数是Animal的实例,我将Dog的一个实例dog传进去,发现dog中的属性a并没有被修改,疑惑的是Animal实例an中的属性a也没有被修改,那么f()方法的an.a--究竟是在哪里减了?我自己的猜想是因为dog也是Animal的一个实例,在调用方法时被当作Animal的实例指向了一块临时为Animal实例
an(形式参数)开辟的内存,进而在那段内存里执行了方法,但是方法结束内存后内存里的变量消失了,所以最终什么也没有改变,不知道我的想法对不对,求大神解释,谢谢!
package com.test;public class demo1 {public static void main(String[] args) {
// TODO Auto-generated method stub
Animal an = new Animal();
Dog1 dog = new Dog1();
Fun fun = new Fun();
fun.f(dog);
//fun.f(an);
System.out.println("dog.a="+dog.a);
System.out.println("an.a="+an.a);
}}
class Animal
{
int a=10;
int b=20;
}class Dog1 extends Animal
{
int a=15;
}class Fun
{
public void f(Animal an)
{
an.a--;
}
}
解决方案 »
- 实现一个简单的自发自收信息的功能的程序,但运行出错,不知道哪里出错,求大虾帮忙纠正
- 求高人解释一段递归代码
- 我讨厌构造函数重载,请大家帮我分析下实例,注释下
- E:\jspWeb\WEB-INF\classes>javac -d . *.java是怎样执行的~
- 大虾们帮小弟解决一个低级问题 谢谢谢谢谢谢谢谢谢谢谢!
- 深圳什么地方有thing in java的英文原版卖要求打折的)
- jdbc事务控制的疑问
- 怎么生成这样的TableModel?
- text控件只能输入半脚英数不能输入全脚,该如何实现!!
- Java的脾气也不是那么好摸的!
- 关于switch语句
- unitils中的dataset数据集未加载问题
此时,实例化dog时,用的当然是dog中的a,当然它的animal.a不会删除,只是调用的时候 用的是dog中的a;
你执行f()方法时 减掉的是animal的a。 所以dog.a 不会变。你可以理解你Dog1 dog = new Dog1()时。dog 有三个参数:a(Dog1),a(animal),b(animal);
当你调用时 dog.a 调用的是 a(Dog1)这个参数