博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java核心(八):继承与方法重写、final、多态性的两种描述形式
阅读量:7062 次
发布时间:2019-06-28

本文共 2745 字,大约阅读时间需要 9 分钟。

一、继承的作用

  1. 子类继承父类的属性和方法,实现代码的复用;
  2. 子类扩充自己的标准,实现精细化的类型定义。

二、子类构造方法的限制

  1. 子类在实例化的时候,默认先实例化父类对象,然后再实例化本类对象;
  2. 子类构造方法默认调用父类的无参构造方法;
  3. 如果父类没有无参构造方法,子类的构造方法需要明确指定调用的父类构造方法。

三、方法的重写

  1. 子类重写方法限制:方法名、参数类型、参数个数,必须和父类方法完全一致;
  2. 被子类重写的方法不能拥有比父类更为严格的访问控制权限(如父类方法为public,则子类重写方法也必须为public;如父类方法为protected,则子类重写方法只能为public或protected);
  3. 重写方法的返回值类型,可以是父类原方法的返回类型的子类(比如,父类方法返回Object,子类重写方法可以返回String)(但是,建议不要修改方法的返回值类型)

四、final关键字的约束限制

  1. 使用final修饰的类,不能被继承;
  2. 使用final修饰的方法,不能被子类重写(为保护父类关键代码,不被子类修改);
  3. public static final修饰的属性,属于全局常量,全局常量在内存中存储在公共区;
  4. final修饰的属性,一般使用全大写,单词间可通过下划线区分;
  5. final修饰的属性,在定义时必须设置初始值,而且值赋值后不能再被改变。

五、多态性的两种描述形式

  1、方法的多态性

  • 方法的重载:同一个类中,相同方法名称,根据传入参数类型、参数个数不同,来实现不同的逻辑处理;
  • 方法的重写:继承关系中,子类重写父类的方法,根据子类的不同,实现不同的逻辑处理;

  2、对象的多态性

  • 向上转型(自动完成):父类  父类对象 = 子类实例;
  • 向下转型(强制完成):子类  子类对象 = (子类)父类实例;

六、分析:向上转型、向下转型

  1、对于对象的转型,给出以下的经验总结

  • 80%的情况下,只会使用向上转型。因为可以得到参数类型的统一,方便进行传参和数据处理;
  • 5%的情况下,会使用向下转型。目的是向下转型后,调用子类的特殊方法;
  • 15的情况下,不实用转型,直接使用本类对象进行操作。
  • 个性化的操作在一个标准的开发之中应该尽量少出现,因为对象的转型操作里面毕竟有了强制问题,容易带来安全隐患。

  2、向上转型的目的:可以得到参数类型的统一,方便进行传参和数据处理

package com.study.override;/** * 父类:水果类 */public  class Fruit {    public String getInfo(){        return "Fruit *************";    }}/** *  苹果类 */class Apple extends Fruit{    @Override    public String getInfo() { return "Apple *************"; } } /** * 橘子类 */ class Orange extends Fruit{ @Override public String getInfo() { return "Orange *************"; } } class Test3{ public static void main(String[] args) { Fruit f1 = new Apple(); Fruit f2 = new Orange(); getFruit(f1);    //Apple *************      getFruit(f2);    //Orange *************
}    /**     * 接受统一的参数类型:Fruit     * @param fruit     */    public static void getFruit(Fruit fruit){        System.out.println(fruit.getInfo());;    }}

  3、向下转型的目的:调用子类的特殊方法

  • 只有对象发生了向上转型之后,才能成功的向下转型
package com.study.override;/** * 父类:水果类 */public  class Fruit {    public void getInfo(){        System.out.println("Fruit *************");    }}/** *  子类:苹果类 */class Apple extends Fruit{    @Override    public void getInfo() { System.out.println("Apple *************"); } } /**  * 子类:橘子类  */ class Orange extends Fruit{ } class Test3{ public static void main(String[] args) { Fruit f1 = new Apple(); // 自动进行了向上转型 System.out.println(f1 instanceof Fruit); // true System.out.println(f1 instanceof Apple); // true System.out.println(f1 instanceof Orange); // false //向下转型 Apple a1 = (Apple)f1; a1.getInfo(); //Apple *************  Fruit f2 = new Fruit(); System.out.println(f2 instanceof Fruit); // true System.out.println(f2 instanceof Apple); // false System.out.println(f2 instanceof Orange); // false //向下转型失败 //java.lang.ClassCastException: com.study.override.Fruit cannot be cast to com.study.override.Apple Apple a2 = (Apple)f2; a2.getInfo(); } }

 

  

 

转载于:https://www.cnblogs.com/newbie27/p/10495263.html

你可能感兴趣的文章
centos7 xfs 文件系统配置quota 用户磁盘配额
查看>>
2019-1-5吃货联盟作业
查看>>
poj 1836 -- Alignment
查看>>
C#语言struct结构体适用场景和注意事项
查看>>
蓝桥杯 日期问题(枚举)
查看>>
如何为网站更新有价值的内容?
查看>>
XPsp3键盘设备链/栈信息_01_Code
查看>>
laravel报错1071 Specified key was too long; max key length is 1000 bytes
查看>>
12.scrapy框架之递归解析和post请求
查看>>
批量处理数据 SqlBulkCopy
查看>>
C#创建datatable
查看>>
赏心悦目的风景一
查看>>
iOS-学习路线图(推荐)
查看>>
mysql存储过程
查看>>
关于三角形的一个不等式
查看>>
对软件工程课程的期望
查看>>
01 面向对象之:初识
查看>>
如何实现伸缩(折叠)报表?
查看>>
浏览器定位是如何实现的?为什么会有浏览器定位失败的情况?
查看>>
安卓中自定义并使用Volley框架请求网络
查看>>