文章目录
一、多态
1.什么是多态
多态就是“多种状态”的意思,是
指不同对象调用相同的方法所执行的操作不同。
2.什么是对象的向上转型
在
引用数据类型
的父类和子类
也存在转换问题,子类对象可以自动赋给父类对象,称子类对象向上转型
,此时父类对象也称作子类对象的上转型对象
。(切记:若父类对象要赋给子类对象时需要强制类型转换才可以!)
(1)上转型对象特点
1.上转型对象会失去子类对象的一些属性和功能。
比如上转型对象 不能 操作子类新增的成员变量
;也不能使用子类新增的方法
。
2.上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承或者重写的方法。
3.上转型对象操作子类继承或重写的方法时,就是通知相应的子类对象去调用继承或重写的方法。
4.可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有的属性和功能。
(2)举例
//注意:例1和例2的写法所达到的效果都是相同的!
例1:
Person p;
Student stu = new Student();
p = stu;
例2:
Person p = new Student();
(3)补充
1.什么是引用数据类型?
所谓引用数据类型
就是我们用平时写的类来创建对象,此时被创建的这个对象的类型就是引用数据类型,它与int型、double型等都不是同一种类型。
2.数据类型之间的转换关系是怎样的?
例1:整型可以自动转换为double型
int n=23;
double m=n;//m值为23.0
例2:double型数据需要强制类型转换才能赋给int型
int n=(int)8.2; //n值为8
3.如何实现多态
实现多态的三个必要条件:
继承
、重写
、向上转型
。
继承: 在多态中必须存在有继承关系的子类和父类。
重写: 子类对父类中某些方法进行重写,在调用这些方法时就会调用子类重写后方法。
向上转型: 在多态中需要将子类的引用赋给父类对象,编译的时候就会按照父类处理,但是此时的父类不能再调用子类新增的成员和新增的方法,,但是能够调用子类重写的方法。
二、instanceof运算符
1.用法
instanceof 可以翻译为“什么的实例”,在代码中主要用于判断一个引用数据类型所引用的对象是否是一个类的实例。instanceof运算符左边操作元是一个对象,右边操作元是一个类名或者接口。
例:
Student stu = new Student();
//stu instanceof Student 的意思代表stu是否为Student的一个实例,或者stu是否为Student类型的对象,并且stu instanceof Student的返回值为Boolean型,为false或者true
2.*案例
//父类Person
public class Person {
//属性定义
private String name;
private int age;
//setter、getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//构造方法
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//方法定义
public void printInfo() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
//子类Teacher
public class Teacher extends Person{
//新增属性
private String major;
//setter、getter方法
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
//构造方法
public Teacher(String name,int age,String major) {
super(name,age);
this.major = major;
}
//方法定义
public void printInfo() {
super.printInfo();
System.out.println("专业:"+major);
}
//新增giveLesson方法
public void giveLesson() {
System.out.println("我正在上"+major+"课,学生听得很认真!");
}
}
//子类Student
public class Student extends Person{
//新增属性
private String department;
//setter、getter方法
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
//构造方法
public Student(String name, int age, String department) {
super(name, age);
this.department = department;
}
//方法定义
public void printInfo() {
super.printInfo();
System.out.println("系别:"+department);
}
//新增haveClass方法
public void haveClass(String course) {
System.out.println("我正在上"+course+"课,这门课真有趣!");
}
}
//学校类
public class School {
//多态实现
public void openDoor(Person p) {
p.printInfo();
System.out.println("允许进入!");
}
public void check(Person p) {
System.out.println("学校开始检查:");
if(p instanceof Student) {
//判断p是不是一个学生对象
((Student) p).haveClass("java");//父类强制类型转换为Student子类,目的是为了调用Student子类新增的giveLesson方法!
}
if(p instanceof Teacher) {
//判断p是不是一个老师对象
((Teacher)p).giveLesson();//父类强制类型转换为Teacher子类,目的是为了调用Teacher子类新增的giveLesson方法!
}
}
//测试类(主函数main)
public class EX8_3 {
public static void main(String[] args) {
School sc = new School();
sc.check(new Student("小明",19,"信息工程学院"));
sc.check(new Teacher("张老师",35,"Java"));
}
}
//运行结果:
学校开始检查:
我正在上java课,这门课真有趣!
学校开始检查:
我正在上Java课,学生听得很认真!
三、实现多态的经典案例
//动物父类
public class Animal {
}
//动物子类
public class Cat extends Animal{
public String toString() {
return "猫";
}
public void eat(Fish f) {
Fish f = new Fish();
System.out.println(this+"正在吃"+f);//此处的this会调用当前类的toString方法
}
}
//动物子类
public class Dog extends Animal{
public String toString() {
return "狗";
}
public void eat(Bone b) {
Bone b = new Bone();
System.out.println(this+"正在吃"+b);
}
}
//食物父类
public class Food{
}
//食物子类
public class Fish extends Food{
public String toString() {
return "鱼";
}
}
//食物子类
public class Bone extends Food{
public String toString() {
return "骨头";
}
}
//喂养者类
public class Feeder {
String no;
public void feed(Animal a,Food f){
System.out.println("饲养员"+no+"正在拿着"+f+"喂"+a);
a.eat(f);
}
}
//测试类(主函数main)
public class Test {
public static void main(String[] args) {
Feeder f = new Feeder("001");
Cat c = new Cat();
Fish fish = new Fish();
f.feed(c,fish)//此处将子类猫和子类鱼传给喂养者类feed方法中的参数父类动物和父类食物,相当于完成了将子类赋给父类的自动转换
Dog d = new Dog();
Bone bone = new Bone();
f.feed(d,bone);//
}
}
运行结果:
饲养员001正在拿着鱼喂猫
猫正在吃鱼
饲养员001正在拿着骨头喂狗
狗正在吃骨头
.