本帖最后由 Fozei 于 2015-8-25 18:09 编辑
本人小白,以前也不是从事IT工作的,最近自学Java基础,准备走流程进黑马培训班。新人,懂得少,有的时候学着学着有种蒙圈的感觉,提出一些问题可能会让行家笑掉大牙,但是也请见谅了,知之为知之,不知为不知吗,请看下面代码,是看毕老师视频后模仿的:- package parctise;
- public class Demo {
- public static void main(String[] args) {
-
- //function(new pig());
-
- pig p=new pig();
- function(p);
- }
- //定义一个function函数供主函数调用,参数是Animal类型的c
- private static void function(Animal c) {
- // TODO 自动生成的方法存根
- //判断传进来的函数属于哪种类型,并决定执行哪个动作
- if (c instanceof cat){
- c.eat();
- cat a=(cat)c;
- a.catchMouse();
- }
- else if (c instanceof pig){
- c.eat();
- pig a=(pig)c;
- a.gongDi();
- }
- else if (c instanceof dog ){
- c.eat();
- dog a=(dog)c;
- a.watchHome();
- }
-
-
- }
- }
- //定义一个抽象类Animal
- abstract class Animal {
-
- abstract void eat();
- }
- //定义一个cat类,继承Animal
- class cat extends Animal{
- void eat(){
- System.out.println("吃鱼");
- }
- void catchMouse(){
- System.out.println("抓老鼠");
- }
- }
- //定义一个pig继承Animal
- class pig extends Animal{
- void eat(){
- System.out.println("吃饲料");
- }
- void gongDi(){
- System.out.println("拱地");
- }
- }
- //定义一个dog继承Animal
- class dog extends Animal{
- void eat(){
- System.out.println("吃骨头");
- }
- void watchHome(){
- System.out.println("看家");
- }
- }
复制代码
我的疑问出现在两种实现对象的方法上。在这个程序里,实现对象有两种方法:第一种,第6行的简略方法(我自己瞎说的),和第二种第8/9行的完全方法(也是我瞎说的)。其中第二种方法很好理解,function();运行,需要接收一个Animal类型的形参c,而在第八九行的语句里,新建了一个Animal的对象cat();,并且把他在内存中的地址值赋给了p,因此传给函数function的参数就是p指向的地址值,这个过程中,有一个把新建立对象的地址值赋给p,p在传递给c的过程。而在第一种方法中,却省略了对象在内存中地址值赋给p这个中间传送变量的过程,那么这个省略,是不是就相当于出现了一个对象,只有地址值,却没有名字的事实?好像他是隐形的?好疑惑呀,谁来给讲讲。
|
|