java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...

一、继承的作用

子类继承父类的属性和方法,实现代码的复用;

子类扩充自己的标准,实现精细化的类型定义。

二、子类构造方法的限制

子类在实例化的时候,默认先实例化父类对象,然后再实例化本类对象;

子类构造方法默认调用父类的无参构造方法;

如果父类没有无参构造方法,子类的构造方法需要明确指定调用的父类构造方法。

三、方法的重写

子类重写方法限制:方法名、参数类型、参数个数,必须和父类方法完全一致;

被子类重写的方法不能拥有比父类更为严格的访问控制权限(如父类方法为public,则子类重写方法也必须为public;如父类方法为protected,则子类重写方法只能为public或protected);

重写方法的返回值类型,可以是父类原方法的返回类型的子类(比如,父类方法返回Object,子类重写方法可以返回String)(但是,建议不要修改方法的返回值类型);

四、final关键字的约束限制

使用final修饰的类,不能被继承;

使用final修饰的方法,不能被子类重写(为保护父类关键代码,不被子类修改);

public static final修饰的属性,属于全局常量,全局常量在内存中存储在公共区;

final修饰的属性,一般使用全大写,单词间可通过下划线区分;

final修饰的属性,在定义时必须设置初始值,而且值赋值后不能再被改变。

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

1、方法的多态性

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

方法的重写:继承关系中,子类重写父类的方法,根据子类的不同,实现不同的逻辑处理;

2、对象的多态性

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

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

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

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

80%的情况下,只会使用向上转型。因为可以得到参数类型的统一,方便进行传参和数据处理;

5%的情况下,会使用向下转型。目的是向下转型后,调用子类的特殊方法;

15的情况下,不实用转型,直接使用本类对象进行操作。

个性化的操作在一个标准的开发之中应该尽量少出现,因为对象的转型操作里面毕竟有了强制问题,容易带来安全隐患。

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

packagecom.study.override;

/**

* 父类:水果类

*/

public classFruit {

publicString getInfo(){

return "Fruit *************";

}

}

/**

* 苹果类

*/

class Apple extendsFruit{

@Override

publicString getInfo() {

return "Apple *************";

}

}

/**

* 橘子类

*/

class Orange extendsFruit{

@Override

publicString getInfo() {

return "Orange *************";

}

}

classTest3{

public static voidmain(String[] args) {

Fruit f1 = newApple();

Fruit f2 = newOrange();

getFruit(f1);    //Apple *************

getFruit(f2);    //Orange *************

}

/**

* 接受统一的参数类型:Fruit

* @param fruit

*/

public static voidgetFruit(Fruit fruit){

System.out.println(fruit.getInfo());;

}

}

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

只有对象发生了向上转型之后,才能成功的向下转型

packagecom.study.override;

/**

* 父类:水果类

*/

public classFruit {

public voidgetInfo(){

System.out.println("Fruit *************");

}

}

/**

* 子类:苹果类

*/

class Apple extendsFruit{

@Override

public voidgetInfo() {

System.out.println("Apple *************");

}

}

/**

* 子类:橘子类

*/

class Orange extendsFruit{

}

classTest3{

public static voidmain(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 = newFruit();

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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值