• Java的多态


      多态,即对象的多种形态
      1.引用多态
        父类引用可以指向本类的对象
        父类引用可以指向其子类的对象
      2.方法多态
        创建本类对象是,调用的方法为本类的方法
        创建子类对象时,父类的引用指向子类对象,调用的方法为子类重写的方法,若没有重写则调用继承的方法
       要点:Java的函数是会默认进行动态绑定,而C++必须将相应函数显示声明为虚函数
       PS:所谓动态绑定是指当基类指针或引用指向派生类对象时,如果子类重写了调用的方法,则调用的是重写后的方法,若子类没有重写该方法,则调用的是从基类继承来的方法

      注意:若子类在继承的基础上添加了父类中没有的方法(即使是以重载的方式实现也不行,因为父类中没有重载这个函数),此时是无法通过父类引用来实现调用的(因为父类压根没有这个方法)

    参考代码:

    父类Animal的内容:

    package com.hao;
    
    public class Animal {
        String name = "";
        int age = 0;
        
        /* (非 Javadoc)
         * @see java.lang.Object#hashCode()
         */
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
    
        /* (非 Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Animal other = (Animal) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    
        Animal(){}
    
        /**
         * @param name 动物的姓名
         * @param age 动物的年龄
         */
        public Animal(String name, int age) {
            super(); //其super类其实为Object类
            this.name = name;
            this.age = age;
        }
        
        public void eat(){
            System.out.println("Animal can eat!");
        }
        
        public void information(){
            System.out.printf("%s is a Animal, it's %d years old!
    ", name, age);
        }
        
        
    
    }//Animal
    View Code

    子类Dog的内容:

    package com.hao;
    
    public class Dog extends Animal {
    
        /**
         * 默认构造函数
         */
        public Dog() {
            super();
            // TODO 自动生成的构造函数存根
        }
    
        /**
         * @function 带参构造函数
         * @param name 狗的姓名
         * @param age 狗的年龄
         */
        public Dog(String name, int age) {
            super(name, age);
            // TODO 自动生成的构造函数存根
        }
    
        /* (非 Javadoc)
         * @see com.hao.Animal#eat()
         */
        @Override
        public void eat() {
            // TODO 自动生成的方法存根
            //super.eat();
            System.out.println("Dog can eat!");
        }
        
    
        /* (非 Javadoc)
         * @see com.hao.Animal#information()
         */
        @Override
        public void information() {
            // TODO 自动生成的方法存根
            //super.information();
            System.out.printf("%s is a Dog, it's %d years old!
    ", name, age);
        }
    
        
        
        
    
    
        
    }
    View Code

    子类Cat的内容:

    package com.hao;
    
    public class Cat extends Animal {
    
        /**
         * 默认构造函数
         */
        public Cat() {
            super();
            // TODO 自动生成的构造函数存根
        }
    
        /**
         * @param name 猫的姓名
         * @param age 猫的年龄
         */
        public Cat(String name, int age) {
            super(name, age);
            // TODO 自动生成的构造函数存根
        }
        
    }
    View Code

    包含主函数的Main类内容:

    package com.hao;
    
    public class Main {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            Animal A = new Animal("A", 10);
            Animal B = new Dog("B", 20);
            Animal C = new Cat("C", 30);
            
            //动态绑定,如果子类重写了调用的方法,则调用的是重写后的方法,若没有重写,则调用的是从父类继承来的方法的
            A.information(); //指向本类对象,调用的父类的方法
            B.information(); //指向子类对象,且Dog重写了该方法,调用重写后的方法
            C.information(); //指向子类对象,但Cat类没有重写该方法,调用是Animal类中继承类的方法
            
        }
    
    }
    View Code
  • 相关阅读:
    php 扩展模块安装过程
    nginx 配置若干问题
    df 显示 100%的问题
    pcre 不支持 utf 的问题
    服务器TCP连接中 TIME_WAIT 状态过多
    Linux 运维笔试题(一)答案
    Linux 运维笔试题(一)
    Java 内存监控(一)之 jps命令
    python 入门
    Java 内存监控命令简介(零)
  • 原文地址:https://www.cnblogs.com/tommychok/p/5503202.html
Copyright © 2020-2023  润新知