java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

Java方法重写与权限修饰符以及多态和抽象类是面向对象编程中非常重要的概念和用法。下面将详细讲解。

Java方法重写与权限修饰符

什么是方法重写

方法重写是指在子类中重新定义继承自父类的同名方法,其方法签名(即方法的名称、参数类型和数量)必须与父类方法相同,但方法体可以不同。方法重写的目的是为了实现方法的多态性,即同一种方法,在不同的子类中所表现出的行为不同。

方法重写的规则

  • 子类方法与父类方法具有相同的名称、参数列表和方法返回类型;
  • 子类方法的访问权限不能低于父类方法的访问权限;
  • 子类方法不能抛出比父类方法更多的异常;
  • 子类方法不能重写父类方法中被 final 修饰的方法;

下面通过示例说明方法重写的使用:

class Animal {
    public void move() {
        System.out.println("动物可以移动");
    }
}

class Dog extends Animal {
    public void move() {
        super.move();
        System.out.println("狗可以跑和走");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal animal = new Animal(); // Animal 对象
        Animal dog = new Dog(); // Dog 对象

        animal.move();// 执行 Animal 类的方法
        dog.move();//执行 Dog 类的方法
    }
}

输出结果为:

动物可以移动
动物可以移动
狗可以跑和走

权限修饰符

Java中的访问权限修饰符主要有public、private、protected和默认(即不加修饰符)。它们的具体含义如下:

  • public:表示该类、方法或成员变量对所有类可见,不论是同一个包中的类还是不同包中的类;
  • private:表示该类、方法或成员变量仅对该类内部、同一个包中的类及其子类可见;
  • protected:表示该类、方法或成员变量仅对该类内部、同一个包中的类及其子类和其他包中的子类可见;
  • 默认(不加修饰符):表示该类、方法或成员变量仅对同一个包中的类可见。

下面通过示例说明权限修饰符的使用:

class Animal {
    private String name;  // 私有成员变量

    public void setName(String name) {  // 公有成员方法
        this.name = name;
    }

    public String getName() {   // 公有成员方法
        return name;
    }
}

public class Cat extends Animal {
    private String color;  // 私有成员变量

    public void setColor(String color) {  // 公有成员方法
        this.color = color;
    }

    public String getColor() {   // 公有成员方法
        return color;
    }
}

在上面的示例中,Animal类中的成员变量name和Cat类中的成员变量color都使用了private修饰符,因此它们仅对各自的类内部可见。Animal类中的成员方法setName和getName使用了public修饰符,在类的外部可以通过对象调用这两个方法。Cat类中的成员方法setColor和getColor也使用了public修饰符,在类的子类和类的外部都可以通过对象调用这两个方法。

多态和抽象类

什么是多态

多态是指同一种类型的对象,在不同的情况下表现出不同的行为,即同一种对象在不同的场景下具有不同的状态和行为。多态分为编译时多态和运行时多态。

编译时多态

编译时多态是指在编译时确定方法的调用对象和方法的实现体,即在编译时就确定方法的行为。编译时多态主要通过方法的重载来实现。

运行时多态

运行时多态是指在运行时确定方法的调用对象和方法的实现体,即在运行时根据对象的实际类型来确定方法的行为。运行时多态主要通过方法的重写和接口来实现。

什么是抽象类

抽象类是一种不能被实例化的类,该类主要用于作为其他类的父类,为子类提供统一的接口和行为。抽象类中可以包含抽象方法和非抽象方法,其中抽象方法必须由子类来实现。

下面通过示例说明多态和抽象类的使用:

abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void eat();  // 抽象方法

    public void sayHello() {    // 非抽象方法
        System.out.println("我是一只" + name);
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void eat() {   // 实现抽象方法
        System.out.println(name + "喜欢吃鱼");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void eat() {   // 实现抽象方法
        System.out.println(name + "喜欢吃骨头");
    }
}

public class TestAnimal {
    public static void main(String args[]) {
        Animal animal1 = new Cat("小猫");  // 使用父类引用变量存储子类对象
        animal1.sayHello();
        animal1.eat();  // 执行子类的实现方法

        Animal animal2 = new Dog("小狗");  // 使用父类引用变量存储子类对象
        animal2.sayHello();
        animal2.eat();  // 执行子类的实现方法
    }
}

在上面的示例中,Animal类是一个抽象类,其中包含一个抽象方法eat和一个非抽象方法sayHello。Cat类和Dog类继承自Animal类,并实现了抽象方法eat。TestAnimal类中创建了Animal类的对象animal1和animal2,它们分别存储了Cat类和Dog类的对象。由于Cat类和Dog类继承自Animal类,因此可以使用Animal类的引用变量来存储它们的对象。当调用animal1.eat()时,实际上是调用了Cat类中的eat方法;当调用animal2.eat()时,实际上是调用了Dog类中的eat方法。这体现了运行时多态的特性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 方法重写与权限修饰符以及多态和抽象类详解概念和用法 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Linux系统怎么修改磁盘参数(名称、盘符等等)

    Linux系统中可以通过udev规则修改磁盘设备的参数信息,包括设备名称、盘符等等。 以下是修改设备名称和盘符的步骤: 查看磁盘设备的UUID或LABEL 可以通过命令 lsblk -o NAME,UUID,LABEL 查看磁盘设备的UUID或LABEL信息。 示例: $ lsblk -o NAME,UUID,LABEL NAME UUID LABEL sd…

    other 2023年6月27日
    00
  • C++11中模板隐式实例化与显式实例化的定义详解分析

    C++11中模板隐式实例化与显式实例化的定义详解分析 前言 在 C++ 中,模板是一种通用的代码方案,可以根据不同的数据类型生成对应的代码。模板主要被用于容器类,例如 vector、set 和 map 等STL中的模板类。C++11中引入了模板的新特性,即模板隐式实例化和显式实例化。 模板隐式实例化 模板隐式实例化是指在使用模板时自动生成模板代码的过程。代码…

    other 2023年6月26日
    00
  • Python接口自动化浅析logging封装及实战操作

    下面我将详细讲解“Python接口自动化浅析logging封装及实战操作”的完整攻略,包括如何封装logging模块、如何实现日志级别、如何将日志输出到文件、如何将日志同时输出到控制台和文件等内容。同时还会提供两个示例说明,帮助更好地理解。 1. 封装logging模块 在Python中,我们可以使用logging模块来实现日志功能。但是,如果在实际使用中,…

    other 2023年6月25日
    00
  • sai怎么自制笔刷? sai制作独一无二的笔画的教程

    下面是详细讲解如何在SAI中自制笔刷的教程: 如何自制笔刷 在SAI软件中,我们可以通过自定义笔刷(以下简称“自制笔刷”)来制作独特的笔画。具体步骤如下: 步骤1:打开SAI软件并进入钢笔工具 对于初学者或者新手,建议先熟悉SAI的各种基本工具,特别是钢笔工具,这是自制笔刷的基础。当你进入SAI软件后,单击左侧工具栏中的“钢笔工具”图标,你将进入钢笔编辑模式…

    other 2023年6月27日
    00
  • 说说weakreference弱引用

    在Java中,WeakReference是一种弱引用类型,它可以让对象在没有强引用指向它时被垃圾回收器回收。本文将详细介绍WeakReference的使用方法和注意事项,并提供两个示例说明。 弱引用概述 在Java中,对象的生命周期由它的引用决定。如果一个对象没有任何引用指向,那么它就成为了垃圾,可以被垃圾回收器回收。通常情况下,我们使用强引用来引用对象,这…

    other 2023年5月7日
    00
  • javascript-如何前往gatsby(history.goback)的上一页

    以下是关于“JavaScript如何前往Gatsby的上一页”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 在Gatsby中,可以使用history对象控制页面的跳转。history对象是HTML5提供的一个API,用于管理浏览器的历史记录。通过history对象,实现页面的前进、后退、跳转等操作。 解决方法 以下是两种解决方法: 方法…

    other 2023年5月7日
    00
  • 在Linux操作系统中修改环境变量的方法

    下面是在Linux操作系统中修改环境变量的方法的完整攻略: 修改系统级环境变量 编辑/etc/profile 打开终端,输入以下命令(要求管理员权限): bash sudo vi /etc/profile 在打开的文件中找到相应的位置,添加或修改你需要的环境变量。例如,添加一个名为JAVA_HOME,值为/usr/java/jdk-11.0.1的变量,可以在…

    other 2023年6月27日
    00
  • SpringBoot中@Autowired生效方式详解

    下面是“SpringBoot中@Autowired生效方式详解”的完整攻略。 什么是@Autowired @Autowired 是 Spring 框架中的一个注解,用于自动注入 Spring Bean 对象。它可以实现将 Bean 通过属性切入到需要使用的 Bean 中的过程,是 Spring 中最常用的注解之一。 实现原理 @Autowired 注解实现的…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部