public class Test_diversifyTest1 {
public static void main(String[] args){
Cycle c = new Cycle();
print(" 车轮数:"+c.ride(neum.Bicycle).wh);
Unicycle c1 = new Unicycle();
print(" 车轮数:"+((Unicycle)c1.ride(neum.Unicycle)).wh);
print(" 车轮数:"+((Unicycle)c1.ride(neum.Unicycle)).wh1);
// 把返回的Cycle类型强制转换成Unicycle类型就能得到正确的wh了
// 向下面这样子会得到的结果是0而不是4
// print(" 车轮数:"+c1.ride(neum.Unicycle).wh);
}
}
class Cycle{
int wh = 0;
public Cycle(){
print("This is in The class Cycle!");
}
public Cycle ride(Object o){
print("Class: "+ this);
return this;
}
}
class Unicycle extends Cycle{
int wh1 = 4;
public Unicycle(){
print("This is in The class Unicycle!");
}
public Unicycle ride(Unicycle o){
print("Class: "+ this);
return this;
}
}
class Bicycle extends Cycle{
int wh = 2;
public Bicycle(){
print("This is in The class Bicycle!");
}
}
class Tricycle extends Cycle{
int wh = 3;
public Tricycle(){
print("This is in The Tricycle!");
}
}
//Output:
//This is in The class Cycle!
//Class: Diversify.Cycle@61de33
// 车轮数:0
//This is in The class Cycle!
//This is in The class Unicycle!
//Class: Diversify.Unicycle@ca0b6
// 车轮数:0
//Class: Diversify.Unicycle@ca0b6
// 车轮数:4作者: 贠(yun)靖 时间: 2012-3-11 00:20
其实不管覆盖与否 子类调用方法或者成员属性的时候 这些成员属性或者方法都是创建的这个对象的 并不是父类中的东西或者子类中的东西
简单点 比如说 你定义了一个人类 里面有成员变量 和成员方法 这时候你创建了一个对象人
而用人。成员方法或者属性 都是这个对象人所特有的 其实人类是不存在的 只有对象是实实在在的
就拿你的问题来说 当你创建一个对象的时候 在内存的堆内存中 创建了一个对象 存放 类属性 但内存中并没有创建调用的类或者父类啊
你想想是不是 我是这么理解的作者: 黄方 时间: 2012-3-11 00:26
关于继承是这样的:
继承中注意的问题:
1 重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;
重写方法不能使用比被重写方法更严格的访问权限。
重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。
2 关键字super:
在Java类中使用super来引用父类的成分
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造方法中调用父类的构造方法
super的追溯不仅于直接父类,就是father的father。。。。。。
Supper关键字有两个特殊的用途:
在子类构造函数中调用父类的构造函数
在子类中调用父类的方法。 作者: 一生一世 时间: 2012-4-25 20:40
同学,你写的好乱呀!好难懂,我读了好几遍才懂了你的意思,这个问题你完全可以自己验证。其实我也是一个菜鸟,看到你的问题以后我就写了一个小小的代码,下面是我得出的结论:Fu f = new Zi();(1)此时你要是用f调用父类中的静态成员(静态成员变量和静态成员方法),jvm就会执行父类中的静态成员,(2)若当你调用子类中的静态成员时。编译器会报错(找不到符号),这里我说一下你要是想调用一个类中的静态成员,你完全可以用类名.方法名或者类名.变量名。(3)当f调用的方法在子类中已经重写过时,这时就会调用子类中的方法(即多态),(4)当f调用父类中的方法时(若子类中没有重写)则jvm机会执行父类中的方法,(5)当f调用子类中独用的方法时,编译器会报错。作者: 一生一世 时间: 2012-4-25 20:56
下面是我自己的一个总结(若果有不对的地方请谅解):Fu f = new Zi();
虽然new的是一个子类的对象但是它是Fu类型的,所以当jvm执行时,是从Fu的角度看这个类的,所以明白了这一点你就应该知道jvm的执行结果了,所以当用f调用的方法在子类中已经重写过时,jvm就会执行子类中的方法(静态的方法除外哈):所以多态存在的三个必要前提就很重要了:
(1)、继承
(2)、重写
(3)、父类医用指向子类对象