Java 每日一刊(第12期):面向对象

“任何复杂的程序,都可以通过分解成若干个简单的问题来解决。”

前言

这里是分享 Java 相关内容的专刊,每日一更。

本期将为大家带来以下内容:

  1. 对象
  2. 类与对象的关系
  3. Java 中的三种变量类型
  4. OOP 的三大特性

是对现实世界中某类事物的抽象,它包含了描述这些事物的属性和行为。在 Java 中,类是通过 class 关键字定义的,通常包含 成员变量(属性)方法(行为)。类的成员变量用于表示对象的状态,而方法则用于描述对象的行为。

一个 Java 类的基本结构如下:

  • 类名:用来标识类。
  • 成员变量:用于存储对象的属性。
  • 方法:描述类的行为,完成某种功能。
// 类名:Car
public class Car {// 成员变量(属性)private String brand;// 方法(行为)public void accelerate(int increment) {speed += increment;}
}

对象

对象 是类的实例化。类是一个抽象的概念,只有通过创建对象才能具体使用类中的属性和方法。对象可以拥有不同的状态(成员变量的不同值),但它们都是基于同一个类。

创建对象

对象的创建通过 new 关键字完成,new 关键字会调用类的构造方法来生成对象实例。例如:

Car myCar = new Car();  // 创建一个 Car 类的对象

在这段代码中,myCarCar 类的一个对象。它是类的具体表现形式,可以调用类中的方法并访问其属性。

构造方法

构造方法 是在创建对象时自动调用的特殊方法,主要用于初始化对象的属性。构造方法的名字与类名相同,且没有返回类型。构造方法可以接收参数,用于对新创建对象的成员变量赋值。

构造方法的主要功能是初始化对象的成员变量,它的定义类似于普通方法,但无返回值。每次创建类的对象时,都会调用构造方法。

默认构造方法:如果类中没有显式定义构造方法,Java 会自动提供一个无参数的默认构造方法。

public class Car {private String brand;private int speed;
}
// 默认构造方法自动生成:public Car() {}

自定义构造方法:可以通过手动定义构造方法来对对象的初始状态进行设置。

public class Car {private String brand;private int speed;// 自定义构造方法public Car(String brand, int speed) {this.brand = brand;this.speed = speed;}
}

构造方法的作用是为对象提供初始化的值。在实例化对象时,构造方法会被自动调用

Car myCar = new Car("Toyota", 0);  // 调用自定义的构造方法

这里创建了一个 Car 对象 myCar,其品牌被初始化为 "Toyota",速度为 0

类与对象的关系

:定义了一类事物的共同特征和行为。它只是一种描述,类似于模板。

对象:是类的具体实例。每个对象都有自己的状态,并且可以调用类中的方法。

可以将类看作是一种类型,而对象就是这种类型的实例。例如,Car 类定义了汽车的行为和属性,而实际创建的 myCar 对象则是某一辆具体的车。

Java 中的三种变量类型

在 Java 中,根据变量的声明位置和生命周期,变量分为两大类:成员变量和局部变量。其中,成员变量可以进一步细分为 实例变量和类变量(静态变量)

成员变量

成员变量是定义在类中的变量,但位于方法、构造函数或代码块之外。它们用于描述类或对象的状态,可以被类中的方法或构造函数访问和修改。

根据是否使用 static 关键字修饰,成员变量分为两种:实例变量和类变量(静态变量)。

实例变量

实例变量是没有 static 修饰的成员变量,属于类的每一个具体对象。每个对象都有自己独立的实例变量,表示对象的个体状态。

特点:

  • 归属于对象:每个对象都有自己的一份实例变量副本,多个对象之间互不影响。
  • 初始化:实例变量在对象创建时自动初始化。如果没有显式赋值,Java 会为实例变量赋予默认值(如 int 的默认值是 0,对象引用类型的默认值是 null)。
  • 生命周期:实例变量的生命周期从对象创建开始,到对象销毁为止。
  • 作用范围:实例变量可以在类的所有非静态方法中使用,并且通过对象进行访问。
public class Person {// 实例变量:每个 Person 对象有独立的 name 和 ageprivate String name;private int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}public void displayInfo() {System.out.println("姓名: " + name + ", 年龄: " + age);}
}

nameage 是实例变量,属于 Person 对象。每个 Person 对象都有自己独立的 nameage 值。

Person person1 = new Person("张三", 25);
Person person2 = new Person("李四", 30);person1.displayInfo();  // 输出: 姓名: 张三, 年龄: 25
person2.displayInfo();  // 输出: 姓名: 李四, 年龄: 30

在上面代码中,person1person2 是两个不同的对象,它们的实例变量 nameage 是独立的,互不影响。

类变量(静态变量)

类变量,也叫静态变量,是使用 static 关键字修饰的 成员变量。类变量属于整个类而不是某个具体的对象,因此所有对象共享同一个类变量。

类变量是在类中使用 static 关键字定义的成员变量。它们存储在类的静态内存区域中,并且只有一份存储空间,不随对象的创建而变化。

特点:

  • 归属于类:类变量属于类本身,而不是某个对象,所有实例共享这一个变量。
  • 初始化:类变量在类加载时初始化,只会初始化一次,且所有对象共享同一个值。
  • 生命周期:类变量的生命周期与类的生命周期相同,从类加载到类卸载期间存在。
  • 访问方式:类变量可以通过类名直接访问,也可以通过对象访问(但不推荐)。推荐通过类名访问以突出它与对象无关。
public class Employee {// 类变量public static int employeeCount = 0;  // 记录员工数量// 构造方法public Employee() {employeeCount++;  // 每创建一个 Employee 对象,数量加1}
}

employeeCount 是一个类变量,属于 Employee 类。所有 Employee 对象共享这个变量,每次创建一个新的 Employee 对象时,employeeCount 的值都会增加。

类变量可以通过类名直接访问,也可以通过对象访问(但通常不推荐)。

Employee emp1 = new Employee();
Employee emp2 = new Employee();System.out.println(Employee.employeeCount);  // 输出: 2

在这个示例中,无论我们创建多少个 Employee 对象,employeeCount 变量始终是共享的。当我们创建两个 Employee 对象后,employeeCount 的值变为 2,可以通过类名 Employee 来访问该变量。

局部变量

局部变量是定义在方法、构造函数或代码块中的变量,它们仅在其所在的代码块内有效,作用范围较小且生命周期较短。

特点:

  • 定义位置:局部变量在方法、构造函数或代码块内部声明,通常用于存储临时数据。
  • 作用范围:局部变量的作用范围仅限于方法或代码块,不能被类中的其他方法或代码块访问。
  • 初始化:局部变量必须在使用前显式初始化,否则会出现编译错误。
  • 生命周期:局部变量的生命周期是从方法或代码块执行时开始,到方法或代码块结束时销毁。
public void calculateSum() {int a = 10;  // 局部变量int b = 20;  // 局部变量int sum = a + b;System.out.println("和: " + sum);
}

calculateSum 方法中,absum 都是局部变量,它们只能在这个方法中使用,方法执行完毕后这些变量会被销毁,无法在其他地方使用。

public class Example {// 成员变量private int memberVar = 10;public void showDifference() {// 局部变量int localVar = 5;System.out.println("成员变量: " + memberVar);System.out.println("局部变量: " + localVar);}
}

在上述代码中,memberVar 是类的成员变量,它可以在整个类的非静态方法中使用,而 localVar 是局部变量,只能在 showDifference 方法内部使用,方法执行完后即销毁。

三种变量类型的对比

比较点成员变量(实例变量)类变量(静态变量)局部变量
归属属于对象属于类属于方法
初始化默认值有默认值有默认值必须显式初始化
生命周期对象存在时存在,随对象销毁随类加载和卸载方法执行期间存在,随方法结束而销毁
作用域整个类内部都可以访问整个类内部都可以访问,且类的所有实例共享仅在定义的代码块或方法内部有效
访问方式通过对象访问通过类名或对象访问不能在方法外部访问

OOP 的三大特性

Java 是一种面向对象编程(OOP)的语言,OOP 的常说的三大特性包括 封装、继承、多态。这些特性帮助开发者以更结构化和模块化的方式构建软件系统。下面将详细解释每一个特性。

封装(Encapsulation)

封装是面向对象编程的一个核心概念,它通过将对象的状态(属性)和行为(方法)隐藏起来,并提供公共的方法来访问它们。封装的目标是将对象的内部实现细节对外部隐藏,仅通过公开的接口与外界交互,从而保护对象的完整性,避免外部对对象内部状态的非法访问或不当修改。

访问修饰符控制访问权限

在 Java 中,封装通常通过访问修饰符来实现。Java 提供了四种访问修饰符,分别是:

修饰符含义
private只能在当前类中访问
default(没有修饰符)只能在同一包中访问
protected可以在同一包中或继承该类的子类中访问
public可以在任何地方访问

继承(Inheritance)

继承是 OOP 中用于重用代码的一种机制,通过继承,一个类可以继承另一个类的属性和方法,从而使子类拥有父类的功能。继承使得代码的复用性和可扩展性得到了提升。

子类与父类的关系

在继承中,已有的类被称为父类(superclass)或基类(base class),继承该类的类被称为子类(subclass)。子类不仅可以使用父类中已有的属性和方法,还可以添加自己的属性和方法,或者对父类的方法进行重写。

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

在上面的例子中,Dog 类继承了 Animal 类,并且拥有了 Animal 类的 eat 方法。

继承的好处与弊端

好处:

  • 代码重用:子类可以直接复用父类中的代码,不需要重复编写相同的代码。
  • 扩展性:子类可以在父类的基础上添加新的功能,增强了系统的可扩展性。

弊端:

  • 耦合性:子类与父类之间存在较强的耦合,如果父类的实现发生变化,可能会影响所有继承它的子类。
  • 继承层次复杂:多层继承会导致代码结构复杂,维护成本增加。

多态(Polymorphism)

多态是指同一个方法在不同对象上具有不同的行为。Java 中的多态分为两种:

  • 编译时多态(通过方法重载实现)
  • 运行时多态(通过方法重写和动态绑定实现)。
方法重载(Overloading)

在同一个类中,多个方法拥有相同的名字,但参数列表不同(参数的类型或数量不同),这就是方法重载。重载是编译时多态的表现。

public class Calculator {public int add(int a, int b) {return a + b;}public double add(double a, double b) {return a + b;}
}
方法重写(Overriding)

子类重写父类的方法,提供自己的实现版本,这就是方法重写。重写是运行时多态的表现。

class Animal {public void sound() {System.out.println("Animal makes sound");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}
运行时多态和编译时多态

编译时多态(Compile-time Polymorphism):通过方法重载实现,方法的调用在编译时决定。

运行时多态(Runtime Polymorphism):通过方法重写和动态绑定实现,在运行时根据对象的实际类型来决定调用哪个方法。

Animal animal = new Dog();
animal.sound(); // 输出 "Dog barks"

在这个例子中,虽然编译时 animal 被声明为 Animal 类型,但在运行时实际是 Dog 对象,因此调用的是 Dog 类的 sound 方法。

本期小知识

多态 (Polymorphism) 是面向对象编程的核心概念之一。Java 中有两种绑定方式:静态绑定 (Static Binding) 和动态绑定 (Dynamic Binding)。

静态绑定:在编译时确定调用的方法。这通常用于静态方法、私有方法或 final 方法。

动态绑定:在运行时确定调用的方法。这用于实例方法的调用,Java 默认会基于对象的实际类型调用对应的方法。

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

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

相关文章

AntFlow系列教程之流程拒绝

这是开源项目AntFlow的一个系统入门使用教程.AntFlow是一款开源免费的企业级低代码工作流引擎.仿照钉钉设计,极大降低流程设计、开发和维护成本。详细介绍请查看历史文章:AntFlow开源仿钉钉低代码工作流平台集成RuoYi版本来啦 流程拒绝和流程同意提交的参数是一样的…

基于milvus数据库的RAG-Demo

1.上传文本并将文本向量化 import os from django.conf import settings from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter from langchain.vectorstores import Chroma from l…

【JAVA入门】Day47 - 线程

【JAVA入门】Day47 - 线程 文章目录 【JAVA入门】Day47 - 线程一、并发和并行二、多线程的实现方式2.1 继承 Thread 类的方式2.2 实现 Runnable 接口的方式2.3 利用 Callable 接口实现 三、Thread 类中常见的成员方法四、线程的调度和优先级4.1 抢占式调度4.2 优先级4.3 守护线…

如何不终止容器退出Docker Bash会话

如何不终止容器退出Docker Bash会话 💖The Begin💖点点关注,收藏不迷路💖 当通过docker exec进入Docker容器的bash会话后,如果想退出但不停止容器,可以使用快捷键组合: 按下Ctrl+P然后紧接着按下Ctrl+Q。 这个操作会让你从bash会话中“分离”出来,但容器会继续运行…

Zabbix 部署----安装 Zabbix(监控服务器)

目录 zabbix 官网: 1、准备一台虚拟机 1.整理配置yum源(192.xx.xx.10) 2.设置主机名(192.xx.xx.10) 3.防火墙 4.selinux 2、准备Zabbix-repo 使用阿里提供的zabbixYUM源 3、安装Zabbix服务器 4、初始化数据库 1.安装数据库 2.启动数据库 3.授权zabbix账号 4.初始化…

解决使用nvm ls命令没有出现*的问题

一、引言 在输命令的时候不知道手误写了什么导致node命令用不了,查看环境变量配的nvm对应的路径没问题,试过网上说的修改文件夹名字但是没有用!! 输入 nvm ls 显示已下载的node版本,发现前面没有* 输入nvm use 使用其中…

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python,且能在Pycharm中编译Python程序并运行。 但是,在macOS终端,运行Python,报错。 首先要确认你在macOS系统下,是否安装了Python。 如果安…

去噪扩散隐式模型

dataset_name "datasets/oxford-102-flowers/" dataset_repetitions 2 # 数据集重复 num_epochs 25 image_size 64 # 模型训练和生成图像的大小 # KID 内核初始距离 kid_image_size 75 # 从噪声中逐步“去噪”或“扩散”到最终图像所需的步骤数。 kid_diffusi…

NEMESIS: NORMALIZING THE SOFT-PROMPT VECTORS OF VISION-LANGUAGE MODELS

文章汇总 发现的现象 动机的描述 Norm增加会导致性能下降,Norm降低会导致性能上升。于是作者提出: 我们需要规范化VLMs中的软提示吗? 实验验证 在左图中的紫色块中可以看到,随着模型性能的上升,Norm value会不断下降。 解决…

C语言 | Leetcode C语言题解之第419题棋盘上的战舰

题目&#xff1a; 题解&#xff1a; int countBattleships(char** board, int boardSize, int* boardColSize){int row boardSize;int col boardColSize[0];int ans 0;for (int i 0; i < row; i) {for (int j 0; j < col; j) {if (board[i][j] X) {if (i > 0 &…

ant vue3 datePicker默认显示英文

改前&#xff1a; 改后&#xff1a; 处理方法&#xff1a; 在App.vue页加上以下导入即可 import dayjs from dayjs; import dayjs/locale/zh-cn dayjs.locale(zh-cn); 如图&#xff1a;

电力电塔电线缺陷检测数据集 voc yolo

电力 电塔电线缺陷检测数据集 10000张 带标注 voc yolo 电力电塔电线缺陷检测数据集 数据集描述 该数据集旨在用于电力电塔和电线的缺陷检测任务&#xff0c;涵盖多种常见的缺陷类型。数据集包含了大量的图像及其对应的标注信息&#xff0c;可用于训练计算机视觉模型&#x…

如何搭建虚拟机Ubuntu?

1.创建新虚拟机 2.进入新建虚拟机向导&#xff0c;选择稍后安装 3. 选择Linux中的Ubuntu 4.为虚拟机命名设置路径 5. 设置磁盘容量大小 6.选择自定义硬件 7.设置设备状态 8.完成Ubuntu虚拟机创建

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL24

边沿检测 有一个缓慢变化的1bit信号a&#xff0c;编写一个程序检测a信号的上升沿给出指示信号rise&#xff0c;当a信号出现下降沿时给出指示信号down。 注&#xff1a;rise,down应为单脉冲信号&#xff0c;在相应边沿出现时的下一个时钟为高&#xff0c;之后恢复到0&#xff0…

Pandas_数据结构详解

1.创建DataFrame对象 概述 DataFrame是一个表格型的结构化数据结构&#xff0c;它含有一组或多组有序的列&#xff08;Series&#xff09;&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔值等&#xff09;。 DataFrame是Pandas中的最基本的数据结构对象&am…

【kafka-04】kafka线上问题以及高效原理

Kafka系列整体栏目 内容链接地址【一】afka安装和基本核心概念https://zhenghuisheng.blog.csdn.net/article/details/142213307【二】kafka集群搭建https://zhenghuisheng.blog.csdn.net/article/details/142253288【三】springboot整合kafka以及核心参数详解https://zhenghui…

中间件安全(二)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 前文链接&#xff1a;中间件安全&#xff08;一&#xff09; 本文主要讲解Couchdb数据库未授权越权漏洞&#xff08;CVE-2017-12635&#xff09;。 靶场链接&#xff1a;Vu…

【内网渗透】最保姆级的春秋云镜Privilege打靶笔记

目录 flag1 flag2 flag3 flag4 flag1 fscan扫外网 访问./www.zip拿到源码 tools/content-log.php存在任意文件读取 根据提示读到Jenkins初始管理员密码 ./tools/content-log.php?logfile../../../../../../../../../ProgramData/Jenkins/.jenkins/secrets/initialAdminP…

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…

Spring Boot 整合 MyBatis 的详细步骤(两种方式)

1. Spring Boot 配置 MyBatis 的详细步骤 1、首先&#xff0c;我们创建相关测试的数据库&#xff0c;数据表。如下&#xff1a; CREATE DATABASE springboot_mybatis USE springboot_mybatisCREATE TABLE monster ( id int not null auto_increment, age int not null, birthda…