首页 > 编程语言 >Java面向对象:初识多态

Java面向对象:初识多态

时间:2024-06-18 23:28:59浏览次数:24  
标签:Java name age 多态 Dog 初识 void Animal public

1、多态

多态是面向对象编程的三大基本特性之一。多态指的是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

多态实现条件:

1、继承关系的存在

2、方法的重写

3、父类引用调用重写的方法

例子:

class Animal {
    public void eat() {
        System.out.println("Animal在吃饭");
    }
}

class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("Dog在吃狗粮");
    }
}
class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("Cat在吃猫粮");
    }
}
public class Test {
    public static void eat(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();

        eat(dog);
        eat(cat);
    }
}

输出:

Dog在吃狗粮
Cat在吃猫粮

2、向上转型

向上转型是子类对象赋值给父类引用变量,实际就是创建一个子类对象,将其当作父类对象来使用。

格式:

父类类型 对象名 = new 子类类型

Animal animal = new Dog();

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
}
public static void main(String[] args) {
    // 显式创建子类对象,然后隐式地赋值给父类引用:
    Dog dog = new Dog("小白",5);
    Animal an;
    an = dog;
    dog.eat();

    // 直接在声明和初始化时隐式地赋值给父类引用
    Animal animal = new Dog("小黄",5);
    animal.eat();
}

输出:

小白在吃狗粮
小黄在吃狗粮

3、向下转型

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
    public void bark(){
        System.out.println(name + "在叫");
    }
}

public static void main(String[] args) {
    Animal animal = new Dog("小黄",5); // 隐式向上转型

    // 向下转型:检查animal是否是Dog的实例,然后显式转换
    if (animal instanceof Dog) {
        Dog dog = (Dog) animal; // 显式向下转型
        dog.bark(); // 调用Dog类特有的方法
    }
}

输出:

小黄在叫

4、重写

重写(Override)是指子类重新定义或实现了父类中已有的方法。当子类继承一个父类时,它可以通过重写父类的方法来改变该方法的实现方式,以适应子类自己的需求。

4.1、子类需维持父类方法原型

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    @Override
    public void eat(){
        System.out.println(name + "在吃狗粮");
    }
}

4.2、子类重写应维持或提升访问权限

访问权限大小:public > protected > default(默认) > private

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    } 
    @Override
    protected void eat(){ // 此处的访问权限比父类低,程序无法执行
        System.out.println(name + "在吃狗粮");
    }
}

4.3、父类静态、私有方法及构造方法的非重写特性

例子:

class Animal {
    String name;
    int age;
    // 静态方法
    public static void staticMethod() {
        System.out.println("Animal的静态方法");
    }
    // 私有方法
    private void privateMethod() {
        System.out.println("Animal的私有方法");
    }
}

class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    // 静态方法不能在实例方法中直接重写,但可以在子类中定义同名静态方法  
    // 这只是隐藏了父类的静态方法,而不是重写  
    public static void staticMethod() {
        System.out.println("Dog的静态方法");
    }
}

标签:Java,name,age,多态,Dog,初识,void,Animal,public
From: https://blog.csdn.net/m0_67456201/article/details/139726073

相关文章

  • JavaScript中各种源码实现
    文章目录JavaScript中各种源码实现1.实现一个new操作符2.实现一个Array.isArray3.实现一个Object.create()方法4.实现一个EventEmitter5.实现一个Array.prototype.reduce6.实现一个call或apply7.实现一个Function.prototype.bind8.实现一个JS函数柯里化9.手写防......
  • JAVA实验九
    一 算术测试Classonepackageaaa;importjava.util.Random;importjava.awt.event.*;importjavax.swing.*;publicclassOneimplementsActionListener{ intnumberOne,numberTwo; Stringoperator=""; booleanisRight; Randomrandom; intmaxInteger;......
  • ​b站视频演示效果:【web前端特效源码】使用HTML5+CSS3+JavaScript十分钟快速制作一个
    b站视频演示效果:【网页设计期末大作业源代码】使用HTML5+CSS3+JavaScript十分钟快速制作一个简约大气卡通动漫静态网站|自制超简单的卡通类网页,响应式自适应新手友效果图:完整代码:<!DOCTYPEhtml><html><head><title>Home</title><metaname="viewpor......
  • Java怎么现在支付宝沙盒支付
    一、支付环境准备支付宝的公钥和私钥支付的网关支付的APPID1、配置沙箱应用环境1、打开支付宝开放平台,官网:支付宝开放平台2、登录个人账户,然后点击控制台找到里面的沙箱3、这里能够找到APPID和支付宝网关地址和密钥二、设置内网穿透环境我用的花生壳:花生壳官网|动态域名|......
  • java基础·小白入门(一)
    目录Java语言概述Java的性质三种平台跨平台原理Java语言开发环境相关概念Java开发工具的安装Java程序的编译与运行基本注意事项Java语言基础数据类型基本数据类型引用数据类型关键字与标识符常量与变量常量变量数据类型转换常见运算符Java语言概述这一部分主要......
  • 课题分享:校园快领服务系统,基于java+SSM+mysql
     一、前言介绍     随着中国经济的快速发展和互联网技术的普及,信息管理改革确实成为了一种广泛和全面的趋势。在这一背景下,基于MySQL数据库的校园快领服务系统应运而生,这不仅体现了信息化建设在教育领域的深入应用,也展现了现代管理手段在提高工作效率和优化服务体验......
  • 课程分享:校园兼职系统,基于java+SSM+mysql
    一、前言介绍       随着社会的不断发展和科学技术的飞速进步,互联网技术已经变得越来越受到人们的欢迎。在这个快节奏的时代,我们的生活方式也变得越来越忙碌,对生活品质的要求也变得更加严格。因此,对于快速、方便的服务的需求也在逐渐增加。互联网具有许多优点,例如便利......
  • 深入理解Java虚拟机
    类加载加载java数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义,引用数据类型才需要类的加载过程。类的加载,就是将java类的字节码文件加载到内存中,并通过字节码在内存中构建出类的原型---类模板对象。jvm把字节码中的常量池,类字段,类方法等信息存储到类模......
  • Java访问控制符及final
    1、访问控制符在Java语言中,访问控制修饰符有4种,分别是public、private、protected和default。1) private用private修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private修饰符具有最高的保护级别。2)default(默......
  • Java毕业设计 基于SSM助学贷款管理系统
    Java毕业设计基于SSM助学贷款管理系统SSM助学贷款管理系统功能介绍学生:登录修改密码学生信息贷款项目信息申请贷款留言信息公告学校负责人:登录修改密码学生管理学校负责人信息贷款项目贷款申请审批留言信息公告银行负责人:登录修改密码银行负责人信息......