Java多态的认识和理解

目录

概念

理解

条件

定义与使用格式

成员的特点

多态的转型

1.向上转型

2.向下转型

instanceof关键字

优点

缺点

附上一个经典例子(转载)


多态是面向对象程序设计的三大特征之一,面向对象的三大特征:封装、继承、多态。

  封装给对象提供了隐藏内部特性和行为的能力,保护对象内部的状态,提高了代码的可用性和可维护性。

  继承关系使一个子类能继承父类的特征,而不需要再次编写相同的代码,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例。

概念

同一个行为具有多个不同表现形式或形态的能力,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

理解

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作。

比如动物类可以指向猫或狗,他们的“叫”方法不一样,“喵喵喵”和“汪汪汪”。

条件

  1. 继承(在多态中必须存在有继承关系的子类和父类。
  2. 重写(子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  3. 父类引用指向子类对象(检查父类中是否有该方法,没有则编译错误;有则调用子类的同名方法)

定义与使用格式

定义格式:父类类型 变量名=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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值