JavaSE-10 【多态】
第一章 多态
1.1 多态的概述
1、多态是继封装、继承之后,面向对象编程的第三大特性 2、 现实中的事物通常会体现出多种形态 ,就是一个事物多种形态 3、 多态表现为父类引用变量可以指向子类对象 ,前提条件为必须存在继承关系并且要有方法的重写
1.2 多态的格式和使用
格式:
父类类型 变量名称 = new 子类类名(); 接口名称 变量名称 = new 实现类名();
public class SuperClass {
public void method1 ( ) {
System . out. println ( "父类的成员方法" ) ;
}
public void method2 ( ) {
System . out. println ( "父类特有,子类没有" ) ;
}
}
public class SubClass extends SuperClass {
@Override
public void method1 ( ) {
System . out. println ( "子类重写的父类的方法" ) ;
}
}
public class TestPolymorphic {
public static void main ( String [ ] args) {
SuperClass superClass = new SubClass ( ) ;
superClass. method1 ( ) ;
superClass. method2 ( ) ;
}
}
1.3 多态中成员变量的使用
多态访问成员变量:编译运行全部看等号左边
1、直接通过对象名称访问成员变量 2、通过成员方法获取变量
public class Father {
int num = 200 ;
public void getVariable ( ) {
System . out. println ( num) ;
}
}
public class Son extends Father {
int num = 100 ;
}
public class TestVariable {
public static void main ( String [ ] args) {
Father father = new Son ( ) ;
System . out. println ( father. num) ;
System . out. println ( "----------------------" ) ;
Father father1 = new Son ( ) ;
father. getVariable ( ) ;
}
}
1.4 多态中成员方法的使用
多态访问成员方法:编译时看左边,运行时看右边,子类没有,再向上找
public class Father {
int num = 10 ;
public void smoking ( ) {
System . out. println ( "父类特有的方法" ) ;
}
public void showNum ( ) {
System . out. println ( "父类的成员变量是:" + num) ;
}
}
public class Son extends Father {
int num = 20 ;
public void code ( ) {
System . out. println ( "儿子在写代码" ) ;
}
@Override
public void showNum ( ) {
System . out. println ( "儿子的成员变量是:" + num) ;
}
}
public class TestMethod {
public static void main ( String [ ] args) {
Father father = new Son ( ) ;
father. smoking ( ) ;
father. showNum ( ) ;
}
}
1.5 使用多态的优点
1、提高了代码的可维护性,提高了代码的扩展性 2、 可以当做形式参数,可以接受任意子类对象
第二章 对象类型转换
2.1 对象的向上转型
定义:创建一个子类对象,把它当做父类对象来使用 格式:父类名称 对象名称 = new 子类名称(); 从小范围转换成更大范围,向上转型是安全的
2.2 对象的向下转型
定义:基于向上造型的前提下,将父类对象还原成本身的子类对象 格式:子类类型 对象名称 = (子类类型) 父类对象名称; 从大范围转换成小范围,向下造型不安全
public abstract class Animal {
public abstract void eat ( ) ;
}
public class Cat extends Animal {
@Override
public void eat ( ) {
System . out. println ( "猫吃老鼠" ) ;
}
public void snoring ( ) {
System . out. println ( "猫睡觉打呼噜" ) ;
}
}
public class TestDemo {
public static void main ( String [ ] args) {
Animal animal = new Cat ( ) ;
animal. eat ( ) ;
Cat cat = ( Cat ) animal;
cat. snoring ( ) ;
}
}
2.3 instanceof的用法
作用:判断父类引用指向的子类对象的类型 格式:对象名 instanceof 类型 注意:结果是一个boolean值,判断等号左边的对象是否可以作为后面对象类型的一个实例
public abstract class Animal {
public abstract void eat ( ) ;
}
public class Cat extends Animal {
@Override
public void eat ( ) {
System . out. println ( "猫咪爱吃鱼" ) ;
}
}
public class Dog extends Animal {
@Override
public void eat ( ) {
System . out. println ( "大黄狗吃骨头" ) ;
}
}
public class TestInstanceof {
public static void main ( String [ ] args) {
Animal animal = new Cat ( ) ;
animal. eat ( ) ;
System . out. println ( "-------------------" ) ;
if ( animal instanceof Dog ) {
Dog dog = ( Dog ) animal;
dog. eat ( ) ;
}
else if ( animal instanceof Cat ) {
Cat cat = ( Cat ) animal;
cat. eat ( ) ;
} else {
System . out. println ( "两者都不是" ) ;
}
}
}
2.4 向下造型的异常
如果等号左边的对象不是等号右边的对象类型的一个实例,那么就会报类型转换异常 java.lang.ClassCastException
public class TestEception {
public static void main ( String [ ] args) {
Animal animal = new Cat ( ) ;
animal. eat ( ) ;
Dog dog = ( Dog ) animal;
dog. eat ( ) ;
}
}