4 Java基础09-面向对象【多态】

面向对象4 1 多态 1.1 概述
是指同一行为,具有多个不同表现形式 。
生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的 。再比如飞的动作,昆虫、鸟类和飞机,飞起来也 是不一样的 。可见,同一行为,通过不同的事物,可以体现出来的不同的形态 。多态,描述的就是这样的状态 。
1.2 概念及语法
概念
多态性,是面向对象中最重要的概念,在Java中的体现:父类的引用指向子类的对象
Java编译器将. java文件编译成. class文件时,变量的类型
Java虚拟机将,class文件加载进内存,真正创建的对象所属的类型,运行时类型
语法格式
父类类型 引用 = new 子类对象;引用.方法名();
示例代码
public abstract class Animal { public abstract void eat(); }class Cat extends Animal { public void eat() { System.out.println("吃鱼"); }}class Dog extends Animal { public void eat() { System.out.println("吃骨头");}}public class Test { public static void main(String[] args) { // 多态形式,创建对象Animal a1 = new Cat(); // 调用的是 Cat 的 eat a1.eat(); // 多态形式,创建对象 Animal a2 = new Dog(); // 调用的是 Dog 的 eat a2.eat();} }
1.3 实现原理
1需要存在继承或者实现关系
2有方法的重写
多态最重要的特性:发生多态时,父类引用调用的方法是子类重写的方法 。
虚拟方法调用()
正常的方法调用
Person e = new Person(); e.getInfo(); Student e = new Student(); e.getInfo();
多态情况下
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法 。这样的方法调用在编译期是无法确定的 。这也叫做方法的动态绑定
Person e = new Student();e.getInfo(); //调用Student类的getInfo()方法//虚拟方法的调用
编译时类型和运行时类型
编译时e为类型,而方法的调用是在运行时确定的,所以调用的是类的()方法 。——动态绑定
内存图
属性不具有多态性
1.4 多态的好处1.5 操作符
=new Cat();
.out.(Cat); //true
.out.(Dog); //flase
.out.(); //true
xA:检验x是否为类A的对象,返回值为型 。//X对象是否是A类型
1.6 对象类型转换
int b;
a= b;
byte c=(byte) b; //精度丢失,强制类型转换 。
(Cat) .run();//强制转换
(Gog) .rin();//强制转换
对Java对象的强制类型转换称为造型()
示例代码
public class Test {public void method(Person e) { // 设Person类中没有getschool() 方法// System.out.pritnln(e.getschool()); //非法,编译时错误if (e instanceof Student) {Student me = (Student) e; // 将e强制转换为Student类型System.out.pritnln(me.getschool());}}public static void main(String[] args){Test t = new Test();Student m = new Student();t.method(m);} }
课堂练习
class Base {int count = 10;public void display() {System.out.println(this.count);}}class Sub extends Base {int count = 20;public void display() {System.out.println(this.count);} }public class FieldMethodTest {public static void main(String[] args){Sub s = new Sub();System.out.println(s.count);//20s.display();//20Base b = s;System.out.println(b == s);//trueSystem.out.println(b.count);//10b.display();//20}}
课堂练习-
class Person {protected String name="person";protected int age=50;public String getInfo() {return "Name: "+ name + "\n" +"age: "+ age;}}class Student extends Person {protected String school="pku";public String getInfo() {return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school;}}class Graduate extends Student{public String major="IT";public String getInfo(){return "Name: "+ name + "\nage: "+ age + "\nschool: "+school+"\nmajor:"+major;}}建立InstanceTest类,在类中定义方法method(Person e);在method中:(1)根据e的类型调用相应类的getInfo()方法 。(2)根据e的类型执行:如果e为Person类的对象,输出: “a person”;如果e为Student类的对象,输出:“a student”“a person ” 如果e为Graduate类的对象,输出:“a graduated student”“a student”“a person”package Stage1_JavaBasics.Chapter02_ObjectOriented.ObjectOriented04.class01;public class InstanceTest {public void method(Person e){if (e instanceof Graduate){System.out.println("a graduated student \na student\na person\n");}else if (e instanceof Student){System.out.println("a student \na person\n");}else if(e instanceof Person){System.out.println("a person\n");}}public static void main(String[] args) {Person person=new Person();person.getInfo();Student student=new Student();student.getInfo();Graduate graduate=new Graduate();graduate.getInfo();InstanceTest text=new InstanceTest();text.method(person);text.method(student);text.method(graduate);}}