类与对象、封装、继承、多态

news2024/10/9 2:26:11

文章目录

  • 一、类与对象
      • 什么是对象
      • 什么是类
      • 什么是面向对象
      • 如何定义类
      • 如何new对象
  • 二、封装
  • 三、继承
      • 多态
  • 五、总结

一、类与对象

什么是对象

对象:是一个一个实实在在的,具体的个体(实体)。比如:一个个人、一辆辆车、一本本书等等。

什么是类

类:一组具有相同特征的对象的抽象描述

如:

张三,510220199612013669,18256958568,158936587… 代表一个对象

李四,510220199612013667,18256958575,158936787… 代表一个对象

姓名、身份证号码、手机号码、qq号码… 对应一个类

此时就可以将这些对象抽取相同的特征(属性)封装为一个类

public class Person {
    String name;//名称
    String idCard;//身份证
    String phone;//手机
    String qq;//qq号
}

通俗而言:类就相当于施工图,我们可以根据施工图来知道一栋楼每套房子具有那些功能区(共同的特质),进而造出楼房。

在Java中根据施工图创建对象的关键字是 new。

从代码编写的角度而言,必须先创建类,才能创建出对象。

什么是面向对象

面向对象是一种思想或编程方式。

面向对象的过程是以“对象”为中心。

Scanner input = new Scanner(System.in);//input就是一个Scanner类的对象
 
System.out.print("请输入姓名:");
String name = input.next();
 
System.out.print("请输入年龄:");
int age = input.nextInt();
 
input.close();

与面向对象对应的另一种编程思想:面向过程。它是以函数为中心,实现代码就是通过函数调用把过程串起来。

public class ArrayTools{
    public static int max(int[] arr){
        int max = arr[0];
        for(int i=1; i<arr.length; i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    
    public static void print(int[] arr){
        for(int i=0; i<arr.length; i++){
            System.out.print(arr[i] + "  ");
        }
        System.out.println();
    }
    
    public static void main(String[] args){
        int[] arr = {2,4,5,3,1};
        print(arr);
        int result = max(arr);
        System.out.println("最大值:" + result);
    }
}

这一段代码,如果抛开ArrayTools类的定义,那么3个函数是独立的,它们互相调用即可,这种方式就是面向过程的编程思想。

另外一个场景描述,来理解面向对象与面向过程的区别:

把大象装进冰箱的问题?

面向过程面向对象
以步骤为中心,即以函数为中心以类/对象为中心
(1)把冰箱门打开 (2)把大象装进去 (3)把冰箱门关上(1)定义人这个类,包含pull,push功能,包含name属性 (2)定义冰箱这个类,包含open,close,save功能,包含size、brand等属性 (3)定义大象这个类,包含walk功能,包含weight属性 (4)定义测试类,包含main方法,在main方法中创建人、冰箱、大象的对象,调用对象的方法来完成

如何定义类

语法格式:

【①修饰符】 ②class ③类名{
    ④类的成员
}

如:

public class Person{
    String name; //类的成员
}

如何new对象

语法格式:

new 类名()

如果没有用变量引用对象,这个对象是一个“匿名对象”。匿名对象都是一次性,无法反复使用

public class Test {
    public static void main(String[] args) {
        new Person();//创建了一个Person类的对象
        System.out.println(new Person());//创建一个Person类的对象,并且打印这个对象
        //com.yang.dto.Person@3b07d329
        System.out.println(new Person());//又创建一个Person类的对象,并且打印这个对象
        //com.yang.dto.Person@41629346
        //上述三个对象是匿名对象,都是独立的,无法重复使用的
 
    }
}

如何用变量引用一个对象?

对象名本质上也是一个变量,是一个引用数据类型的变量。

public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p);
        System.out.println(p);
        System.out.println(p);
        //p这个对象可以被反复使用
        /*
        这里的p是对象名,同时也变量名
 
        Java的数据类型:
        (1)基本数据类型:byte,short,int,long,float,double,char,boolean
           int a = 1;
        (2)引用数据类型:数组、类等
            int[] arr = new int[5];
            Person p = new Person();
 
            int[],Person是数据类型,从这个角度来说,arr, p也是变量。
            因为这种变量引用的是一个对象,所以这个变量称为引用数据类型的变量,也称为对象名。
 
         */
    }
}

二、封装

封装(Encapsulation)是面向对象编程的三大基本特性之一,它指的是将数据(属性)和行为(方法)捆绑在一起,形成一个对象,并且只通过公开的接口来访问这个对象。封装的目的是为了保护对象的内部状态,防止外部直接访问和修改对象的数据,确保数据的完整性和程序的安全性。
在Java这样的面向对象语言中,封装通常通过使用访问修饰符来控制。例如,使用private关键字修饰的属性或方法只能在类的内部访问,而使用public关键字修饰的属性或方法则可以从类的任何外部访问。
下面是一个简单的Java代码例子,展示了封装的概念:

public class Car {
    // 私有属性,不能直接从类的外部访问
    private String color;
    private int speed;
    // 公开的方法,用于访问私有属性
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        if (speed >= 0 && speed <= 120) { // 限制速度的有效性
            this.speed = speed;
        } else {
            System.out.println("Invalid speed!");
        }
    }
    // 公开的方法,执行操作(如开车)
    public void drive() {
        System.out.println("The car is driving with speed " + speed + " km/h.");
    }
}
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        // 通过公共方法设置车辆颜色
        myCar.setColor("Red");
        // 通过公共方法获取车辆颜色
        System.out.println("Car color: " + myCar.getColor());
        // 通过公共方法设置车辆速度
        myCar.setSpeed(60);
        // 通过公共方法执行驾驶操作
        myCar.drive();
    }
}
 在这个例子中,Car类有两个私有属性 color 和 speed,以及几个公开的方法。这些公开的方法提供了控制车辆属性的安全接口。例如,setColor方法用于设置车辆的颜色,而 `setSpeed` 方法用于设置车辆的速度,同时检查速度是否在合理的范围内。这种方式确保了外部代码不能直接访问或修改 color 和 speed属性,必须通过 getColor、setColor、getSpeed 和 setSpeed这些公共方法来间接访问。这样的封装保证了类的内部状态不会被非法操作,同时也保护了代码的完整性。

三、继承

继承是面向对象编程的另一个核心概念,它允许新的类(子类)继承一个现有类(父类)的属性和方法。继承机制使得子类能够重用父类的代码,从而促进代码的复用和模块化。在Java等面向对象的语言中,继承是通过使用继承关键字(如Java中的extends)来实现的。
继承分为两种类型:1. 单继承:一个子类只能继承一个父类。2. 多继承:一个子类可以继承多个父类。不过,在Java这样的语言中,是不支持多继承的,每个类只能有一个基类。
下面是一个简单的Java代码例子,展示了单继承的概念:

// 父类
class Animal {
    protected String name;
    public Animal(String name) {
        this.name = name;
    }
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}
// 子类
class Dog extends Animal {
    public Dog(String name) {
        super(name); // 调用父类的构造函数
    }
    @Override
    public void makeSound() {
        System.out.println("The dog barks.");
    }
}
public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy");
        myDog.makeSound(); // 输出:The dog barks.
    }
}

在这个例子中,Dog 类继承了 Animal类。因此,Dog类自动拥有了 Animal类的所有公共属性和方法。Dog类还可以添加自己特有的属性和方法,或者覆盖(重写)父类的方法,如 makeSound 方法就被 Dog 类覆盖以实现狗的叫声。Animal类中的 name属性被标记为 protected,这意味着它可以在 Animal类的子类中访问。
继承的关系形象地表示了类的层次结构,父类像是模板,而子类则是基于父类模板创建的特定实例。这种模型有助于组织类,使得类的继承体系更加清晰和易于理解。

多态

多态(Polymorphism)是面向对象编程的第三个核心概念,它指的是同一个行为具有多个不同表现形式的特性。在面向对象编程中,多态通常通过继承和接口来实现。多态允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用不同的处理方式。
多态有两种主要形式:1. 编译时多态(静态多态):这是通过方法重载实现的,方法重载发生在编译时期,编译器根据方法的参数类型和数量来决定调用哪个方法。2. 运行时多态**(动态多态):这是通过继承和接口实现的,运行时根据对象的实际类型来决定调用哪个方法。
下面是一个简单的Java代码例子,展示了运行时多态的概念:

// 父类
class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}
// 子类
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks.");
    }
}
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The cat meows.");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        myAnimal.makeSound(); // 输出:The animal makes a sound.
        myDog.makeSound();    // 输出:The dog barks.
        myCat.makeSound();    // 输出:The cat meows.
        // 编译时多态示例
        makeSound(new Animal()); // 输出:The animal makes a sound.
        makeSound(new Dog());    // 输出:The dog barks.
        makeSound(new Cat());    // 输出:The cat meows.
    }
    // 运行时多态示例
    public static void makeSound(Animal animal) {
        animal.makeSound();
    }
}
  在这个例子中,Animal类有一个 makeSound方法,而 Dog和 Cat类都重写了 makeSound方法。当我们创建 `Animal` 类型的引用指向 Dog或 Cat对象,并调用 makeSound方法时,程序会根据对象的的实际类型来调用相应的 makeSound方法,这就是运行时多态。
  多态性的好处在于它提供了一个接口,使得对新增的子类能够做到“开闭原则”(即对扩展开放,对修改封闭),不需要修改现有的代码即可扩展新的功能。这在设计软件系统时非常有用,可以提高代码的可维护性和可扩展性。

五、总结

总的来说,封装、继承和多态是面向对象编程的三个基本特征,它们有助于创建可重用、可维护和灵活的软件系统。通过这些特征,开发者可以更好地组织代码,提高开发效率,满足不断变化的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】指针练习题

一、指针指向问题 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 结果为&#xff1a;2&#xff0c;5。&a是整个数组&#xff08;&a 1&#xff09;被强转为&#xff08;int*&am…

mujoco版本问题以及ERROR: Failed building wheel for mujoco-py

问题&#xff1a; ERROR: Failed building wheel for mujoco-py Failed to build mujoco-py ERROR: Could not build wheels for mujoco-py, which is required to install pyproject.toml-based projects 起因&#xff1a; 一开始我使用这个命令安装pip install mujoco_py&…

跨境卖家品牌出海要注意哪些方面

随着目前互联网的发展&#xff0c;市场由线下扩张到全国&#xff0c;再扩张到了全球&#xff0c;但是海外市场和国内并不相同跨境卖家品牌想要出海&#xff0c;需要注意多个方面&#xff0c;以确保能够在国际市场上成功立足并发展。以下是一些关键点&#xff1a; 首先想得拥有…

2-116 基于matlab的主成分分析(PCA)及累积总和(CUSUM)算法故障监测

基于matlab的主成分分析&#xff08;PCA&#xff09;及累积总和&#xff08;CUSUM&#xff09;算法故障监测&#xff0c;针对传统的多元统计分析方法对生产过程中微小故障检测不灵敏的问题&#xff0c;使用基于主元分析的累积和的微小故障检测方法进行故障监测&#xff0c;通过…

微信卸载后聊天记录全部消失,重新安装后有方法恢复吗?

微信作为我们日常沟通的重要工具&#xff0c;其聊天记录往往承载着许多珍贵的回忆和重要的信息。然而&#xff0c;在日常使用手机的过程中&#xff0c;我们时常会出于清理内存、解决软件故障或尝试新版本等原因&#xff0c;选择卸载并重新安装微信app。然而&#xff0c;这一简单…

国家公务员考试倒计时页面介绍

代码复刻 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>国家公务员考试倒计时</title><…

malloc(0)

malloc(0) 在操作系统底层的实现涉及内存分配管理的多个方面。下面是对 malloc(0) 的实现原理的详细解释&#xff1a; 1. 内存分配管理 操作系统通过内存管理子系统来处理内存分配请求&#xff0c;包括 malloc 函数。内存分配通常使用以下几种策略&#xff1a; 堆管理&#…

OpenFegin

文章目录 一、OpenFegin是什么&#xff1f;二、基本使用三、超时重试机制4.自定义超时重传机制五、底层实现 一、OpenFegin是什么&#xff1f; OpenFeign的全称为Spring Cloud OpenFeign(下文简称OpenFeign),是Spring Cloud团队开发的一款基于 Feign的框架&#xff0c;声明式W…

Overleaf 无法显示图片

问题描述 在Overleaf中的代码为&#xff1a; \begin{figure}\centering\includegraphics[width0.98\linewidth]{figures/test.png}\caption{This is a test.}\label{fig:test} \end{figure}但无法正常显示图片&#xff1a; 解决方案 修改编译模式为正常Normal而非快速Fast …

Python 工具库每日推荐【python-docx】

文章目录 引言Python 文档处理库的重要性今日推荐:Python-docx 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成个性化证书案例分析高级特性样式应用表格操作扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模…

八大排序--03插入排序

假设数组 arr[] {5,7,4,2,0,1,6},请通过插入排序的方式&#xff0c;实现从小到大排列&#xff1a; 方法&#xff1a;插入排序默认待排数组中的第一个是已经排好序的数值&#xff1b;定义游标从第二个数据开始不断向后方进行遍历&#xff0c;并将游标指向的数据不断插入到排好序…

探索Ultralytics YOLO11在视觉任务上的应用

前言 在人工智能持续发展的当下&#xff0c;有一点是确凿无疑的&#xff1a;模型正变得愈发优秀、快捷和智能。就在人们以为YOLO系列已登峰造极之时&#xff0c;Ultralytics推出了最新升级版——YOLO11。需要注意的是&#xff0c;这里不是YOLOv11&#xff0c;他们简化了命名方…

秋季猫咪掉毛严重怎么办?宠物空气净化器到底有没有用?

告别炎热的夏天&#xff0c;秋意随着家里猫咪新一轮的掉毛一起到来。我家两只布偶齐齐发力&#xff0c;疯狂掉毛&#xff0c;家里每个角落无一幸免。衣服上、地板上&#xff0c;肉眼可见家里的毛发量在不断增多&#xff0c;又陷入了日复一日的清理大战。除此之外&#xff0c;对…

erlang学习:Linux命令学习10

从百度网盘下载文件 共享百度网盘获得链接 https://pan.baidu.com/s/1iUOTAWr1SRlL2fBZ7lIV拿到链接之后在浏览器中进行下载&#xff0c;可以查看下载链接 右键这些文件即可得到下载链接 类似于长这样 https://bdbl-cm01.baidupcs.com/file/b02f72906b3d0d07130be625eabc76…

12306积分换的一等座还有零食

“12306积分换的一等座还有零食&#xff01;”这可真是个意外的惊喜呢&#xff01;平时积累的小积分&#xff0c;竟然能兑换到如此舒适的一等座车票&#xff0c;而且还附赠了精致的小零食&#xff0c;真是让人倍感贴心与满足。这样的体验&#xff0c;不仅让旅途变得更加惬意&am…

YOLOv8实战TT100K中国交通标志检测【数据集+YOLOv8模型+源码+PyQt5界面】

YOLOv8实战TT100k交通标志识别 文章目录 研究背景资源获取1.前言1.1 YOLO 系列&#xff1a;中国交通标志检测领域的璀璨明星1.2 Transformer与注意力机制&#xff1a;为中国交通标志检测注入新活力1.3 中国交通标志检测技术&#xff1a;迎接挑战&#xff0c;砥砺前行1.4 YOLOv8…

刷题训练之解决 FloodFill 算法

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握解决 FloodFill 算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#…

面试(十)

目录 一. 单元测试 二. FreeRTOS和裸机哪个实时性好&#xff1f; 三. 怎么判断某个程序的运行时间 四. 函数指针 五. 全局变量被线程使用冲突 5.1 使用互斥锁 5.2 使用读写锁 5.3 使用原子操作 六. 局部变量没有初始化是什么值 七. uint_8 n 255 , n等于多少 八. …

利基营销:如何为小众受众制定内容营销策略?AIGC大模型创新思维数字化转型商业模式专家培训讲师谈短视频内容社私域数字经济人工智能

了解利基营销 什么是利基营销&#xff1f; 简单来说&#xff0c;利基营销就是专注于特定范围的潜在客户群&#xff0c;而不是针对广泛的人群。 实际上&#xff0c;利基营销可以比作为拥有露营装备的人而不是所有热爱户外活动的人定制内容。露营爱好者会欣赏专门针对他们的需…

最佳实践(1)

1.Java 集合概览 Java 集合&#xff0c;也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要…