为什么java的继承,在方法和成员变量两边表现不一样呢

问题描述

对于方法,父类有方法b和a,其中b调用a,子类重写了a方法。通过子类对象调用b方法时,调用的是子类重写的a方法。但是对于变量,父类方法a中访问了公共变量var,子类覆盖了公共变量var。通过子类对象调用方法a,访问的却是来自继承的变量,不是重写的变量。不知道为什么会有这种差异呢?

解决方案

解决方案二:
多态的问题,多态是针对子类重写父类的方法的,但对变量则没有多态。比如Aa=newB();是创建了一个子类对象并把它当成父类对象A用也就是父类引用指向子类对象此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a只能调用属于A的方法.不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat().这就是多态比如Animala=newTiger();Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先,a是一只老虎.但不幸的是,Animala=newTiger();也就是说a虽然有了老虎的实质,就是说有了老虎的爪子,身材.....,但却没有老虎的名分.它虽然身体是老虎,但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为,但老虎吃肉,动物都吃肉么?所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义.这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时,比如说给a喂吃的,虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法.具体的吃的过程,就相当于程序的运行的阶段.而此时a的类型为运行时的类型-老虎
解决方案三:
楼主怎么写的,我按照你的描述写的代码没问题packagelearning;classParent{publicintvar=1;publicvoida(){System.out.println("Parent'varis:"+this.var);}publicvoidb(){this.a();}}classChildextendsParent{publicintvar=2;publicvoida(){System.out.println("Child'varis:"+this.var);}}publicclassExtendsTest{publicstaticvoidmain(String[]args){newChild().b();}}

输出为:Child'varis:2

解决方案四:
引用1楼ghx287524027的回复:

多态的问题,多态是针对子类重写父类的方法的,但对变量则没有多态。比如Aa=newB();是创建了一个子类对象并把它当成父类对象A用也就是父类引用指向子类对象此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a只能调用属于A的方法.不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat().这就是多态比如Animala=newTiger();Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先,a是一只老虎.但不幸的是,Animala=newTiger();也就是说a虽然有了老虎的实质,就是说有了老虎的爪子,身材.....,但却没有老虎的名分.它虽然身体是老虎,但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为,但老虎吃肉,动物都吃肉么?所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义.这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时,比如说给a喂吃的,虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法.具体的吃的过程,就相当于程序的运行的阶段.而此时a的类型为运行时的类型-老虎

你说了这么多还是没回答LZ的问题
解决方案五:
引用3楼jsshizhanab的回复:

Quote: 引用1楼ghx287524027的回复:
多态的问题,多态是针对子类重写父类的方法的,但对变量则没有多态。比如Aa=newB();是创建了一个子类对象并把它当成父类对象A用也就是父类引用指向子类对象此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a只能调用属于A的方法.不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat().这就是多态比如Animala=newTiger();Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先,a是一只老虎.但不幸的是,Animala=newTiger();也就是说a虽然有了老虎的实质,就是说有了老虎的爪子,身材.....,但却没有老虎的名分.它虽然身体是老虎,但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为,但老虎吃肉,动物都吃肉么?所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义.这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时,比如说给a喂吃的,虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法.具体的吃的过程,就相当于程序的运行的阶段.而此时a的类型为运行时的类型-老虎

你说了这么多还是没回答LZ的问题

他第一句话就回答了
解决方案六:
引用4楼tianyutaizi的回复:

Quote: 引用3楼jsshizhanab的回复:
Quote: 引用1楼ghx287524027的回复:
多态的问题,多态是针对子类重写父类的方法的,但对变量则没有多态。比如Aa=newB();是创建了一个子类对象并把它当成父类对象A用也就是父类引用指向子类对象此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a只能调用属于A的方法.不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat().这就是多态比如Animala=newTiger();Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先,a是一只老虎.但不幸的是,Animala=newTiger();也就是说a虽然有了老虎的实质,就是说有了老虎的爪子,身材.....,但却没有老虎的名分.它虽然身体是老虎,但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为,但老虎吃肉,动物都吃肉么?所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义.这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时,比如说给a喂吃的,虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法.具体的吃的过程,就相当于程序的运行的阶段.而此时a的类型为运行时的类型-老虎

你说了这么多还是没回答LZ的问题

他第一句话就回答了

哦是哦

时间: 2024-12-03 17:54:24

为什么java的继承,在方法和成员变量两边表现不一样呢的相关文章

【Java】java使用反射访问对象方法和成员变量

虽然java是一门静态语言,但是java的反射机制却给java提供了很强大的动态特性,其特点是能让java支持在运行时才能得知名称与内部结构的类,并能访问其所有的方法和成员变量,包括私有方法和私有成员变量.下面我写了一个比较简洁的测试代码,供参考和使用. 测试类 //OBClass.java package com.obo.javaassistdemo; public class OBClass { public int publicField= 999; private int private

java 中类的静态方法怎么调用成员变量

问题描述 java 中类的静态方法怎么调用成员变量 除了把成员加static修饰 还有别的办法吗 总是在这纠结啦 能说说他们的原理吗 谢谢啦! 解决方案 static是类级别方法 也就是可以 类名.方法调用不加static是实例级别的 也就是必须 先有实例(对象) 才能调用其方法如new A().test()除了把成员加static修饰 还有别的办法吗 可以new个对象再调用解决方案二:static修饰的在加载时是先于非静态的加载,也就是如果在static中如果调用了非静态的方法或变量会报错,因

java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么

问题描述 java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么 java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么 实现现多个接口的类是不是必须重写其所有方法, 解决方案 首先,第一个问题,了解哪些关键词能修饰方法.变量.类比较容易些. 修饰方法的关键字:public/private/protected/default ,static, 修饰变量了:final ,static:修饰类的:public/private/protected/default,static 其次,实

Java中方法的重写与成员变量的隐藏

这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? /**   * @author Hollis 17/9/27.   */  public class FieldOverriding {        public static void main(String[] args) {          Sub c1 = new Sub();          System.

关于JAVA接口中是否包含成员变量的争执,请大家帮忙解答!

问题描述 公司考试的试题中有一道判断题:接口不包含成员变量和方法实现.我选择的而是错,因为接口中可以包含成员变量(其实就是接口常量),但是答案是对的,我与出题人交流时无法达成一致,他的理由是:首先,对于变量和常量做一个澄清.常量就是不可以被改变的数值.变量就是可以被改变的数值.如果模糊一点,也可以都叫做变量. 对于接口中定义的变量,编译器会默认它是常量,不可更改.等同于 final static. 其次,对于接口来说,本身是不不可以被实例化,也不能包含任何可变的数据.您给出的例子是类中的变量,而

Java多继承方法(名)冲突和成员内部类、局部内部类、静态内部类、匿名内部类

Java内部类     ①内部类是在一个java类体内,再定义一个类,即外部类的内部再定义一个类(相对的).      ②内部类分为四类:          成员内部类.局部内部类.静态内部类.匿名内部类      ③内部类作为外部类的一个成员,并依附于外部类而存在.包括:成员内部类.局部内部类.匿名内部类      ④内部类可以由private.public.protected.default访问修饰符和static修饰:      ⑤而外部类,即和public类平行的,只能有default修

java类的问题-java编程,有关类的继承,方法的覆盖等

问题描述 java编程,有关类的继承,方法的覆盖等 类Citizen,拥有identityCardNumber(String).name(String).gender(char).birthPlace(String).birthday(java.util.Date)属性,构造方法Citizen(String identityCardNumber, String name, char gender).Citizen(String identityCardNumber, String name, c

解析Java继承中方法的覆盖和重载_java

方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public c

Java 库的建立方法及其实例

作者 ariesram 电子邮件地址 ariesram@linuxaid.com.cn, 或 ariesram@may10.ca 本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中. 本文授权给www.linuxaid.com.cn. 正文: 任何一种面向对象语言都有它的库.任何一种面向对象的语言也都离不开库的支持.用我们熟悉的 面向对象语言为例子,C++有STL,Java有API函数,具体到开发工具,Visual C++提供了MFC, Borlan