探秘面向对象编程:封装、继承、多态的精髓与实践

简介: 探秘面向对象编程:封装、继承、多态的精髓与实践

面向对象(Object-Oriented)是一种编程范式,它将程序设计看作是一组对象的集合,每个对象都有自己的属性和行为,并且能够相互通信和交互。面向对象编程(OOP)是一种强大而灵活的编程方法,它将现实世界的概念映射到程序,思想:代码复用性好,扩展性好,维护性好,代码冗余低设计中,使得代码更加模块化、可维护和易扩展。

1.创建类

类中包含:

静态的【属性,成员变量】

动态的【行为,成员方法】

修饰词  class  类名  {
       //属性信息
       //行为信息
}
//学生类
public class Student{
       //属性信息
       String name;
       int age;
       //行为信息
       public viod study(){
            System.out.println("在学习....");
       }
}

2.使用类创建对象

类型【类名】 引用名称 = new 类名([参数]);
//对象
Student student = new Student();

3.通过对象访问类中的成员

属性:对象.属性名;

对属性进行赋值: 对象.属性名=值;

行为:对象.方法名();

student.name;
student.name = "zs";
student.study();

4.封装

封装是面向对象编程的一种重要特性,它是指将类的数据(属性、成员变量)和操作(方法、行为)组合成一个单一的单元,从而隐藏了实现细节,使得外部只能通过公共接口访问对象的数据和行为。在封装中,类内部的实现细节对外部是不可见的,而只有暴露的公共接口可以被访问。

1.实现封装的方式

使用访问修饰符

Java中的访问修饰符(public、private、protected等)可以控制成员变量和方法的访问权限。通常将成员变量声明为私有(private),并提供公共的访问方法(get和set)来访问和修改数据。

提供公共接口

类应该定义一组公共的方法作为外部访问点,这些方法对外暴露类的功能。私有的实现细节应该隐藏在类的内部。

数据封装

将相关的数据和行为打包在一个类中,使得数据和行为紧密联系在一起,同时封装数据的改变可能导致的行为变化。

示例代码:

public class Student{
     private String name;
     private int age;
    //get,set方法
    public String getName(){
        return name;
    }
    public void setName(String name) {
        this.name= name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //行为
    public void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
    public static void main(String[] args) {
        //创建对象
        Student student = new Student("John", 20);
        // 使用get访问数据
        System.out.println("Name: " + student.getName());
        System.out.println("Age: " + student.getAge());
        // 使用set修改数据
        student.setAge(21);
        //调用方法
        student.displayInfo();
    }
}

2.优势

数据保护和安全性

通过封装,数据被隐藏在类的内部,不会被外部直接访问或修改。这种保护机制确保了数据的安全性,防止了意外或恶意的数据篡改。只有通过类的公共方法才能访问和修改数据,从而控制了数据的访问权限。

代码模块化

封装使得代码可以以模块化的方式组织。每个类都是一个独立的单元,负责处理自己的数据和行为。这种模块化使得代码更易于理解和维护,降低了代码的复杂性。

代码重用

封装提供了接口来访问类的功能,其他代码可以直接使用这些接口而不需要了解类的内部实现。这种高度抽象的接口使得代码的重用更加容易,减少了代码的冗余。

系统扩展性

通过封装,类的内部实现可以随时更改,而不会影响到外部代码。只要保持类的公共接口不变,其他代码不需要修改,从而提高了系统的扩展性和灵活性。

5.继承

继承是面向对象编程中的一个重要特性,它允许一个类(子类)从另一个类(父类)那里继承属性和方法。子类拥有父类的所有公共属性和方法,并且可以在此基础上添加新的属性和方法。通过继承,子类可以重用父类的代码,避免重复编写相同的功能。

1.实现继承的方式

关键字extends

Java和许多其他面向对象编程语言使用关键字extends来实现继承。子类通过extends关键字指定父类,从而继承父类的属性和方法。

单继承

Java中,一个类只能继承一个父类,这称为单继承。这样的设计避免了多重继承可能引发的歧义和复杂性。

多层继承

子类可以作为其他类的父类,形成多层继承关系。这种多层继承使得类的层次结构更加丰富。

示例代码:

// 父类Animal
public class Animal {
    public void sound() {
        System.out.println("动物发出声音");
    }
}
// 子类Dog继承自Animal
public class Dog extends Animal {
    @Override//重写方法标志
    public void sound() {
        System.out.println("汪汪汪");
    }
    public void wagTail() {
        System.out.println("摇尾巴");
    }
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        // 调用继承自父类的方法
        dog.sound();
        // 调用子类自己添加的方法
        dog.wagTail();
    }
}

2.优势

代码复用

继承允许子类重用父类的代码,避免了重复编写相同功能的情况。子类可以直接使用父类的方法和属性,从而提高了代码的重用性和可维护性。

类层次的建立

通过继承,可以建立类的层次结构。在这种层次结构中,可以将共同特征的类归为同一个父类,形成一个类的层次结构。这种层次结构使得代码的组织更加清晰,提高了代码的可读性。

可扩展性

继承允许在现有类的基础上创建新的子类,可以在子类中添加新的属性和方法,从而实现类的扩展。这种可扩展性使得程序更加灵活,能够应对未来的需求变化。

6.多态

多态是指通过一个统一的接口来访问一组不同的对象。在多态中,子类可以在不改变父类接口的情况下,重写父类的方法,从而实现了不同的行为。多态允许我们将对象视为其父类类型,而在运行时根据实际对象类型来调用相应的方法。

1.实现多态的方式

方法重写

子类可以重写父类的方法,从而改变父类方法的行为。在运行时,会根据实际对象的类型来调用对应的方法。

父类引用指向子类对象

父类的引用可以指向子类的对象。通过父类引用,我们可以使用父类的方法,但在运行时实际上会调用子类的方法。

代码示例:

// 父类Animal
public class Animal {
    void sound() {
        System.out.println("动物发出声音");
    }
}
// 子类Dog继承自Animal
public class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("汪汪汪");
    }
}
// 子类Cat继承自Animal
public class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("喵喵喵");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        // 调用重写后的方法
        dog.sound();
        cat.sound();
    }
}

2.优势

代码灵活性

多态允许我们在运行时决定调用哪个方法,从而使代码更加灵活和适应不同的场景。通过多态,我们可以使用一个通用的接口来处理不同的对象,无需关心具体的对象类型。

代码可扩展性

多态使得代码更易于扩展和维护。当需要增加新的子类时,我们只需要添加新的子类并重写父类的方法,而无需修改现有代码。

代码可读性

多态可以使代码更加简洁和易读。通过使用统一的接口,我们可以隐藏对象的具体实现细节,从而使代码更加简洁和易于理解。

7.总结

面向对象编程的核心思想是将现实世界的实体映射到代码中,通过封装、继承和多态等特性实现代码的组织、重用和灵活性。合理地应用面向对象编程,可以提高代码的安全性、可读性和可维护性,是编写优秀、健壮的软件系统的关键要素。在实际开发中,熟练运用面向对象编程的原则和技巧,可以极大地提高开发效率和代码质量。

相关文章
|
SQL 运维 监控
阿里巴巴DevOps实践指南(二十一)| 全景监控
随着云原生技术的发展与演进,微服务和容器化技术成为大型分布式 IT 架构的必然选择。新技术在让 IT 系统变得更敏捷、健壮、高性能的同时,也带来了更高的技术架构复杂度,给应用监控带来了前所未有的挑战。
阿里巴巴DevOps实践指南(二十一)| 全景监控
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch CIFAR10图像分类 Swin Transformer篇(一)
Pytorch CIFAR10图像分类 Swin Transformer篇(一)
|
6月前
|
存储 XML JSON
Activiti 7 核心数据库表概览及流程生命周期中的作用
Activiti 7 工作流引擎通过约25张核心数据库表实现流程定义、运行时状态、历史记录与身份数据的存储。表名以ACT_开头,后跟标识用途的字母组合(如RE表示Repository静态信息,RU表示Runtime动态数据)。流程启动时在运行时表登记数据,任务执行中更新关联信息,结束时清理运行时记录并完善历史记录。各表分工明确且逻辑紧密关联,确保高效运行与完整留痕的平衡。掌握这些表的作用和关联有助于深入理解Activiti底层原理及进行高级应用开发。
420 0
|
XML Java Android开发
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
1193 1
|
前端开发 JavaScript 小程序
【JS】async、await异常捕获,这样做才完美
本文通过生动的例子说明了在JavaScript中使用async/await时,不捕获异常可能导致的问题,并介绍了三种处理异步调用异常的方法:try-catch、使用Promise的`.catch`以及`await-to-js`插件库。通过这些方法,可以有效避免异常导致的程序中断,提升代码的健壮性和可读性。
274 0
【JS】async、await异常捕获,这样做才完美
|
API 项目管理 调度
OpenProject 是一个基于网络的项目管理软件。其主要特点是:
OpenProject 是一个基于网络的项目管理软件。其主要特点是:
408 1
|
关系型数据库 MySQL
【XAMPP启动mysql报错】Port 3306 in use by ““C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld“……
【XAMPP启动mysql报错】Port 3306 in use by ““C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld“……
|
运维 算法 Java
Elastic-Job源码解读
文章以任务初始化、任务触发、分片策略、分布式为切入点讲述Elastic Job的源码,一方面自己总结记录、另一方面希望可以帮助到其他的开发者快读理解Elastic Job工作原理。
1380 0
|
设计模式 测试技术 数据库
【中级软件设计师】—数据库设计和UML考点总结篇(七)
【中级软件设计师】—数据库设计和UML考点总结篇(七)