- 浏览: 654834 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (170)
- Android (10)
- Java (35)
- PHP (3)
- Linux (3)
- Powerdesigner (2)
- dedcms (1)
- nginx (1)
- Flex (9)
- REST (2)
- Google App Engine (1)
- mysql (6)
- JAVA开源项目 (1)
- Eclipse (18)
- Eclipse Orion (1)
- Dojo (2)
- UML (1)
- Eclipse GEF EMF (4)
- Eclipse 插件开发 (6)
- OSGI (2)
- DeDeCMS (1)
- Maqetta (2)
- JavaScript (1)
- nginx php (1)
- Dojo V1.7 (2)
- Spring3 (4)
- Hibernate3 (4)
- MongoDB (3)
- Scala (2)
- DSL (1)
- Python (3)
- Maven (1)
- Tomcat (3)
- XMPP (2)
- Apache (4)
- NodeJS (1)
- SQLSERVER (2)
- HTML5 (1)
- Nexus (1)
- web服务器 (2)
- Jetty (2)
- weixin (1)
- ngrok (1)
- 网络与信息安全 (1)
最新评论
-
wangyudong:
配置有点晕,开源社区上找了一个开源的Holer,只需要设置Ac ...
用ngrok实现外网访问本地WEB项目的方法 -
lolo968:
你收集的资料没有链接
基于OSGI的框架开发小结(转) -
smartdog:
使用的maven的版本很老的,而且写的不是很清楚,建议可以参考 ...
Maven多项目依赖配置 -
Tom.X:
OSGi联盟官网:http://osgia.com
基于OSGI的框架开发小结(转) -
Miller003:
你好,我在本地测试时,删除catalina.jar和tomca ...
基于Tomcat7的HTML5 WebSocket 应用示例
java类继承总结一 父类类型与子类类型之间的转化问题
本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂的java.lang.ArrayStoreException异常。
1. 子类数组的引用可以装换为超类数组的引用
2. 子类的引用child可以转换为父类的引用parent(这里假设parent是父类对象,child是子类对象),但却不可以通过 parent调用child的特有方法
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. 在实际编程的过程中,使用对象变量的多态性时一定要注意(尤其是使用数组的时候),否则编译通过,但运行报错,这个错误很可能让你调试一个晚上才能找出问题所在!!
发表评论
-
JVM系列三:JVM参数设置、分析(转)
2014-09-28 15:04 1078不管是YGC还是Full GC,GC过程中都会对导致程序运 ... -
Java中static、final用法小结 (转)
2012-08-26 10:51 1972一、final 1.final变量: ... -
java位操作符总结(转)
2012-08-17 11:16 1279以下是java位操作符的小总结,具体如下:二进制负数以它 ... -
Servlet生命周期与工作原理(转)
2012-08-14 16:57 1047Servlet生命周期与工作原理 Servle ... -
java堆与栈 java String分配内存空间(详解)转
2012-08-10 15:44 1284栈内存 堆内存 ... -
java堆和栈小结(转)
2012-08-05 21:45 1053(1)JAVA中基本数据类型直 ... -
Java常见异常(Runtime Exception )小结--转
2012-08-02 21:04 1337Java常见异常(Runtime Exception ) ... -
java.lang.NoClassDefFoundError: org.objectweb.asm.Type
2012-06-03 15:27 2468在使用spring3的aop时,出现如下的错误: ja ... -
Bean named '*' must be of type [*], but was actually of type [$Proxy16]
2012-06-03 14:14 28332在用junit测试dao接口时,出现以下的错误 Caused ... -
saveOrUpdate is not valid without active transaction
2012-06-03 13:07 6850在使用Spring+Hibernate的框架时,在applic ... -
spring BeanCreationException confusion about mapping
2012-05-31 20:08 1372在进行spring3+rest配置时,出现了以下的错误: C ... -
如何获取新浪微博的登录参数
2012-05-23 20:32 77151、用Chrome的开发者工具或者Firefox的Firebu ... -
Java 程序中使用相对和绝对路径读取文件
2012-05-21 14:24 9150在Java中用File对象来创建文件时,绝对路径一般是不会出现 ... -
线程安全与线程不安全
2012-04-26 16:43 1218线程安全是针对多线程来讲的,如果所使用的公用变量在多线程 ... -
StringBuilder、StringBuffer和String的关系
2012-04-26 16:33 10051. String 类 S ... -
插件开发中如何正确使用第三方jar包
2012-04-21 20:48 2469在进行eclipse插件开发过程中,除了引用Eclipse本身 ... -
Errors running builder 'JavaScript Validator' on project '......'.
2012-04-21 20:36 31322在编译java工程时,如果出现 “Errors occu ... -
The method *** of type *** must override a superclass method
2012-04-21 20:34 1350如果在实现接口时,出现了“The metho *** o ... -
Java 1.6动态编译器 null问题
2012-03-16 10:45 15591、在java程序中用JavaCompiler compile ... -
在线Base64编码
2012-03-13 09:22 1811最近需要使用icon转换成base64编码,搜寻到一下网站: ...
相关推荐
Java 中父类和子类之间的转换操作是面向对象编程(OOP)中一个重要的概念。它允许开发者在不同的类之间进行类型转换,以便更好地实现继承和多态性。在 Java 中,父类和子类之间的转换操作可以分为两种:父类引用强转...
在Java编程中,`final`修饰符和类型转化是两个重要的概念,它们分别涉及类的继承限制和对象的类型转换。 1. `final`修饰符: - `final`类:当一个类被声明为`final`时,它无法被其他类继承。这通常用于防止他人...
在Java编程语言中,类型转换是一项基础且重要的概念,它涉及到不同数据类型的相互转化。本资源"java类型转换大全"涵盖了这一主题的广泛知识,旨在帮助开发者深入理解并熟练运用各种转换方法。以下是对该资源内容的...
Java知识点总结 1. 前言 Java作为一种广泛使用的编程语言,因其平台无关性、安全性和稳定性而受到青睐。本资源旨在为初学者和有经验的开发者提供一个全面的Core Java知识概述,帮助大家更好地理解和掌握Java的核心...
子类可以继承父类的非私有成员,但不包括构造方法。抽象类和抽象方法是Java中继承的重要组成部分,抽象类不能实例化,只能作为其他类的父类,而抽象方法没有实现,必须由子类完成。 多态是指同一种行为在不同对象上...
1. **父类型的引用可以指向子类型的实例**:这意味着可以通过一个父类类型的引用变量来指向其任何子类的对象。 2. **接口类型的引用可以指向实现该接口的类的实例**:即接口类型的引用变量可以指向任何实现了该接口...
Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...
在Java编程中,有时我们需要获取特定路径下所有实现了某个接口或者继承了某个类的子类。这个场景在大型项目中尤为常见,例如进行组件扫描、依赖注入或是单元测试时。在给定的代码示例中,它展示了如何通过Java来实现...
Java复习笔记(期末考试复习) Java 是一种广泛应用于桌面程序、企业级开发、嵌入式开发的编程语言。下面是 Java 的一些...强制类型转换需要父类和子类之间存在继承关系,且子类拥有比父类更多的属性、更强的功能。
继承是"is-a"关系的体现,允许子类继承父类的属性和方法。Java仅支持单继承,即一个类只能直接继承一个父类,但可以通过实现多个接口来获得多继承的效果。在初始化时,子类会先初始化父类的部分,确保了父类的状态...
- Java支持单继承,一个子类只能有一个父类。当子类和父类有同名属性或方法时,子类会覆盖父类的同名属性,调用方法时会根据实际对象类型(动态绑定)来决定使用哪个方法。 5. **多态**: - 多态性是面向对象的三...
- 类的执行顺序通常按照继承层次进行,首先执行父类构造器,然后是子类构造器。 12. **内部类的实现方式?** - 成员内部类:定义在一个类内部的类。 - 局部内部类:定义在一个方法内部的类。 - 匿名内部类:没有...
3. **基本数据类型间的转换**:在进行如byte、short、char等基本数据类型的运算时,默认会转化为int类型来处理,这意味着这些类型之间无法直接进行转换,而需要通过显式的类型转换来进行。 4. **字符串拼接操作符...
Java面向对象编程(Object-Oriented Programming,简称OOP)是一种强大的编程范式,它将复杂的程序设计问题转化为一系列可重用的对象。本教程旨在帮助新手和经验丰富的程序员深入理解和应用Java OOP概念。 首先,...
继承允许一个类(子类)继承另一个类(父类)的属性和方法;多态则允许同一种行为在不同对象上有不同的表现形式。 3. 方法:方法是实现功能的代码块,可以被其他部分的代码调用。通过案例,你可以学习如何定义、...
面向对象编程(OOP)是现代软件开发的一种主流方法,它将现实世界的问题转化为可执行的代码。 1. **面向对象的概念**: - **抽象数据类型**:它是一种数据结构,定义了数据类型的属性和操作,而不考虑其实现细节。...
在继承方面,C++和Java都允许子类继承父类的属性和方法。然而,C++支持多重继承,即一个子类可以继承多个父类,这可能导致“菱形问题”(当一个类继承两个各自继承自同一父类的类时,可能出现方法名冲突或访问权限不...
继承允许子类继承父类的属性和方法,实现代码复用。Java中的单一继承机制意味着一个类只能直接继承一个父类,但可以实现多个接口。 4. 多态 多态是指同一消息可以根据接收者的不同而表现出不同的行为。在Java中,多...
继承是另一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以避免代码重复,提高代码复用,并且有助于建立类之间的层次结构。Java中的继承使用extends关键字来实现。 多态是OOP的另一个...
自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 方法覆盖和方法重载 Java 中的方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名、参数列表和返回类型。覆盖者...