一.多态的概念
1.多态的定义
多态就是多种形态,不同的对象去完成就会有不同的状态。
2.成活中的例子
一个学生在学校里是个学生,回到家是爸爸妈妈的孩子,扮演者多个角色。
就像买火车票,学生买是半价而成人买是全价。
二.多态的应用
1.方法的多态
方法的重写和重载就是多态的一种表现。
代码展示:
class Father{
//父类无参构造
public Father() {
}
//父类有参构造
public Father(String name) {
}
public void test() {
System.out.println("父类中的方法");
}
public void test(int n) {
}
}
class Son extends Father {
//重写父类方法
@Override
public void test() {
System.out.println("子类重写父类的方法");
}
}
代码中Father类创建了两个构造方法,和两个成员方法,这就是重载,在子类通过Override关键字重写了父类的方法,这就是方法的多态的应用。
2.对象的多态
一句话来概括:父类引用指向子类对象。
先看入门案例
class Father{
public void eat() {
System.out.println("父亲喜欢吃米饭");
}
}
class Son extends Father {
//重写父类方法
@Override
public void eat() {
System.out.println("儿子喜欢吃面条");
}
}
public class Demo2 {
public static void main(String[] args) {
//多态 父类的引用指向子类的对象
Father father = new Son();
father.eat();
}
}
我们通过父类来调用子类中重写父类的方法,打印出来的是"儿子喜欢吃面条"。这就是父类引用指向子类对象。
运行结果:
三.多态的转型
1.多态的向上转型
本质:父类引用指向子类对象
语法格式
父类 父类引用 = new 子类();
将子类的对象赋值给了父类的引用 。小范围(子类)转大范围(父类)自动转。
代码展示:
class Person {
public void eat () {
}
}
class Student extends Person {
@Override
public void eat() {
System.out.println("学生吃饭,吃披萨");
}
public void sleep () {
System.out.println("中午不谁下午崩溃!!!");
}
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Student();//向上转型
person.eat();
//person.sleep();
}
}
2.多态的向下转型
语法格式:
父类 父类引用 = new 子类();
子类 子类引用 = (子类)父类引用;
注意:需要强转
代码展示:
class Father{
public void eat() {
System.out.println("父亲喜欢吃米饭");
}
}
class Son extends Father {
//重写父类方法
@Override
public void eat() {
System.out.println("儿子喜欢吃面条");
}
public void sleep() {
System.out.println("儿子天天按时睡觉");
}
}
public class Demo2 {
public static void main(String[] args) {
//多态 父类的引用指向子类的对象
Father father = new Son();
father.eat();
Son son = (Son)father;
son.sleep();
}
}
通过多态的向下转型实现了子类特有的功能,但必须先向上转型再向下转型。
3.intanceof关键字
比较操作符,返回值是布尔类型数据
语法格式:
对象引用 instanceof 运行类型
用来判断对象的运行类型(等号左边),是否是某一个类或者某一个类的子类。
目的是在强转的时候不出问题。
代码展示:
class AA {}
class BB extends AA {}
public class Demo1 {
public static void main(String[] args) {
BB bb = new BB();
BB bb1 = new BB();
AA aa = new AA();
//instanceof 的左边放的对象的引用,右边是类
System.out.println(bb instanceof BB);//true
System.out.println(bb1 instanceof BB);//true