目录
前言
数据类型:决定数据在内存当中是怎么样的存储形式。
向上转型:子类的对象可以被父类的类型所接受------>父类的引用指向子类的对象
多态就是父类的引用指向了子类的对象
不同数据类型,在计算机中的存储形式
一、多态是什么?
我所理解的多态!
创建子类空间,但是对象属于父类,如果有方法的重写,则此方法作为子类和父类的公共方法使用,原父类的方法不在使用
可使用的方法包括,不被子类所重写的方法和重写之后的方法
多态就是父类的引用指向了子类的对象
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));