向上造型有点晕,求大神形象的帮我解答一下 学Java一个半月了,老师讲课速度也是挺快的,一直感觉能听懂,但是到了自己写的时候没有一点思路,不知道为什么,面向对象学的时候挺晕的,不过慢慢用着也能理解的,向尚造型还是有点搞不懂。现在在学SE这块的感觉要记得语法好多,有点混乱,大神能不能给点建议,怎样更好更有效的掌握所学到的东西 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 老生常谈向上造型,即是向更泛的类型转换,这是自动的,因为子类的对象一定是父类的对象:一个“苹果”一定是一个“水果”,一个“水果”一定是一种“食物”所以以下代码合理的:水果 obj1 = new 苹果();食物 obj2 = new 苹果();向下造型(也就是向更精确的类型转换)是可能的,但可能会失败,因为父类类型的一个对象可能是它的子类类型的对象,也可能是另外一个子类类型的对象。这时要进行显式的类型转换,当转换失败时会抛出类型转换失败异常:一个“水果”可能是一个“苹果”,但也可能是桔子所以:水果 obj1 = new 苹果(); // 向上转型,是自动的......苹果 obj2 = (苹果)obj1; // 向下转型,要进行类型转换桔子 obj3 = (桔子)obj1; // 向下转型,要进行类型转换,但 obj1 本来是苹果不是桔子,所以把它转换为桔子时会抛出 ClassCastException 异常最后,兄弟及相关兄弟类型之间转换是肯定不行的,虽然它们有共同的父类一个“红富士”是一个苹果,但它永远不可能成为“桔子”,所以这种转型编译时就直接告诉你失败:桔子 obj = new 红富士();明白?? 与结构化程序设计语言相比,面向对象让人使用更接近于人类社会的方式思考软件开发中的需求问题初次接触面向对象的人,容易产生一个误解:继承能够让人少写很多代码。这种认识是错误的,软件工程师在设计它的程序时也千万不要抱着这个目的而进行继承。其实继承是为了增强程序的灵活性,一个显著的用法就是,在你的方法中,接受泛类型比接受精确类型更具有灵活性:把一些类型组成继承关系树:主食、面食、面条、担担面、兰州拉面、包子、小笼包、杭州小笼包、面包、大米食物、大米饭、米粉、常德米粉、常德牛肉米粉如果你的模型中有一个方法:public void eat(主食); 会比 public void eat(面食)更加灵活对接口的理解你可以把接口理解为一个功能的提供者和功能的使用者之间制订的规范。功能的提供者只关系接口规范,不关心谁来使用这些功能;功能的使用者也只关心接口中提供的功能,不关心谁提供的服务,从而使模块之间达到松散的耦合,增强灵活性。比如中国民用电规范,可以认为这是一个接口:220V、50Hz、正弦交流电功能的提供者根据这个规范供电,供应方可以是核电站、水电站、风力发电、柴油发电机功能的使用者是家里的电脑、冰箱、电视双方都只关注于接口,不关注对方的具体类型在JAVA中,你会发现 java.sql 包中对数据库的访问类型基本上全部都是接口。这就是制订了一个数据库和应用程序之间的访问规范,无论哪一种数据库驱动(也就是提供者),全部使用相同的JDBC API向应用程序提供数据库访问服务。 本地文件的URI形式 面试官这样问我 java怎么实习类似搜索提示的东西 java网络图片传输的问题 for 循环 效率 问题 找学JSP的好书 初学者问题:怎样配置java环境? 读文件写字符串的问题,解决给分 怎么散分 java中字符截取的问题!(在线等待) JAVA IO流关闭后报错 CCF考试真题
一个“苹果”一定是一个“水果”,一个“水果”一定是一种“食物”
所以以下代码合理的:
水果 obj1 = new 苹果();
食物 obj2 = new 苹果();向下造型(也就是向更精确的类型转换)是可能的,但可能会失败,因为父类类型的一个对象可能是它的子类类型的对象,也可能是另外一个子类类型的对象。这时要进行显式的类型转换,当转换失败时会抛出类型转换失败异常:
一个“水果”可能是一个“苹果”,但也可能是桔子
所以:
水果 obj1 = new 苹果(); // 向上转型,是自动的
......
苹果 obj2 = (苹果)obj1; // 向下转型,要进行类型转换
桔子 obj3 = (桔子)obj1; // 向下转型,要进行类型转换,但 obj1 本来是苹果不是桔子,所以把它转换为桔子时会抛出 ClassCastException 异常最后,兄弟及相关兄弟类型之间转换是肯定不行的,虽然它们有共同的父类
一个“红富士”是一个苹果,但它永远不可能成为“桔子”,所以这种转型编译时就直接告诉你失败:
桔子 obj = new 红富士();明白??
这种认识是错误的,软件工程师在设计它的程序时也千万不要抱着这个目的而进行继承。
其实继承是为了增强程序的灵活性,一个显著的用法就是,在你的方法中,接受泛类型比接受精确类型更具有灵活性:
把一些类型组成继承关系树:主食、面食、面条、担担面、兰州拉面、包子、小笼包、杭州小笼包、面包、大米食物、大米饭、米粉、常德米粉、常德牛肉米粉
如果你的模型中有一个方法:public void eat(主食); 会比 public void eat(面食)更加灵活
对接口的理解
你可以把接口理解为一个功能的提供者和功能的使用者之间制订的规范。功能的提供者只关系接口规范,不关心谁来使用这些功能;功能的使用者也只关心接口中提供的功能,不关心谁提供的服务,从而使模块之间达到松散的耦合,增强灵活性。
比如中国民用电规范,可以认为这是一个接口:220V、50Hz、正弦交流电
功能的提供者根据这个规范供电,供应方可以是核电站、水电站、风力发电、柴油发电机
功能的使用者是家里的电脑、冰箱、电视
双方都只关注于接口,不关注对方的具体类型
在JAVA中,你会发现 java.sql 包中对数据库的访问类型基本上全部都是接口。这就是制订了一个数据库和应用程序之间的访问规范,无论哪一种数据库驱动(也就是提供者),全部使用相同的JDBC API向应用程序提供数据库访问服务。