总结java中关于继承中的成员属性和成员方法的多态细节

2023-05-16

问题背景:下面的代码会输出什么?40还是20?

public class Animal {
    public int age=40;
    public void eat(){
        System.out.println("父类中eat方法");
    }
    public void show(){
        System.out.println("父类中的show方法");
    }
}
public class Dog extends Animal {
    public int age=20;
    public int weight=50;
    public void eat(){
        System.out.println("子类重写父类中的eat方法");
    }
}
public class polymorphismDome {
    public static void main(String[] args) {
        Animal animal=new Dog();
        System.out.println(animal.age);
    }
}

先说执行结果是40,why? 

对于成员属性 规则1编译阶段是看左边,运行阶段也是看左边

左右就是构造对象时等号两边((Animal animal=new Dog();))的Animal、Dog,执行看左边输出的就是左边父类中age的值。如果在编译时左边没有age就会在编译阶段报错(也就是规则中的编译看左边),看下面的例子:

public class Animal {
    public void eat(){
        System.out.println("父类中eat方法");
    }
    public void show(){
        System.out.println("父类中的show方法");
    }
}
public class Dog extends Animal {
    public int age=20;
    public int weight=50;
    public void eat(){
        System.out.println("子类重写父类中的eat方法");
    }
}
public class polymorphismDome {
    public static void main(String[] args) {
        Animal animal=new Dog();
        System.out.println(animal.age);
    }
}

这时idea就会报出这样的错误: 无法解析符号 'age'

2.对于非静态成员方法:规则2:编译看左边,执行看右边。

看例子:

public class Animal {
    public void show(){
        System.out.println("父类中的show方法");
    }
}
public class Dog extends Animal {
    public void eat(){
        System.out.println("子类重写父类中的eat方法");
    }
}
public class polymorphismDome {
    public static void main(String[] args) {
        Animal animal=new Dog();
        animal.eat();
    }
}

这个时候再编译阶段就会报错:无法解析符号 'eat'(因为编译阶段看的是左边,左边父类中没有eat方法)

在Animal类中添加eat方法后:

public class Animal {
    public void eat(){
        System.out.println("父类中eat方法");
    }
    public void show(){
        System.out.println("父类中的show方法");
    }
}

输出结果为:子类重写父类中的eat方法
 

 父类和子类中都有eat ,而执行的是右边子类中的eat

那如果左边父类中有eat 方法,而右边子类中没有eat,在执行时会怎么样?会执行错误?不不不,答案是会执行左边父类中的方法

3.对于静态成员方法:编译看左边,运行也看左边

先看代码:

public class Animal {
    public static void speak(){
        System.out.println("父类中的静态方法");//
    }
}
public class Dog extends Animal {
    public static void speak(){
        System.out.println("子类中的静态方法");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal animal=new Dog();
        animal.speak();
    }
}

输出结果为:父类中的静态方法

分析:对于静态方法不存在方法重写这一概念。当子类定义了与父类中static方法同名的方法时,实际上是在子类中定义了一个新的方法,而不是重写父类中的static方法。animal.speak();实际上等价于Animal.speak();在该例子中即使在Dog类中删去speak方法,运行结果也相同,编译也没错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

总结java中关于继承中的成员属性和成员方法的多态细节 的相关文章

  • 如何使用 UnboundID LDAP SDK 获取 LDAP 中的 DN 和用户 ID

    当我唯一的参数是用户 ID 时 我试图获取用户的 DN 可能不止一个 我还使用 UnboundID LDap SDK 如您所见 public String getCustomerAdminDN String uid String resul
  • Java NIO Pipe 与 BlockingQueue

    我刚刚发现它只有一个 NIO 工具 即 Java NIO Pipe 它是为在线程之间传递数据而设计的 与通过队列 例如 ArrayBlockingQueue 传递的更传统的消息相比 使用此机制是否有任何优势 通常 将数据传递给另一个线程进行
  • 文件写入器覆盖文件而不是附加到末尾时出现问题

    好的 我在将多行写入文本文件时遇到一些问题 程序运行 但不会每次都使用新行 当我希望它运行 4 次时 文本文件应如下所示 a b c d 相反 它看起来像 d 谁知道如何解决这个问题 所有导入均正确导入 来源 已稍加编辑 假设一切都已正确定
  • SpringMVC 和 Hibernate:CannotCreateTransactionException:无法打开 Hibernate 会话进行事务;

    我正在尝试设置并Spring MVC 休眠项目 但它让我发疯 我还会考虑订购 xml 配置文件的建议 我有以下文件 web xml
  • Java 扫描仪问题 (JFrame)

    我正在尝试使用扫描仪来编辑塔防游戏的级别 但是 它不会将级别 图块图像 更新为自定义文件的级别 0 是草 1 是石头 1 是什么都没有 等等 我发现了错误 但如何修复它 我需要添加 更改什么才能消除这个错误 java lang NullPo
  • log4j2 SMTP Appender:如何包含另一个级别的先前消息?

    我正在使用 log4j2 beta9 并且有以下配置 其中一部分
  • 通过蓝牙将字符串从作为客户端的 PC 发送到作为服务器的移动设备

    我需要通过蓝牙将字符串从 PC 传输到 Android 移动设备的帮助 Android 移动设备应充当服务器并在设备屏幕上显示字符串消息 作为客户端的 PC 应该将字符串发送到移动设备 我希望服务器对提取的字符串 通过蓝牙传输 做出反应 这
  • 如何通过双击图标来执行JAVA程序?

    我写了一个java程序 现在我想在没有 IDE Eclipse 等的情况下打开我的控制台 java 应用程序 只需双击桌面上的可执行版本即可 我已将 java 项目导出为 Runnable JAR 文件 但无法打开 当我尝试使用cmd打开应
  • Jersey 客户端异步 POST 请求不等待响应

    我创建了一个简单的 Jersey 客户端 它能够成功地使用有效负载执行 POST 请求 但现在它正在等待来自 http 端点的响应 public void callEndpoint String endpoint String payloa
  • 转换为 JSON 后保留 XMLGregorianCalendar 日期格式 - Jackson Lib

    我有一个对象 它有 2 个 XMLGregorianCalendar 对象 一个用于日期 另一个用于时间 我使用 Jackson 对象映射器将日期转换为 JSON 格式 转换前的日期为2014年2月10日 时间为11 15 00 转换为 J
  • 原型 Bean 未按预期自动装配

    测试控制器 java RestController public class TestController Autowired private TestClass testClass RequestMapping value test me
  • 我在 Android Studio 中使用哪个版本的 JDK 有关系吗?

    I know I can choose the SDK location in Android Studio s Project Structure 我有两个问题 当我们已经使用Android SDK时 为什么还需要JDK 毕竟我们不是为
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 如何用Java捕获音频数据

    我想访问我的麦克风用 Java 录制的音频数据 我该怎么做呢 我的目标是保存录制的音频数据并同时向用户播放 如果您不需要 JMF 中的任何附加功能 我会避免使用它 因为开发已经停止 最后一个版本是 2004 年 它与 Java 6 存在兼容
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

    我正在寻找一个适用于在 JDK 1 4 下运行的 Java SE Swing 应用程序的依赖注入框架 有没有我可以使用的推荐 DI 框架 Guice 和其他基于注释的框架已经退出 我不想搞乱像 Retroweaver 这样的东西 另外 Sp
  • 使用 Swift 在 iOS 和 Android 之间共享核心代码

    我想要的是 使用 Swift 在 Android 和 iOS 之间共享非 UI 代码 问题 Android 具有 NDK 支持 允许您使用 Java 本机接口 JNI 运行 C 和 C 代码 不是 Objective C 我是一名Java程
  • 如何从项目文件夹中的 jlabel 上设置图像?

    我正在尝试制作一个 Java 桌面应用程序 我想设置一个图像JLabel 我正在使用 NetBeans 从我的项目文件夹中 我的目录结构是 F gt MARKET src lib src defaultpackage demo java i
  • 将菜单添加到空活动

    我在 Android Studio 中制作了一个 Android 应用程序 并想在其上创建一个选项菜单 我将其创建为一个空活动 现在意识到我最好创建一个空白活动来获取选项菜单 无论如何 是否可以在空活动中创建选项菜单 如果有人能给我指出一个

随机推荐

  • web 前端的浏览器

    1 浏览器及内核 web浏览器是用于读取HTML文件 xff0c 并将其作为网页显示 浏览器最重要的部分或其核心是渲染引擎 xff0c 我们一般称为内核 xff1b 内核的作用负责对网页语法的解释并渲染网页 xff1b 五大浏览器 xff1
  • C++的第一个代码“Hello World!”

    代码展示 include lt iostream gt include lt cstdio gt using namespace std int main printf 34 Hello World n 34 printf 34 1 Def
  • C.刷oj1026有感

    1 if嵌套 if 条件1 语句1 if 条件2 语句2 if 条件3 语句3 语句4 诸如这样嵌套 xff0c 要先判断条件1是否成立 xff0c 如果成立 xff0c 执行语句1 xff0c 再继续下面操作 如果条件1不成立 xff0c
  • C.刷oj1037有感

    不能判断浮点数相等或不相等 xff01 因为浮点数是对实数的近似表达 如 double y if y 61 61 0 这样是错的 xff01 1 判断浮点数是否为0的方法 fabs y lt 1e 10 2 判断两个浮点数是否相等的方法 f
  • 逻辑或、与运算的短路

    假定i 61 5 j 61 5 i 43 43 xff1c xff1d 5 j 43 43 xff1c xff1d 5 首先这个表达式的结果为1 真 xff0c 但执行完这个表达式后i的值为6 xff0c j的值不变 xff0c 为5 xf
  • LED点阵-第1季第8部分-朱有鹏-专题视频课程

    LED点阵 第1季第8部分 1818人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第8个课程 xff0c 讲解了16 16LED点阵的驱动方式和文字显示 本课程的学习目标是理解点阵式LED屏幕的驱动方式 74HC59
  • C语言声明变量时的小细节

    声明变量时不能连续赋值 xff0c 例如 int a 61 b 61 0 这样编译器会报错 xff1a b没有声明 可以在声明变量时给一个变量赋值 int a 61 0 int a b c d 61 0 或 int a b c 61 0 d
  • C.for循中表达式的省略

    省略第一个表达式 for 表达式2 表达式3 注意第一个分号不能省 xff01 xff01 xff01 省略第二个表达式 for 表达式1 表达式3 死循环 省略第三个 for 表达式1 表达式2 最后的表达式的分号就不要了 可以在循环体内
  • C语言新收获

    if x 语句3 表达式是变量 xff0c 如果x不等于0 xff0c 则条件判断结果为真 xff0c 执行语句3 if 1 语句4 表达式是非0整数 条件判断结果为真 xff0c 执行语句4 if 0 语句5 表达式是整数0 xff0c
  • C语言新收获

    若a 61 3 xff0c b 61 2 xff0c c 61 1 xff0c 则 d 61 a gt b xff0c 由于a gt b为真 xff0c 因此关系表达式a gt b的值为1 xff0c 所以赋值后d的值为1 f 61 a g
  • C语言swith语句小细节

    1 swtich 中的 里的数据只能为整形或字符型 xff0c 不能为浮点型 xff01 2 swith x xff5b case 1 语句1 case 2 xff1a 语句2 case 3 语句3 xff1b break case 4 语
  • switch语句每个csse后面可以跟多个值吗

    如果今天是星期三 xff0c 后天就是星期五 xff1b 如果今天是星期六 xff0c 后天就是星期一 我们用数字1到7对应星期一到星期日 给定某一天 xff0c 请你输出那天的 后天 是星期几 输入格式 xff1a 输入第一行给出一个正整
  • c学习笔记

    指针之间可以比较大小 xff0c 前提是两个指针指向同一数组 如 char a 20 xff1b char p1 61 a 43 1 char p2 61 a 43 2 则p2 gt p1
  • zzulioj1150

    数数多少个整数 题目描述 小明的老师给小明出了一道题目 xff1a 数数一篇文章出现了多少个数字 xff0c 请你帮帮他吧 输入 输入一个字符串 xff0c 由空格 英文字母 数字组成 xff0c 以回车结束 xff0c 长度小于1000
  • 1152: 二分搜索

    题目描述 在有序序列中查找某一元素x 输入 首先输入一个正整数n n lt 61 100000 xff0c 表示该序列有n个整数 xff0c 然后按从小到大的顺序输入n个整数 xff1b 接着是一个正整数m xff0c 表示有m次查找 xf
  • C语言反思提醒自己

    例如 xff1a char fun char p char s 101 return s 这样将不能正确返回字符串s xff0c 因为在离开fun 函数后该内存空间将不再存在 xff0c 应该使用malloc函数申请内存 xff0c 该函数
  • 按键-第1季第9部分-朱有鹏-专题视频课程

    按键 第1季第9部分 1716人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第9个课程 xff0c 综合解决了独立按键和矩阵式按键的处理方法 xff0c 涉及到 xff1a IO的输入输出 按键抖动和消抖 中断的引入
  • C语言反思提醒自己

    int a scanf 34 d 34 amp a 当键入07时 xff0c a中存的是7 xff0c 自动舍弃前导0
  • zzulioj1168(账单)

    题目描述 每到月末 xff0c 小明就会对这个月的支出账单进行整理和统计 如今电脑已经普及大学校园 xff0c 所以小明想让电脑帮忙做这件事情 聪明的你就为小明编一个程序来完成这件事情吧 输入 多实例测试 首先输入一个整数ncase xff
  • 总结java中关于继承中的成员属性和成员方法的多态细节

    问题背景 xff1a 下面的代码会输出什么 xff1f 40还是20 xff1f public class Animal public int age 61 40 public void eat System out println 34