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

作者&投稿:照和 (若有异议请与网页底部的电邮联系)
JAVA父类引用指向子类的对象是什么意思?~

父类 Person 子类 Student
可以这样定义 Person p = new Student();
就是你问的 “JAVA父类引用指向子类的对象”
但是你得注意:父类的引用指向子类的话,此时的 p 只能使用Person类中存在的方法,但是子类
Student类中扩充的方法就不能调用了
class Person {
private int age ;
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
publc int getAge(){
return age ;
}
}

class Student extends Person {
private Strng school ;
public void setSchool(String school){
this.school = school;
}
public String getSchool(){
return this.school;
}
}
public class Demo{
public static void main(String [] args){
Person p = new Student();
//p.setSchool("清华大学")
//String school = p.getSchool(); //以上的两个语句都是错误的,你自己看看吧
}
}

就是这么设计的...没有理由 使用父类引用 但是实际引用对象是子类对象的时候是不能够直接调用子类新添加的方法的 想要调用必须强制类型转换 用子类对象的引用 引用子类对象才行

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

对于这个问题你要明白两点:
1、何为覆盖
2、何为对象引用,何为对象实体(重点)

Father obj=new Son();

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

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

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

换句话来说,其实就是用父类做声明,由子类来实例化,方法是谁的关键看new 后面的是谁。

父类可以调用子类重写的父类的成员方法。
这点可以用下面的例子来说明

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");
}
}

不能,父类不能调用子类方法。
除非你用强制类型转换: ((Son) obj).method();

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


java对象多态性的问题
一开始fun3是可以调用的(Aa = b 之前), 但是在这句话之后, 因为你是向上转, 这个时候a对象会舍去期多于的部分,所以你的a不能调用到fun3(); 就像 现在有一个大袋子A, 里面有两个小袋子,而现在又有一个大袋子B , 他是模仿A袋子制造出来的,里面也有两个与A袋子相同的两个小袋子,但是...

java中的super()是什么
所以,如果super是个变量,也指向当前对象,那么,不管super的静态类型是什么super.method()必然调用的是子类的那个版本,而不会是我们期望的,静态地选择父类的那个版本。所以,你只要把super.xxx看成一个特殊的语法,比如理解为“super::xxx”就好了。既然super不是一个变量,那么不能把它象一个普通变...

JVM原理是什么?
回答:JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例 4.调用JNIEnv实例装载并处理class类。

JAVA接口如何提高软件可维护性?最好写出Java接口的作用,和接口如何提 ...
ava是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。接口是可插入性的保证。在一个等级结构中的任何一个类...

JVM原理是什么?
方法表:一个数组,包括所有它的实例可能调用的实例方法的直接引用(包括从父类中继承来的)除此之外,若某个类不是抽象和本地的,还要保存方法的字节码,操作数栈和该方法的栈帧,异常表。举例:classLava{ privateintspeed=5; voidflow(){} classVolcano{ publicstaticvoidmain(String[]args){ Lavalava=newLava();...

JAVA是什么意思?
形式为:class (子类) extends (基类)。 12.多态:在java中,对象变量是多态的.而java中不支持多重继承。 13.动态绑定:调用对象方法的机制。 (1)编译器检查对象声明的类型和方法名。 (2)编译器检查方法调用的参数类型。 (3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。 (4)当...

青县18398339308: java 子类的引用能指向父类的对象吗 -
依何力保: java 子类的引用不能指向父类的对象,原因:假设有2个类,parent和child,其中child继承了parent,那么这个时候,你这样写parent p = new child();是没问题的,这种叫向上转型(将子类的实例对象赋给父类的引用变量),经过这次转型后,你再接着写child c = (child)p; 也是可以的,这叫向下转型,因为经过了一次向上转型,所以向下转型是没问题的,可是你不能直接就要child c = new parent();这样的,这不合法的,没有父拿来的孩子

青县18398339308: java指向子类的父类对象到底能不能调用子类的方法? -
依何力保: 对于这个问题你要明白两点: 1、何为覆盖 2、何为对象引用,何为对象实体(重点)Father obj=new Son();Father obj 是对象引用 new Son(); 是对象实体所以调用的方法可以说都是子类的方法,因为此代码中实体对象是子类,但由于引用是属于父类,所以在调用子类方法时,只能调用父类中已声明的.换句话来说,其实就是用父类做声明,由子类来实例化,方法是谁的关键看new 后面的是谁.

青县18398339308: java中允许子类的引用指向父类的对象吗?比如A是父类B是子类; 可以像这样写吗: B b=new A(); -
依何力保: A是父类B是子类的话,是错误的,如果反过来则正确.子类对象可以赋给声明为父类的变量:A a = new B();只不过这样的话,a 就只能调用父类A中声明的方法,属性等,不能调用子类B中的方法、属性.如果像你这么写,一般情况下会发生类型转换错误,你可以试一下.建议去看一下JAVA的类型转换,里面说得很清楚.

青县18398339308: java语言中.. 子类的引用 可以指向父类的对象么?
依何力保: 不可以!

青县18398339308: java中指向父类的对象可以调用子类的方法吗? -
依何力保: father f = new son(); f.son(); 这样才可以

青县18398339308: JAVA父类引用指向子类的对象是什么意思??? -
依何力保: 你好,给你举个简单的例子吧.类A,另外一个类B继承了类A.有如下代码: A a = new B() ; 这就称父类的引用a 指向了子类的对象new B(),就是这个意思.

青县18398339308: java 子类实例化时是否同时存在一个父类对象. -
依何力保: 不会产生父类对象,只是用了父类的构造函数而已,并不是用到构造函数就会产生对象,构造函数只是起对象初始化作用的,而不是起产生对象作用的,如果new A();即只有new语句才会产生父类A的对象.变量是静态绑定 ,方法是动态绑...

青县18398339308: java中当父类引用指向子类对象时,那么这个引用可不可以调用子类中的属性和方法呢? -
依何力保: 多态.如果说父类中有这个属性跟方法,子类有重写过,那么调用的是子类中的属性跟方法.如果父类中没有这个属性跟方法,那么子类调用就会出错.如果父类有这个属性跟方法,而子类没有,则调用的是父类的属性跟方法.

青县18398339308: java中父类引用指向子类对象 -
依何力保: class A {} class B extends A{说明:B类继承A类, A 是父类,B 是子类.A a = new B(); 等号左边 就是父类的引用a, 右边就是子类B对象, 这就是把父类的引用指向子类对象.

青县18398339308: Java中子类的引用变量为什么不能指向父类的对象 -
依何力保: 你不妨当做一个知识点来记住,不要钻牛角尖. 创建对象时只能指向对象类或者对象的父类,指向父类叫向上造型.这时子类可以调用父类的方法.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网