Java基础---多态

目录

前言

一、多态是什么?

多态 

向上转型 

 二、示例

 1---3结果

 ①

②  

③ 

4---6结果 (多态)

④ 

⑥ 

7---9结果 

⑦ 

⑨ 


前言

数据类型:决定数据在内存当中是怎么样的存储形式。

向上转型:子类的对象可以被父类的类型所接受------>父类的引用指向子类的对象

多态就是父类的引用指向了子类的对象


 不同数据类型,在计算机中的存储形式

一、多态是什么?

我所理解的多态!

创建子类空间,但是对象属于父类,如果有方法的重写,则此方法作为子类和父类的公共方法使用,原父类的方法不在使用

可使用的方法包括,不被子类所重写的方法和重写之后的方法

多态就是父类的引用指向了子类的对象

a这个对象内存存储形式

声明了一个A类型的变量a,并通过调用A类的构造方法创建了一个A类的新实例,然后将这个新实例的引用赋值给了变量a。之后,我们就可以通过变量a来访问这个A类实例的成员(包括变量和方法)了。


 

B类继承A类 

创建子类的对象的前提是创建父类的对象

变量b可以使用B类的方法和A类的方法


 

方法的重写,此时B类的run()覆盖A类的run()方法

 

多态 

创建子类空间,但是对象属于父类,如果有方法的重写,则此方法作为子类和父类的公共方法使用,原父类的方法不在使用

可使用的方法包括,不被子类所重写的方法和重写之后的方法

new B() 开辟B类的前提先开辟A类,ab指向的为A类,B类的当中run()方法被A类B类所共用 

 

ab可以使用的有A类的name,age,eat()方法,B类的run()方法  

 

向上转型 

子类的对象可以被父类的类型所接受------>父类的引用指向子类的对象

用static修饰类后,使用类的调用

传入B类型的b,给hanlder(A a)方法,虽然hanlder内规定的类型值为A,但方法可以被使用,不报错,原因是B类的b可以向上转型为A类

 

 二、示例

分析以下代码的输出结果及其内存流程图 

public class A {
    public String Show(D obj){
        return "A and D";
    }
    public String Show (A obj){
        return "A and A";
    }
}
public class B extends A{//B类继承A类
    public String Show(Object obj){
        return "B and B";
    }
    public String Show(A obj){
        return "B and A";
    }
}

public class C extends B{//C类继承B类
}

public class D extends B{//D类继承B类
}
public class Test {
    public static void main(String[] args) {
        A a1=new A();
        A a2=new B();
        B b=new B();
        C c=new C();
        D d=new D();
        
        System.out.println("1---"+a1.Show(b));
        System.out.println("2---"+a1.Show(c));
        System.out.println("3---"+a1.Show(d));

        System.out.println("4---"+a2.Show(b));
        System.out.println("5---"+a2.Show(c));
        System.out.println("6---"+a2.Show(d));

        System.out.println("7---"+b.Show(b));
        System.out.println("8---"+b.Show(c));
        System.out.println("9---"+b.Show(d));
    }
}

 输出结果为

1---A and A

2---A and A

3---A and D

4---B and A

5---B and A

6---A and D

7---B and A

8---B and A

9---A and D

 1---3结果

 ①

声明了一个A类型的变量a1,并通过调用A类的构造方法创建了一个A类的新实例,然后将这个新实例的引用赋值给了变量a。声明了一个B类型的变量b,B类创建的前提先创建其父类A类。

输出的时候调用Show()方法,传值为变量b,b为B类型,在此对象中的方法中,可以满足Show(A)方法,B类型可以向上转型为A类

System.out.println("1---"+a1.Show(b));

 

②  

a1为A类 

 输出的时候调用Show()方法,传值为变量c,c为C类型,在此对象中的方法中,可以满足Show(A)方法,C类型可以向上转型为B类,B类向上转型为A类

System.out.println("2---"+a1.Show(c));

③ 

 输出的时候调用Show()方法,传值为变量d,d为D类型,在此对象中的方法中,可以满足Show(A)方法,D类型可以向上转型为B类,B类向上转型为A类

System.out.println("3---"+a1.Show(d));

 

4---6结果 (多态)

A 类型的引用 a2 被用来指向一个 B 类的对象

B类中的Show(A)被A类和B类所共用,原A类中的Show(A)不被使用,此时a2可以使用的方法有A类的Show(D)和B类的Show(A)

④ 

传入B类的变量b可以满足B类的Show(A)方法,B类向上转型为A类

System.out.println("4---"+a2.Show(b));

 

传入C类的变量c可以满足B类的Show(A)方法,C类向上转型为B类,B类向上转型为A类 

System.out.println("5---"+a2.Show(c));

⑥ 

传入D类的变量d可以满足A类的Show(D)方法

System.out.println("6---"+a2.Show(d));

7---9结果 

A类中的Show(A)被B类中的Show(A)所覆盖 

⑦ 

满足B类的Show(A)方法,B类向上转型为A类 

System.out.println("7---"+b.Show(b));

 

 满足B类的Show(A)方法,C类向上转型为B类,B类向上转型为A类 

System.out.println("8---"+b.Show(c));

 

⑨ 

 满足A类的Show(D)方法,

System.out.println("9---"+b.Show(d));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值