`

java类继承总结一 父类类型与子类类型之间的转化问题(转)

    博客分类:
  • Java
 
阅读更多

java类继承总结一 父类类型与子类类型之间的转化问题 

本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂的java.lang.ArrayStoreException异常。

1. 子类数组的引用可以装换为超类数组的引用

 2. 子类的引用child可以转换为父类的引用parent(这里假设parent是父类对象,child是子类对象),但却不可以通过 parent调用child的特有方法

 

class Employee{
  
protected String name;
  
protected long salary;
  
public Employee(String aName){
    
this.name = aName;
  }

  
  
public void setSalary(long aSalary){
    
this.salary = aSalary;
  }

  
  
public long getSalary(){
    
return this.salary;
  }

}


class Manager extends Employee{
  
protected long bonus;
  
public Manager(String aName){
    
super(aName);
  }

  
  
public void setBonus(long aBonus){
    
this.bonus = aBonus;
  }

  
  
public long getSalary(){
    
return super.getSalary()+this.bonus;
  }

}


public static void main(String[] args) {
    
//注意,这时managers 和employees 引用的是同一个数组
    Manager[] managers = new Manager[10];
    Employee[] employees 
= managers;
    
//(a)注意,下面三条语句是可以通过的,但运行时会抛出异常
    employees[0= new Employee("Abel"); //运行时此处抛出java.lang.ArrayStoreException异常
    managers[0].setSalary(1000);
    managers[
0].setBonus(500);
    
//(b)这样的语句编译和运行都没有问题
    employees[0= new Manager("Abel");
    employees[
0].setSalary(1000);
    managers[
0].setSalary(1000);
    managers[
0].setBonus(500);
}

总结:
1. 在java中,对象变量是多态的,一个employee既可以引用Employee类型的实例,也可以引用子类Manager类型的实例,但一个manager不能引用一个Employee类型的实例,例如:
   (1) Employee e = new Manager("Abel") 是合法的
   (2)Manager   m = new Employee("Abel") 是不合法的
  原因很容易理解,manager与employee是is-a的关系,任何一个manager都是一个emplpyee,如(1)所示,一个Employee类型的引用e可以引用Manager类型的实例,这意味着可以通过e使用Manager中任何继承自Employee的方法(注意,e不能使用Manager的特有方法,如e.setBonus(1000)是不合法的),Employee e = new Manager("Abel")的潜台词就是说,e从Employee的角度描述Manager,e就是一个Employee,不管e引用的是什么,编译器就把它当一个Employee来看。

2. 对于上面(a)的代码,不能运行是可以理解的, employees[0]虽然在声明时是Employee类型,但Employee[] employees = managers;规定了employees[i]指向的必须是Manager类型的实例,因此employees[0] = new Employee("Abel"); 这条语句必然会引发异常。
   (a)处的代码employees[0] = new Employee("Abel");可以通过编译似乎也情有可原,因为employees声明的类型是Employee[], 那么employees[0]自然可以接受一个Employee类型的引用,但实际上

   Employee[] employees = managers;赋值的过程中又规定了employees接受的必须是Manager类型,从上面的例子可以看出,运行的时候会做这样的检查,但编译的时候不会检查的这么深入,只会检查变量的声明类型,看来java编译器还不够智能啊 :)

3. 在实际编程的过程中,使用对象变量的多态性时一定要注意(尤其是使用数组的时候),否则编译通过,但运行报错,这个错误很可能让你调试一个晚上才能找出问题所在!!

分类: Java
分享到:
评论

相关推荐

    Java中父类和子类之间的转换操作示例

    Java 中父类和子类之间的转换操作是面向对象编程(OOP)中一个重要的概念。它允许开发者在不同的类之间进行类型转换,以便更好地实现继承和多态性。在 Java 中,父类和子类之间的转换操作可以分为两种:父类引用强转...

    final修饰符与类型转化

    在Java编程中,`final`修饰符和类型转化是两个重要的概念,它们分别涉及类的继承限制和对象的类型转换。 1. `final`修饰符: - `final`类:当一个类被声明为`final`时,它无法被其他类继承。这通常用于防止他人...

    java类型转换大全

    在Java编程语言中,类型转换是一项基础且重要的概念,它涉及到不同数据类型的相互转化。本资源"java类型转换大全"涵盖了这一主题的广泛知识,旨在帮助开发者深入理解并熟练运用各种转换方法。以下是对该资源内容的...

    java知识点总结

    Java知识点总结 1. 前言 Java作为一种广泛使用的编程语言,因其平台无关性、安全性和稳定性而受到青睐。本资源旨在为初学者和有经验的开发者提供一个全面的Core Java知识概述,帮助大家更好地理解和掌握Java的核心...

    java进公司的面试题,包过

    子类可以继承父类的非私有成员,但不包括构造方法。抽象类和抽象方法是Java中继承的重要组成部分,抽象类不能实例化,只能作为其他类的父类,而抽象方法没有实现,必须由子类完成。 多态是指同一种行为在不同对象上...

    1Java中的多态和类型转换(难点).docx

    1. **父类型的引用可以指向子类型的实例**:这意味着可以通过一个父类类型的引用变量来指向其任何子类的对象。 2. **接口类型的引用可以指向实现该接口的类的实例**:即接口类型的引用变量可以指向任何实现了该接口...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    JAVA获取同一路径下所有子类或接口实现类

    在Java编程中,有时我们需要获取特定路径下所有实现了某个接口或者继承了某个类的子类。这个场景在大型项目中尤为常见,例如进行组件扫描、依赖注入或是单元测试时。在给定的代码示例中,它展示了如何通过Java来实现...

    java复习笔记(期末考试复习).docx

    Java复习笔记(期末考试复习) Java 是一种广泛应用于桌面程序、企业级开发、嵌入式开发的编程语言。下面是 Java 的一些...强制类型转换需要父类和子类之间存在继承关系,且子类拥有比父类更多的属性、更强的功能。

    java培训课程-Java与面向对象.pptx

    继承是"is-a"关系的体现,允许子类继承父类的属性和方法。Java仅支持单继承,即一个类只能直接继承一个父类,但可以通过实现多个接口来获得多继承的效果。在初始化时,子类会先初始化父类的部分,确保了父类的状态...

    java快速学习笔记(已有基础)

    - Java支持单继承,一个子类只能有一个父类。当子类和父类有同名属性或方法时,子类会覆盖父类的同名属性,调用方法时会根据实际对象类型(动态绑定)来决定使用哪个方法。 5. **多态**: - 多态性是面向对象的三...

    Java企业级开发综合技能知识总结

    - 类的执行顺序通常按照继承层次进行,首先执行父类构造器,然后是子类构造器。 12. **内部类的实现方式?** - 成员内部类:定义在一个类内部的类。 - 局部内部类:定义在一个方法内部的类。 - 匿名内部类:没有...

    java基础知识大总结

    3. **基本数据类型间的转换**:在进行如byte、short、char等基本数据类型的运算时,默认会转化为int类型来处理,这意味着这些类型之间无法直接进行转换,而需要通过显式的类型转换来进行。 4. **字符串拼接操作符...

    java OOP教程

    Java面向对象编程(Object-Oriented Programming,简称OOP)是一种强大的编程范式,它将复杂的程序设计问题转化为一系列可重用的对象。本教程旨在帮助新手和经验丰富的程序员深入理解和应用Java OOP概念。 首先,...

    《Java十大经典案例》源代码

    继承允许一个类(子类)继承另一个类(父类)的属性和方法;多态则允许同一种行为在不同对象上有不同的表现形式。 3. 方法:方法是实现功能的代码块,可以被其他部分的代码调用。通过案例,你可以学习如何定义、...

    java教学课件:第一章 Java的类.ppt

    面向对象编程(OOP)是现代软件开发的一种主流方法,它将现实世界的问题转化为可执行的代码。 1. **面向对象的概念**: - **抽象数据类型**:它是一种数据结构,定义了数据类型的属性和操作,而不考虑其实现细节。...

    期中报告1

    在继承方面,C++和Java都允许子类继承父类的属性和方法。然而,C++支持多重继承,即一个子类可以继承多个父类,这可能导致“菱形问题”(当一个类继承两个各自继承自同一父类的类时,可能出现方法名冲突或访问权限不...

    java面向对象程序设计基础知识总结

    继承允许子类继承父类的属性和方法,实现代码复用。Java中的单一继承机制意味着一个类只能直接继承一个父类,但可以实现多个接口。 4. 多态 多态是指同一消息可以根据接收者的不同而表现出不同的行为。在Java中,多...

    JavaOOP上机练习-Chapter2.zip

    继承是另一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以避免代码重复,提高代码复用,并且有助于建立类之间的层次结构。Java中的继承使用extends关键字来实现。 多态是OOP的另一个...

    Java 核心面试题

    自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 方法覆盖和方法重载 Java 中的方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名、参数列表和返回类型。覆盖者...

Global site tag (gtag.js) - Google Analytics