Java基础(十二)面向对象编程 OOP

一、抽象数据类型

1.面向对象基本概念

1. 面向对象

面向对象程序设计(OOP)是一种基于对象概念的软件开发方法,是目前软件开发的主流方式。

常见面向对象的语言:C++ 、Python 、Java
常见面向过程的语言:C

面向对象的三大特征:封装、继承、多态。

封装(Encapsulation):封装是面向对象编程的核心概念之一。它指的是将数据和操作封装在类中,并限制对数据的直接访问。通过封装,可以隐藏实现细节,提高代码的安全性和可维护性。

继承(Inheritance):继承是面向对象编程中实现代码重用的机制之一。通过继承,一个类可以继承另一个类的属性和方法,并且可以添加新的属性和方法。这样可以实现代码的层次化组织,提高代码的可复用性。

多态(Polymorphism):多态是面向对象编程中的一个特性,它允许使用统一的接口处理不同的对象类型。多态可以通过继承和接口实现,通过动态绑定在运行时确定要调用的方法。这种灵活性有助于编写可扩展的代码。

2. 对象

在面向对象的世界中认为万事万物皆对象。对象就是具体的某一事物。

3. 类.

类是具有相同的状态和相同的行为的一组对象的集合。


类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。


2. 定义类

1. 定义类

类的定义由关键字 class 开始,后面跟着类名。以下是一个简单的类的定义示例:

public class Car {// 类的成员变量String model;int year;// 类的方法public void start() {// 方法体System.out.println("Car started");}
}

2. 类的成员

类的成员包括成员变量和方法。成员变量是类的属性,用于存储对象的状态。方法是类的行为,用于定义对象的操作。

在上面的示例中,modelyear 是类的成员变量,而 start() 是类的方法。

3. 静态初始化

静态初始化是指在类加载时对静态成员变量进行初始化,在整个程序生命周期内只执行一次。可以使用静态代码块来实现静态初始化。

以下是一个静态初始化的示例:

public class MyClass {static int myStaticVariable;static {myStaticVariable = 10;System.out.println("Static initialization block executed");}
}

4. 实例初始化

实例初始化是指在每次创建对象时对实例成员变量进行初始化。可以使用构造函数或实例初始化块来实现实例初始化。

以下是一个实例初始化的示例:

public class MyClass {int myInstanceVariable;{myInstanceVariable = 20;System.out.println("Instance initialization block executed");}public MyClass() {System.out.println("Constructor executed");}
}

4. 构造函数

构造函数是一种特殊类型的方法,用于创建和初始化对象。它具有与类相同的名称,并且没有返回类型。

以下是一个具有构造函数的示例:

public class Person {String name;public Person(String n) {name = n;System.out.println("Person object created with name: " + name);}
}

3. static 作用

static 关键字表示静态成员,它可以应用于成员变量、方法和代码块。静态成员属于类本身,而不是对象实例。它们在类加载时被初始化,并且可以通过类名直接访问。

以下是静态成员的示例:

public class MyClass {static int myStaticVariable = 5;static void myStaticMethod() {System.out.println("Static method");}
}

实例(非静态/实例)

实例或非静态成员属于对象实例,每个对象都拥有自己的一份实例成员变量。只有通过创建对象的实例才能访问实例成员。

以下是实例成员的示例:

public class MyClass {int myInstanceVariable = 10;void myInstanceMethod() {System.out.println("Instance method");}
}

4. 构造重载

构造重载是指在同一个类中定义多个具有不同参数列表的构造函数。这样可以根据参数的不同创建不同的对象。

以下是构造重载的示例:

public class DemoPerson {public String name;public String gender;public int age;// 第一种构造方法重载:定义无参构造方法public DemoPerson() {this.name = "小羊呆呆";System.out.println(name);}// 第二种构造方法重载:定义带参构造方法public DemoPerson(String name) {System.out.println("你好!" + name);this.name = name;}// 第一种work() 方法重载,无参的 work() 方法public void work() {System.out.println(this.name + "的工作理念是:工作让生活更美好!");}// 第二种work() 方法重载,带参的 work() 方法public void work(String content) {System.out.println(this.name + "," + this.gender + "," + this.age + "岁的工作理念是:" + content);}public static void main(String[] args) {DemoPerson p1 = new DemoPerson("犯困桃子");DemoPerson p2 = new DemoPerson();p2.name = "康盛科技人才";p2.gender = "男";p2.age = 20;p1.work();p2.work("冒泡、摸鱼、打游戏。");}
}

输出:

你好!犯困桃子
小羊呆呆
犯困桃子的工作理念是:工作让生活更美好!
康盛科技人才,男,20岁的工作理念是:冒泡、摸鱼、打游戏。

5. 实例化的过程

实例化是指创建对象的过程。在实例化过程中,首先会进行静态初始化(只执行一次),然后进行实例初始化,最后执行构造函数。

以下是实例化过程的示例:

public class MyClass {static int myStaticVariable = 5;int myInstanceVariable;static {System.out.println("Static initialization block executed");}{System.out.println("Instance initialization block executed");}public MyClass() {System.out.println("Constructor executed");}public static void main(String[] args) {MyClass obj = new MyClass();}
}

输出:

Static initialization block executed
Instance initialization block executed
Constructor executed

6. 遮蔽(shadowing)

遮蔽是指在子类或局部作用域中使用与父类或外部作用域中同名的变量,从而隐藏了原有的变量。

以下是遮蔽的示例:

public class ParentClass {int x = 10;public void printX() {int x = 20;  // 局部变量 x 遮蔽了成员变量 xSystem.out.println("Local x: " + x);System.out.println("Instance x: " + this.x);}
}public class ParentClass {int x = 10;// 遮蔽(shadowing)public void printX(int x) {System.out.println("Local x: " + x);System.out.println("例子 x: " + this.x);}public static void main(String[] args) {ParentClass p = new ParentClass();p.x = 200;p.printX(20);}
}
/*
Local x: 20
例子 x: 200
*/public class ChildClass extends ParentClass {int x = 30;public void printX() {int x = 40;  // 局部变量 x 遮蔽了父类的成员变量 xSystem.out.println("Local x: " + x);System.out.println("Instance x: " + this.x);System.out.println("Parent x: " + super.x);}
}

1. this 解决遮蔽问题

this 关键字可以用于引用当前对象,通过 this 可以访问当前对象的成员变量。

以下是使用 this 解决遮蔽问题的示例:

public class ParentClass {int x = 10;public void printX() {int x = 20;System.out.println("Local x: " + x);System.out.println("Instance x: " + this.x);  // 使用 this 引用成员变量 x}
}

2. className.staticField 解决遮蔽问题

通过使用类名限定的方式,可以访问被遮蔽的成员变量。

以下是使用类名限定解决遮蔽问题的示例:

public class ParentClass {static int x = 10;public void printX() {int x = 20;System.out.println("Local x: " + x);System.out.println("Static x: " + ParentClass.x);  // 使用类名限定访问静态变量 x}
}

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

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

相关文章

计算机竞赛 python+opencv+机器学习车牌识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…

使用插件实现pdf,word预览功能

效果 代码&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

如何在Vue表单处理中实现表单的条件渲染

在Vue开发中&#xff0c;我们经常会遇到需要根据某些条件来渲染表单的情况。这种情况下&#xff0c;我们需要灵活地根据条件来展示或隐藏一些表单字段。本文将介绍如何在Vue中实现表单的条件渲染&#xff0c;并提供了代码示例。 一、使用v-if指令实现简单的条件渲染 在Vue中&a…

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统&#xff0c;而个人电脑处理器产商较为单一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同时个人电脑产商均使用 Intel 或 AMD 制造的处理器&#xff0c;业界形成了统一的总线/硬件接口标准…

JavaScript进阶 第二天

深入对象内置构造函数 一. 深入对象 创建对象三种方式构造函数实例成员&静态成员 1.1 创建对象三种方式 ① 利用对象字面量创建对象 const o {name: 哈哈 } ② 利用new Object 创建对象 const o new Object({ name: 哈哈 }) ③ 构造函数创建对象 1.2 构造函数 …

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…

认识Transformer:入门知识

视频链接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目录 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …

浅谈 EMP-SSL + 代码解读:自监督对比学习的一种极简主义风

论文链接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代码&#xff1a;https://github.com/tsb0601/EMP-SSL 其他学习链接&#xff1a;突破自监督学习效率极限&#xff01;马毅、LeCun联合发布EMP-SSL&#xff1a;无需花哨trick&#xff0c;30个epoch即可实现SOTA 主要…

08 qt进程和网络编程(cs模型)

一 、qt进程 qt中进程最主要的任务就是启动额外应用程序 并且跟他们之间通信。进程类为QProcess 定义用途Header:#include qmake:QT += coreInherits:QIODevice//继承于IO设备类1.1 QProcess基本使用 第一步:创建一个QProcess对象 // process = new QProcess(this); //说明…

资讯速递 | ArkUI-X 预览版已正式开源!

OpenHarmony项目群技术指导委员会&#xff08;以下简称“TSC”&#xff09;-跨平台应用开发框架TSG所孵化项目 —— ArkUI-X&#xff0c;近期已正式开源 &#xff0c;开发者基于一套主代码&#xff0c;就可以将在OpenHarmony上开发的精美、高性能应用同时运行在Android、iOS等其…

LNMP环境搭建wordpress以及跳转后台报404解决

基于上文配置好的LNMP环境继续搭建wordpress 目录 一.到官网下载tar.gz包&#xff0c;并上传到Linux上&#xff0c;也可以通过复制链接地址进行下载 二. 将wordpress中的所有文件移动到你nginx.conf中指定目录中 三.为wordpress配置数据库 四.到浏览器进行注册 1.刚开始…

maven编译始终提示无效的目标发行版的解决方法

摘自个人印象笔记2021-05-07&#xff1a;https://app.yinxiang.com/fx/55e1d5f4-aeea-446a-a768-0f1a48195f5b(图显示不完整可查看原笔记内容)1&#xff1a;确保IDE中的编译版本正确 在idea中&#xff0c;主要看项目属性中和setting的java compiler中对应的jdk版本是否正确&…

好用的安卓手机投屏到mac分享

工具推荐&#xff1a;scrcpy github地址&#xff1a;https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境&#xff0c;打开terminal&#xff0c;执行以下命令&#xff0c;没有brew的先安装brew brew install scrcpy brew install android-platform-too…

学习 Iterator 迭代器

今天看到一个面试题&#xff0c; 让下面解构赋值成立。 let [a,b] {a:1,b:2} 如果我们直接在浏览器输出这行代码&#xff0c;会直接报错&#xff0c;说是 {a:1,b:2} 不能迭代。 看了es6文档后&#xff0c;具有迭代器的就一下几种类型&#xff0c;没有Object类型&#xff0c;…

404. 左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输出: 0提示: 节点…

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…

go web框架 gin-gonic源码解读02————router

go web框架 gin-gonic源码解读02————router 本来想先写context&#xff0c;但是发现context能简单讲讲的东西不多&#xff0c;就准备直接和router合在一起讲好了 router是web服务的路由&#xff0c;是指讲来自客户端的http请求与服务器端的处理逻辑或者资源相映射的机制。&…

react实现对数组做增删改操作自定义hook

需求 实现对数组的增删改操作。 实现 import { useState } from react;const useArray (currList) > {const [list, setList] useState(currList);// 增const addItem (item) > {setList([...list, item]);};// 删const removeItem (idx) > {const _arr [...l…

实战指南,SpringBoot + Mybatis 如何对接多数据源

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态Sql标签解析 从零开始&#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器…