目录
概念
理解
条件
定义与使用格式
成员的特点
多态的转型
1.向上转型
2.向下转型
instanceof关键字
优点
缺点
附上一个经典例子(转载)
多态是面向对象程序设计的三大特征之一,面向对象的三大特征:封装、继承、多态。
封装给对象提供了隐藏内部特性和行为的能力,保护对象内部的状态,提高了代码的可用性和可维护性。
继承关系使一个子类能继承父类的特征,而不需要再次编写相同的代码,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例。
概念同一个行为具有多个不同表现形式或形态的能力,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
理解多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同 *** 作。
比如动物类可以指向猫或狗,他们的“叫”方法不一样,“喵喵喵”和“汪汪汪”。
条件- 继承(在多态中必须存在有继承关系的子类和父类。)
- 重写(子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。)
- 父类引用指向子类对象(检查父类中是否有该方法,没有则编译错误;有则调用子类的同名方法)
定义格式:父类类型 变量名=new 子类类型();
成员的特点e.g:Person s=new Student();代码定义一个变量s
多态成员变量:编译运行看左边
Person s=new Student();
System.out.println(s.score);//s是Person中的值,只能取到父中的值
多态成员方法:编译看左边,运行看右边
多态的转型Person s1=new Student();
System.out.println(s1.number);//s1的门面类型是Person,但实际类型是Student,所以调用的是重写后的方法。
多态的转型分为向上转型和向下转型两种
1.向上转型:多态本身就是向上转型过的过程 (小类型转换成大类型;同double n = 5;)1.向上转型不需要强制转型。
2.父类引用指向的或者调用的方法是子类的方法(动态绑定)。
3.向上转型后父类不能调用自己子类的方法。
使用格式:父类类型 变量名=new 子类类型();
e.g:People a = new Student();
E.g:
public class yt {
public static void main(String[] args)
{
People a = new Student();
a.num();
}
}
class People
{
void num()
{
System.out.println("人的num是111");
}
}
class Student extends People
{
void num()
{
System.out.println("学生的num是222");
}
void card()
{
System.out.println("学生的card是999");
}
}
//运行结果:学生的num是222
2.向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型(大类型转换成小类型,同int n = (int)5.2;)
1.向下转型需要强制类型转换。
2.若引用的为指向的子类对象,那么向下转型的过程不会出现错误(即过程安全)。
3.若父类引用对象为父类本身,那么在向下转型的过程虽然编译不会报错,但运行时会出现错误。
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
e.g:People a = new Student();
Student b= (People)a;
E.g:
public class yt {
public static void main(String[] args)
{
People a = new Student();
//a.num();
Student b = (Student)a;
b.card();
}
}
class People
{
void num()
{
System.out.println("人的num是111");
}
}
class Student extends People
{
void num()
{
System.out.println("学生的num是222");
}
void card()
{
System.out.println("学生的card是999");
}
}
//运行结果:学生的card是999
instanceof关键字
语法:
作用:用来判断某个对象是否属于某种数据类型。(返回类型为布尔类型) 优点引用类型变量(object) instanceof 类(class);
多态隐藏了子类的类型,提高了代码的可扩充性,
缺点只能使用父类的功能,不能使用子类的特有功能。
附上一个经典例子(转载)class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B{}
class D extends 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(a1.show(b)); // ① A and A
System.out.println(a1.show(c)); // ② A and A
System.out.println(a1.show(d)); // ③ A and D
System.out.println(a2.show(b)); // ④ B and A
System.out.println(a2.show(c)); // ⑤ B and A
System.out.println(a2.show(d)); // ⑥ A and D
System.out.println(b.show(b)); // ⑦ B and B
System.out.println(b.show(c)); // ⑧ B and B
System.out.println(b.show(d)); // ⑨ A and D
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)