求教一个继承的问题
class Father {String name="father";
void printname(){
System.out.println(name);
}
}
class Son extends Father{
String name="son";
void printname(){
System.out.println(name);
}
}
public class Test {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.name);
f.printname();
}
}
输出:
father
son
提问:我知道这是一个父类的引用指向子类的对象,但为什么用f对象的成员变量即打印f.name是father,而用它的方法printname()打印的是son呢?谢谢解答~! --------------------编程问答-------------------- 声明父类,创建子类。
声明的什么,拥有什么。(属性)。
创建的什么,执行什么。(方法)。 --------------------编程问答--------------------
而当你使用f.printname方法的时候实际调用的是son的printname方法,因为Father的printname方法被重写了,
而在son的printname取的是son.name所以输出了son,
但是使用f.name实际是访问了Father对象的name,而不是son的name,重写是针对方法而没有针对成员变量 --------------------编程问答-------------------- 父类子类都定义了name属性变量,你实例化的是父类引用。方法是调用自己的,属性是父类的。 --------------------编程问答-------------------- 长姿势了,确实是这样子的! --------------------编程问答-------------------- 调用属性的时候:根据变量类型调用;
调用方法的时候:是根据对象调用的。
你的案例中f.name,f的变量类型是father所以调的是父类。
f.parent(),对象是son类型所以调用son的方法。
综上,变量和对象是2个不同的概念。 --------------------编程问答-------------------- 在有继承的情况下
父类对象.属性 就是引用的是父类的属性(因为属性不会被继承)
父类对象.方法 就是引用的是子类的方法(因为子类已经覆盖了此方法) --------------------编程问答--------------------
很赞 --------------------编程问答-------------------- 父类引用指向子类对象
属性的归属由引用变量类型决定
重载的方法调用依据引用变量类型
重写的方法的调用由指向的对象的类型决定(多态) --------------------编程问答-------------------- 学习了,基础性的问题最难搞懂 --------------------编程问答-------------------- 言简意赅,通俗易懂 --------------------编程问答--------------------
这是刘洪旺老师对多态的总结。 后边还有一句:
“创建的什么,可以强转为什么”。 --------------------编程问答--------------------
而当你使用f.printname方法的时候实际调用的是son的printname方法,因为Father的printname方法被重写了,
而在son的printname取的是son.name所以输出了son,
但是使用f.name实际是访问了Father对象的name,而不是son的name,重写是针对方法而没有针对成员变量
请问为什么使用f.name访问的是Father的name,f的内存分布不应该是Son么————初学java弱弱的问下 --------------------编程问答-------------------- 首先,子类只能继承父类的非私有的方法和属性,即非private的方法和属性。
其次,在方法覆写这一点上,我们说覆写是一种特殊意义上的方法的继承,因为通常情况下,子类继承父类的方法,不用在子类中写出来,直接就继承了父类的所有的公共操作,可是,现在覆写的概念,注定是对父类中的方法进行了扩展,所以有时候我们也管继承关系叫扩展,并且此处一定是要注意,被子类覆写的方法的方法权限不能比父类小。(要不能叫扩展吗?)被覆写的方法不能抛出比父类更多的异常。
再次,覆写也称为覆盖,其意义在于,某个方法被子类覆写的话,就将直接覆盖掉原本继承自父类的同名的方法,这句话是不是废话,仁者见仁吧! --------------------编程问答-------------------- 这个是多态的特性...
多态中成员函数特点:
1.编译时,参阅引用类型变量的所属类是否有调用方法。 看左边
2.运行时,参阅对象所属类中是否有调用方法。 看右边
多态中成员属性的特点:
1.不管编译时,还是运行时,都参阅引用类型变量所属类然后调用。 看左边 --------------------编程问答-------------------- 不错,这个题出得很强,
1 楼 nmyangym 的回复 学习中.... --------------------编程问答-------------------- 顺道学习 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 表示这题出的很是恰当 最近也在这犯迷糊 刚看到贴 算是懂了些 综合下说 就是非私有的属性或方法都是可以被继承的 但当父类以引用的方式来调用时 则属性和方法的输出则是不同的 14楼说的很在理 顶 --------------------编程问答-------------------- 楼上的说的挺对,但对于这段代码我有自己的看法,第一个字段的打印不用解释了,说说第二个方法的打印,其实还是父类方法的运行,只是运行的时候,子类有对这个方法的重写,这是跳过父类方法,直接执行子类方法,如果你把子类方法删了你看看是不是执行父类方法,你看看多态,里面这样的例子很多。。。 --------------------编程问答-------------------- 方法是有晚绑定的原因,字段是由于申明的对象
补充:Java , Java SE