黑马程序员技术交流社区
标题:
子类继承父类发现的疑问
[打印本页]
作者:
王小刚
时间:
2012-8-18 01:03
标题:
子类继承父类发现的疑问
父类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呢,我很疑惑
作者:
王健
时间:
2012-8-18 01:13
给你个笔记,看下吧
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:代表父类的存储空间。
用法很相似。
作者:
周世阳
时间:
2012-8-18 03:05
对象是可以向上转型的,子类调用父类的方法时(未被重载),是以父类的"身份"来调用父类的方法,也就是说类型被临时向上转型其父类的类型。
当a.car(o)时候,this的确指向的是本身的Audi对象实例,但是当进入car()方法的时候,却是以父类的身份来调用它,临时向上转型了,o.process(this)时;this还是Audi对象,但类型却是Car类型,所以打印的时Car,如果你再Audi类里覆盖public void car(Other o)方法的话,当它再被掉用的时候就不会去申请调用父类的car()方法,也就可以以自己类型的身份去调用car()方法,就可以输出Audi了
作者:
高薇
时间:
2012-8-18 08:41
不能把代码全都贴出来嘛,好乱哦!
作者:
王小刚
时间:
2012-8-18 11:08
问题已解决!谢谢大家了,你们讲了很仔细。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2