Java中的封装、继承和多态,你真的都懂了吗

Java中的封装、继承和多态是Java面向对象编程中的三大核心概念,了解它们的作用和用法对于Java程序员来说至关重要。

封装

封装是将对象的状态和行为进行封装,预防外部直接访问和修改对象属性的一种机制。Java中通过访问权限控制来实现封装,一般分为public、private、protected和default四种访问权限。

示例1:

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0) {
            this.age = 0;
        }
        else {
            this.age = age;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

以上代码展示了一个Person类,类中有两个私有属性:age和name,对外只提供了公共的getter和setter方法,以便外部使用。其中setter方法对传入的参数进行了合法性校验,如果传入的年龄小于0默认设置为0。

示例2:

public interface UserDao {
    void save(User user);
    void delete(int id);
    User find(int id);
}

public class UserDaoImpl implements UserDao {
    @Override
    public void save(User user) {
        // 保存用户
    }

    @Override
    public void delete(int id) {
        // 删除用户
    }

    @Override
    public User find(int id) {
        // 查询用户
        return null;
    }
}

以上代码展示了一个Dao层的接口和其实现类,通过接口和实现类的方式,将实现类中的方法声明和具体实现分离,在上层业务逻辑的调用时只需调用接口中的方法即可,实现类内部具体实现可以随时更换而不影响上层业务逻辑。这个也就是面向接口编程的思想。

继承

继承是Java面向对象编程中的另一个重要概念,它允许子类继承父类中的属性和方法,使得代码实现更加简单、便捷。同时,子类还可以重写父类中的方法,以满足子类的特殊需求。Java中一个类只能继承一个父类,但是可以通过多重继承和接口来实现类的复用。

示例1:

public class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }
}

以上代码展示了一个Animal类和其子类Dog,子类继承了父类中的eat()方法,并对其进行了重写。在使用子类Dog的eat()方法时,会优先执行子类中的方法。

示例2:

public interface UserDao {
    void save(User user);
    void delete(int id);
    User find(int id);
}

public interface UserService {
    void save(User user);
    void delete(int id);
    User find(int id);
}

以上代码展示了一个用户相关的Dao层接口和Service层接口,可以发现两者中定义的方法是几乎一致的。为了避免代码的重复,可以将两者的共同方法抽象成一个父接口BaseService,再分别让UserDao和UserService去继承它:

public interface BaseService<T> {
    void save(T t);
    void delete(int id);
    T find(int id);
}

public interface UserDao extends BaseService<User> {
}

public interface UserService extends BaseService<User> {
}

这样,BaseService就拥有了save、delete和find三个方法,UserDao和UserService就不用再重写这些代码了。

多态

多态是Java面向对象编程中的第三大核心概念,它允许不同的子类对象对同一消息作出响应。通过多态,程序可以根据具体的运行时情况动态地选择执行哪个方法,使得程序更加灵活和可扩展。多态可以通过方法覆盖和方法重载来实现。

示例1:

public class Shape {
    public void draw() {
        System.out.println("Shape is drawing");
    }
}

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Circle is drawing");
    }
}

public class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("Rect is drawing");
    }
}

public class Test {
    public static void main(String[] args) {
        Shape s1 = new Circle();
        Shape s2 = new Rect();
        s1.draw();  // Circle is drawing
        s2.draw();  // Rect is drawing
    }
}

以上代码展示了一个Shape类和其两个子类Circle和Rect,还有一个Test类,使用父类Shape的引用分别指向了Circle类和Rect类的实例,在这个过程中调用draw()方法时会根据实际的对象类型分别执行Circle和Rect中的draw()方法。

示例2:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

public class Test {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        int result1 = calculator.add(1, 2);
        int result2 = calculator.add(1, 2, 3);
        double result3 = calculator.add(1.0, 2.0);
        System.out.println(result1);  // 3
        System.out.println(result2);  // 6
        System.out.println(result3);  // 3.0
    }
}

以上代码展示了一个Calculator类,其中重载了add()方法,它可以接收2个int型参数、3个int型参数和2个double型参数,并返回对应的结果。在Test类中,我们分别调用了3个不同版本的add方法,并输出了结果。这个就是方法的重载,编译器会根据调用时传入的参数类型和数量来自动匹配正确的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的封装、继承和多态,你真的都懂了吗 - Python技术站

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

相关文章

  • xcode好用的插件(随时更新)

    Xcode好用的插件(随时更新) 作为iOS或macOS开发者,Xcode是我们必备的开发工具之一。而在Xcode的开发过程中,有很多插件可以提高我们的开发效率和舒适度。在这篇文章中,我将会介绍一些我个人认为好用的插件,并且会随时更新以保证插件的实用性和最新性。 Alcatraz Alcatraz是Xcode插件管理器,它可以帮助我们安装、更新或卸载插件,使…

    其他 2023年3月29日
    00
  • element.style覆盖样式因优先级顺序导致的解决方法

    解决方法:使用!important修饰符 问题背景 在网页开发中,样式的优先级是由优先级顺序来决定的。当多个样式定义冲突时,浏览器会根据特定的规则来确定最终生效的样式。然而,有时候我们希望通过JavaScript等动态方式修改元素的样式,但修改后的样式可能会被其他样式覆盖,导致修改无效。 解决方案 为了解决这个问题,可以使用CSS的!important修饰符…

    other 2023年6月28日
    00
  • 解析鸿蒙轻内核静态内存的使用

    解析鸿蒙轻内核静态内存的使用攻略 鸿蒙轻内核是华为公司开发的一种轻量级操作系统内核,它具有高效、安全和可靠的特点。在使用鸿蒙轻内核时,了解如何使用静态内存是非常重要的。本攻略将详细介绍解析鸿蒙轻内核静态内存的使用方法,并提供两个示例说明。 1. 静态内存的概念 静态内存是在编译时分配的内存,它在程序运行期间一直存在。与动态内存相比,静态内存的分配和释放是在编…

    other 2023年8月1日
    00
  • 小米手机如何开启开发者选项?小米手机开发者选项开启/关闭教程

    下面是详细的攻略步骤: 步骤一:进入“设置”界面 在小米手机桌面上找到“设置”图标,并点击进入。 步骤二:进入“关于手机”界面 在“设置”界面中,往下滑动找到“系统和设备”栏目,点击进入。 在“系统和设备”栏目中继续往下找到“关于手机”,点击进入。 步骤三:开启“开发者选项” 在“关于手机”界面中,找到“MIUI版本号”或“Android版本号”(不同手机型…

    other 2023年6月26日
    00
  • java的各种集合为什么不安全(List、Set、Map)以及代替方案

    Java中的各种集合(比如List、Set、Map等)在多线程环境下使用时有安全性问题。这是由于多线程环境下,多个线程同时对一个共享的集合进行读写操作时,可能会导致数据不一致的情况,从而影响应用程序的正确性和稳定性。下面分别对List、Set、Map这三种常用的集合类型进行详细说明。 List集合的安全性问题 List集合在多线程环境下的安全性问题主要体现在…

    other 2023年6月26日
    00
  • Linux怎么使用命令查看文件指定行数的内容?

    当我们需要查看一个文件中的指定行数内容时,可以通过使用Linux命令实现。下面是具体的步骤: 打开终端并登录Linux系统。 使用cd命令进入要查看的文件所在的目录。 使用cat命令结合grep命令查看文件指定行数的内容。例如,要查看文件中第5行的内容,可以使用下面的命令: cat filename | grep -n “^5:” 解析:cat filena…

    other 2023年6月27日
    00
  • Docker 部署分布式搜索引擎 Elastic Search的详细过程

    下面我来为你详细讲解“Docker 部署分布式搜索引擎 Elastic Search的详细过程”。 什么是 Elastic Search Elastic Search 是一个分布式的、可扩展的全文搜索引擎,可以帮助我们快速地索引、搜索数据。它基于Lucene搜索引擎构建,提供了 RESTful API 接口,可以对数据进行复杂的搜索。 Docker 安装 E…

    other 2023年6月27日
    00
  • javascript操作字符串的原生方法

    当我们在处理字符串时,经常需要使用一些函数。在JavaScript中,字符串是不可变的变量。这意味着一旦创建了一串字符串,您将无法更改其中任何一部分。但是,可以使用JavaScript中的许多原生字符串函数来转换,截取和重组字符串。 1. 字符串方法 字符串对象具有许多内置方法,用于字符串的处理。下面我们介绍一些常用的字符串方法: a. 字符串截取 slic…

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