Java基础语法(六)----面向对象(3)多态

1、多态的概述

      多态是指一个对象在不同时刻表现出来的不同状态,是指父类的对象接受子类的对象。

     举例:

       猫可以是猫的类型。猫 m = new 猫();

       同时猫也是动物的一种,也可以把猫称为动物 (Animal 是猫类的父类)。Animal an=new 猫();


2、多态前提和体现

 * 有继承关系 

 * 有方法重写 

 * 有父类引用指向子类对象


3、成员访问特点

   定义一个父类Person,子类Student

   //父类

public class Person {
    public String name="Lily";
    public String sex="女";
    public int age=30;

    public Person() {
        System.out.println("我是父类的空参构造方法");
    }

    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        System.out.println("我是父类的带参构造方法");
    }

    public void show(){
        System.out.println("我是父类的show方法");
    }

    public static void eat(){
        System.out.println("我是父类中的静态方法");
    }
}

 

  //子类

public class Student extends Person {
    public String name="abc";
    public String classNum="class1";
    public Student(){
        System.out.println("我是子类的空参构造");
    }
    public Student(String name,String sex,int age,String classNum) {
        this.name=name;
        this.sex=sex;
        this.age=age;
        this.classNum = classNum;
        System.out.println("我是子类的带参构造方法");
    }
    public void show(){
        System.out.println("这是子类中的show方法");
    }
    public static void eat(){
        System.out.println("这是子类中的静态方法");
    }
}


1) 成员变量

   编译看左边,运行看左边,第一个“看左边”是指看父类是否存在该成员变量,第二个“看左边”是指访问父类的成员变量。

  *1、Person p=new Student(); p调用成员变量,编译时看父类中是否存在该变量,若存在运行时访问父类的成员变量,若不存在,则会报错,测试类如下:

  

public class Test1 {
    public static void main(String[] args) {

        //  Person student=new Student("Bob","男",18,"高三一班");

        Person student = new Student();
        System.out.println(student.name);
        System.out.println(student.sex);
        System.out.println(student.age);
        //会报错,因为父类没有定义classNum成员变量
        //System.out.println(student.classNum);


    }
}



   //运行结果


   *2、  Person p=new Student("Bob","男",18,"高三一班");   p调用成员变量(该成员变量在子类中存在同名变量,如子类中有和父类变量名相同的name,这个成员变量编译看左边,运行看左边,没有同名的变量访问的仍是子类的成员变量,测试类如下:

public class Test1 {
    public static void main(String[] args) {

        Person student=new Student("Bob","男",18,"高三一班");
        System.out.println(student.name);
        System.out.println(student.age);
        //会报错,因为父类没有定义classNum成员变量
        //System.out.println(student.classNum);
    }
}

//运行结果

  


2)成员方法

   编译看左边,运行看右边

  多态调用成员方法的前提是父类和子类存在同名方法,否则就会编译报错;当多态对象访问该方法时,会默认访问子类的方法。

   测试类:

  

public class Test1 {
    public static void main(String[] args) {
        Person student = new Student();
        student.show();
    }
}

   //运行结果

 


3) 静态方法

   编译看左边,运行看左边

    //测试类

public class Test1 {
    public static void main(String[] args) {
        Person student = new Student();
        student.eat();
    }
}

   

    //运行结果:

   

  4、多态的好处

   * 提高了程序的维护性(由继承保证)

   * 提高了程序的扩展性(由多态保证)


  5、多态的弊端

   * 不能访问子类特有功能。

 

  6、多态中的转型问题

    多态的弊端是不能访问子类特有的功能,那么我们如何才能访问子类的特有功能呢?所以提出了多态中的转型,来实现这种操作。

 1) 向下转型

    以上述的Person、Student类为例,向下转型是指将父类对象用其相对应的子类对象接收.

    Person p = new Student();

    Student stu = (Student) p;   //实现向下转型


2) 向上转型

   多态的存储数据的形式就是一个向上转型,用其父类对象来接收子类对象。

   

  


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值