java指向子类的父类对象到底能不能调用子类的方法?

我搞蒙了!!
Father obj=new Son();
obj可以访问Son中的方法吗?
百度问人说不可以,因为父类可能有很多个子类继承,它不知道调的是哪个,但是网上博客又说可以,请给我一个明确的答案。谢谢。

你这个问题你问的没有太明确,我来大概解释一下吧。
首先你要知道多态的概念,有编译时多态(前期绑定),还有运行时多态(后期绑定),注意:C语言中只有编译时多态,但是java两者都有,java中除了static方法和final方法,其他所有的方法都是后期绑定,类成员变量也是前期绑定的,如果你对java的类初始化顺序有所了解就会明白,所以我们写程序的时候不必去指定是否应该去进行后期绑定,它是自动进行的
注意只有普通方法才可以是多态的,java中类的final方法,static方法,类成员变量,都是在编译的时候已经确定的,如果用父类引用指向子类对象,那么你可以自行代码测试,结论如下:
1.通过父类引用调用子类中重写父类的方法,那么会调用子类的重写方法,
2.通过父类引用调用子类中独有的方法,那么必须把父类引用强制转化成子类类型的引用才能进行调用。
3.通过父类引用调用子类重写父类的静态方法(子类中的这个方法和父类中的这个方法返修饰符,返回类型,方法名,参数列表完全相同,假定认为静态方法也可以重写吧),通过父类引用调用静态方法,不会有多态的特征,调用的还是父类的静态方法,因为java中静态方法和类是绑定的,而不是和单个对象绑定的。
4.通过父类引用调用子类和父类中同名的public变量,那么调用的是父类的成员变量,因为当子类对象转型为父类引用的时候,访问局部变量的操作都由编译器解析,因此不是多态的。子类对象中包含了两个同名的public变量(debug的时候你会看到子类对象中有两个变量),他自己的和他从父类得到的,所以通过父类引用指向子类对象而调用父类和子类同名的public 变量,那么会调用父类的public变量,而不是子类的public变量,因为是前期绑定,编译时候已经确定了调用哪一个,而不是通过父类引动态地选择用到底该调用哪一个变量。
反正记住一点,如果父类引用指向了子类对象,那么通过父类引用调用子类重写父类的普通方法,那么可以直接调用,如果通过父类引用调用子类独有的方法那么就得强制转换。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-26
对于这个问题你要明白两点:
1、何为覆盖
2、何为对象引用,何为对象实体(重点)

Father obj=new Son();

Father obj 是对象引用
new Son(); 是对象实体

所以调用的方法可以说都是子类的方法,因为此代码中实体对象是子类,

但由于引用是属于父类,所以在调用子类方法时,只能调用父类中已声明的。

换句话来说,其实就是用父类做声明,由子类来实例化,方法是谁的关键看new 后面的是谁。本回答被提问者采纳
第2个回答  2014-02-14
父类可以调用子类重写的父类的成员方法。
这点可以用下面的例子来说明

public class son extends father{
/**
* 父类可以调用子类重写的成员方法
* */
public void pirnt(){
System.out.println("son");
}

public static void printS(){
System.out.println("son static");
}

public static void main(String[] args) {
father f=new son();
f.pirnt();
father.printS();
}
}
class father{
public void pirnt(){
System.out.println("father");
}
public static void printS(){
System.out.println("father static");
}
}本回答被网友采纳
第3个回答  2014-02-14
不能,父类不能调用子类方法。
除非你用强制类型转换: ((Son) obj).method();追问

但是请看这里http://blog.csdn.net/kaiwii/article/details/8042488 它的child还可以调用子类中的func2();

追答

大哥,func2在父类里面也定义了好不好,子类重写了func2,这样当然可以调用拉,这就是所谓的多态啊。

追问

明白了 谢谢

第4个回答  2019-08-18
多态的存在就是为了让父类对象引用子类从写的方法,至于你说的属性:就是老三说的可编译时还是认为他为父类,所以只能访问父类对象的属性等。
相似回答