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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小刚 中级黑马   /  2012-8-18 01:03  /  1613 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

父类Java代码:  

package test;

public class Car {

        public void car(Other o){
                System.out.println(this);       
               
                o.process(this);
        }

}



子类Java代码:

package test;

public class Audi extends Car{


}


这个类里面有两个重载的方法,参数分别为父类和子类


Java代码:  

package test;

public class Other {
       
         public void process(Audi a){
                 System.out.println("Audi");
         }
         
         
         
public void process(Car c){
         System.out.println("Car");
}
}

测试类:


package test;

public class Test {

        public static void main(String[] args) {
                Other o = new Other();
               
                Car c = new Car();
                c.car(o);
               
                Audi a = new Audi();
                a.car(o);
        }
       
}

this代表的是调用该方法的当前对象,当我用Audi的对象调用car方法时,this指代的是Audi对象,执行o.process(this);方法是应该是执行的Other
类里面的
public void process(Audi a){
System.out.println("Audi");
}
才对,为什么两次打印的都是Car呢,我很疑惑

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
给你个笔记,看下吧
this关键字
        (1)this关键字代表本类对象的一个引用。
           谁调用某个方法,那么,在这个方法内部,this就代表谁。
        (2)this的使用场景
                A:局部变量隐藏成员变量
                B:在构造方法中,调用其他的构造方法。
                        **这个时候,this(参数)必须作为第一条语句存在。
继承(重点)
        (1)把很多类的相同特征和行为进行抽取,用一个类来描述。让多个类和这个类产生一个关系。
           这样的话,多个类就可以省略很多代码。这个关系就是继承。java中用extends关键字表示。
        (2)继承的概述
                A:被继承的类称为超类,父类,基类。
                B:继承父类的类被称为子类,派生类。
                C:格式
                        class Demo extends FuDemo
                        {
                       
                        }
        (3)继承的体系结构
                A:多个具体的对象,不断的向上抽取共享的内容,最终形成了一个体系。这个体系叫做继承体系。
                B:继承体系的学习和使用原则
                        **学习顶层的内容。因为他是整个体系的共性内容。
                        **创建子类使用。也就是使用底层的具体对象。
        (4)继承的特点:
                A:java中只能单继承,没有多继承。
                B:java可以有多重(层)继承。 爷爷--父亲--儿子--孙子
        (5)继承的代码体现。
                class Fu
                {
                }

                class Zi extends Fu
                {
               
                }

                Zi z = new Zi();
                用z对象操作。
        (6)子父类中的成员关系
                A:成员变量
                        在子类方法中使用一个变量时:
                        首先,在方法的局部变量中找这个变量,有则使用。
                        否则,在本类中找成员变量,有则使用。
                        否则,在父类中找成员变量,有则使用。
                        否则,报错。
                B:成员方法
                        用子类对象使用一个方法时。
                        首先,在子类中找这个方法,有则使用。
                        否则,在父类中找这个方法,有则使用。
                        否则,报错。

                        当子父类中的方法名相同时的现象被称为重写。

                        重写和重载的区别?
                        重载:在同一类中。方法名相同,参数列表不同。

                        重写:在不同类中(子父类中)。
                              方法声明相同(返回类型,方法名,参数列表)。

                        重载可以改变返回类型。

                        重写需要注意:
                                **子类方法的访问权限要大于等于父类方法的访问权限。
                                **静态只能重写静态。一般不会出现。
                C:构造方法
                        **子类的实例化过程
                                ***子类创建对象时,会先去创建父类的对象。
                                    默认是去调用父类的无参构造方法。
                                ***子类构造方法中,第一行默认是super()
                                ***为什么子类中第一行会默认有super()
                                        因为他继承父类的成员使用,使用前这些成员必须初始化,
                                        而他们是父类的成员,所以,必须通过父类进行初始化。
                                        所以,会先创建一个父类的对象。
                        **当父类没有无参构造方法时
                                必须使用this或者super调用其他的构造方法。
        (7)this和super的区别
                this:代表本类对象的引用。
                super:代表父类的存储空间。

                用法很相似。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
对象是可以向上转型的,子类调用父类的方法时(未被重载),是以父类的"身份"来调用父类的方法,也就是说类型被临时向上转型其父类的类型。
当a.car(o)时候,this的确指向的是本身的Audi对象实例,但是当进入car()方法的时候,却是以父类的身份来调用它,临时向上转型了,o.process(this)时;this还是Audi对象,但类型却是Car类型,所以打印的时Car,如果你再Audi类里覆盖public void car(Other o)方法的话,当它再被掉用的时候就不会去申请调用父类的car()方法,也就可以以自己类型的身份去调用car()方法,就可以输出Audi了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
不能把代码全都贴出来嘛,好乱哦!
回复 使用道具 举报
问题已解决!谢谢大家了,你们讲了很仔细。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马