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

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

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

6 个回复

正序浏览
下面是我自己的一个总结(若果有不对的地方请谅解):Fu f = new Zi();
虽然new的是一个子类的对象但是它是Fu类型的,所以当jvm执行时,是从Fu的角度看这个类的,所以明白了这一点你就应该知道jvm的执行结果了,所以当用f调用的方法在子类中已经重写过时,jvm就会执行子类中的方法(静态的方法除外哈):所以多态存在的三个必要前提就很重要了:
(1)、继承
(2)、重写
(3)、父类医用指向子类对象

回复 使用道具 举报
同学,你写的好乱呀!好难懂,我读了好几遍才懂了你的意思,这个问题你完全可以自己验证。其实我也是一个菜鸟,看到你的问题以后我就写了一个小小的代码,下面是我得出的结论:Fu f = new Zi();(1)此时你要是用f调用父类中的静态成员(静态成员变量和静态成员方法),jvm就会执行父类中的静态成员,(2)若当你调用子类中的静态成员时。编译器会报错(找不到符号),这里我说一下你要是想调用一个类中的静态成员,你完全可以用类名.方法名或者类名.变量名。(3)当f调用的方法在子类中已经重写过时,这时就会调用子类中的方法(即多态),(4)当f调用父类中的方法时(若子类中没有重写)则jvm机会执行父类中的方法,(5)当f调用子类中独用的方法时,编译器会报错。
回复 使用道具 举报
关于继承是这样的:
继承中注意的问题:
1  重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;
            重写方法不能使用比被重写方法更严格的访问权限。
重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。

2  关键字super:
    在Java类中使用super来引用父类的成分
    super可用于访问父类中定义的属性
    super可用于调用父类中定义的成员方法
    super可用于在子类构造方法中调用父类的构造方法
    super的追溯不仅于直接父类,就是father的father。。。。。。
Supper关键字有两个特殊的用途:
    在子类构造函数中调用父类的构造函数
    在子类中调用父类的方法。
回复 使用道具 举报
  其实不管覆盖与否  子类调用方法或者成员属性的时候  这些成员属性或者方法都是创建的这个对象的  并不是父类中的东西或者子类中的东西
      简单点  比如说  你定义了一个人类   里面有成员变量 和成员方法   这时候你创建了一个对象人
        而用人。成员方法或者属性  都是这个对象人所特有的   其实人类是不存在的  只有对象是实实在在的
      就拿你的问题来说  当你创建一个对象的时候 在内存的堆内存中 创建了一个对象  存放 类属性   但内存中并没有创建调用的类或者父类啊   
    你想想是不是  我是这么理解的
回复 使用道具 举报
你说的好乱,变量是没有多态的,方法存在多态
这是我之前写的一个关于多态的例子,我想你应该是这么个意思,看完你就知道了
关于多态,多方求解之后方得到的正确答案

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
回复 使用道具 举报
没懂你的意思
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马