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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 可见 中级黑马   /  2012-3-10 23:59  /  1956 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果子类中有与父类中相同的实例方法、静态方法、实例变量、静态变量,则此实例方法将会覆盖父类的实例方法。此时如果new的是子类的实例而把它定义为父类的实例A,那么当A调用静态方法、实例变量、静态变量时都会是父类中定义的东西,只有调用了被子类覆盖了的实例方法才会是调用子类的东西。
这样说对不对?

6 个回复

倒序浏览
没懂你的意思
回复 使用道具 举报
你说的好乱,变量是没有多态的,方法存在多态
这是我之前写的一个关于多态的例子,我想你应该是这么个意思,看完你就知道了
关于多态,多方求解之后方得到的正确答案

import static Test_purview.print.*;
import Test_initalized.neum;

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
回复 使用道具 举报
  其实不管覆盖与否  子类调用方法或者成员属性的时候  这些成员属性或者方法都是创建的这个对象的  并不是父类中的东西或者子类中的东西
      简单点  比如说  你定义了一个人类   里面有成员变量 和成员方法   这时候你创建了一个对象人
        而用人。成员方法或者属性  都是这个对象人所特有的   其实人类是不存在的  只有对象是实实在在的
      就拿你的问题来说  当你创建一个对象的时候 在内存的堆内存中 创建了一个对象  存放 类属性   但内存中并没有创建调用的类或者父类啊   
    你想想是不是  我是这么理解的
回复 使用道具 举报
关于继承是这样的:
继承中注意的问题:
1  重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;
            重写方法不能使用比被重写方法更严格的访问权限。
重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。

2  关键字super:
    在Java类中使用super来引用父类的成分
    super可用于访问父类中定义的属性
    super可用于调用父类中定义的成员方法
    super可用于在子类构造方法中调用父类的构造方法
    super的追溯不仅于直接父类,就是father的father。。。。。。
Supper关键字有两个特殊的用途:
    在子类构造函数中调用父类的构造函数
    在子类中调用父类的方法。
回复 使用道具 举报
同学,你写的好乱呀!好难懂,我读了好几遍才懂了你的意思,这个问题你完全可以自己验证。其实我也是一个菜鸟,看到你的问题以后我就写了一个小小的代码,下面是我得出的结论:Fu f = new Zi();(1)此时你要是用f调用父类中的静态成员(静态成员变量和静态成员方法),jvm就会执行父类中的静态成员,(2)若当你调用子类中的静态成员时。编译器会报错(找不到符号),这里我说一下你要是想调用一个类中的静态成员,你完全可以用类名.方法名或者类名.变量名。(3)当f调用的方法在子类中已经重写过时,这时就会调用子类中的方法(即多态),(4)当f调用父类中的方法时(若子类中没有重写)则jvm机会执行父类中的方法,(5)当f调用子类中独用的方法时,编译器会报错。
回复 使用道具 举报
下面是我自己的一个总结(若果有不对的地方请谅解):Fu f = new Zi();
虽然new的是一个子类的对象但是它是Fu类型的,所以当jvm执行时,是从Fu的角度看这个类的,所以明白了这一点你就应该知道jvm的执行结果了,所以当用f调用的方法在子类中已经重写过时,jvm就会执行子类中的方法(静态的方法除外哈):所以多态存在的三个必要前提就很重要了:
(1)、继承
(2)、重写
(3)、父类医用指向子类对象

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