A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 dark_horse_xu 于 2014-10-2 00:25 编辑

abstract class Animal
{
        public abstract  void eat();
}
class Cat extends Animal
{
        public void eat()
        {
                System.out.println("鱼");
        }
        public void catchMouse()
        {
                System.out.println("抓老鼠");
        }
}
class Dog extends Animal
{
        public void eat()
        {
                System.out.println("骨头");
        }
        public void kanJia()
        {
                System.out.println("咬人");
        }
}
class DuoTaiDemo2
{
        public static void main(String[] args)
        {
                //Animal a = new Cat();
                //Cat c = (Cat)a;
                //function(a);
                //c.catchMouse();
                function(new Cat());
                function(new Dog());
        }
        public static void function(Animal a)
        {
                a.eat();//为什么可以直接用a呢,也没定义a啊,为什么编译通过不提醒找不到对象呢
                if (a instanceof Cat)
                {
                        Cat c = (Cat)a;
                        c.catchMouse();
                }
                else if (a instanceof Dog)
                {
                        Dog d = (Dog)a;
                        d.kanJia();
                }
        
        }
}

10 个回复

倒序浏览
好奇怪的问题。function函数能调用a是因为function函数有一个名为a的形参啊,不能调用a才不正常了
回复 使用道具 举报
不是在参数列表那里定义了么

点评

比如 function(int a ) {this.a = a ;就编译失败,a也在参数列表里 啊}  发表于 2014-9-24 15:13
回复 使用道具 举报
这个程序有问题吗? 应该没问题吧.
这个a来自这个方法的参数Animal a啊:
public static void function(Animal a)

函数调用过程是有一个形参和实参相结合的过程,
即, 其会栈空间分配一个栈桢, 然后在其中定义一个形参.
然后, 实参会向形参赋值, 这叫做形实结合,
然后再执行函数体中的代码.
这个需要了解下的.

点评

是啊,那应该定义一下啊 记得当时做个一个联系,function(int x){this.x = x;}就提示找不到符号啊,这个和Animal和int有什么区别啊?  发表于 2014-9-24 15:22
回复 使用道具 举报
局部变量有三种
第一,是在方法中定义的变量,如你在main方法中定义的a
第二,是在代码块中定义的变量,如在for循环和while循环内定义的变量,
第三,是方法的形参,也叫方法签名,如main方法中的args和你那个方法中的a变量
局部变量的有效范围是方法内部,或者代码块内部,各个方法之间的变量互不干扰.就好像你上面的代码里面
main方法的a和function方法的a是不会影响到对方的,

你在mian方法中运行
function(new Cat());
function(new Dog());
的时候,先有一个对象作为实际参数放到了function方法中,然后被function方法的形参a引用,然后在function中利用a的引用去操作实际的参数对象new Cat();
这个方法执行完了之后,再次执行 function方法,原理也是一样,但是这里方法里面的形参a不是上面那个方法里面的a了.

点评

谢谢,你的回答,明白了  发表于 2014-9-24 15:29
回复 使用道具 举报
fantacyleo 发表于 2014-9-24 14:26
好奇怪的问题。function函数能调用a是因为function函数有一个名为a的形参啊,不能调用a才不正常了 ...

如果(int a)
this.a = a ;编译就会失败的啊
回复 使用道具 举报
水竹 中级黑马 2014-9-24 15:16:44
7#
dark_horse_xu 发表于 2014-9-24 15:12
如果(int a)
this.a = a ;编译就会失败的啊

那句话之所以出问题不是因为用了a,而是因为用了this.a;因为this.a 指的是当前对象的成员变量a,但显然并没有这个成员变量,所以错了啊。

点评

明白了,太感谢你的回答了  发表于 2014-9-24 15:24

评分

参与人数 1黑马币 +5 收起 理由
fantacyleo + 5 正解

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马