【Java入门合集】第三章面向对象编程(下)

news2024/11/24 18:31:59

【Java入门合集】第三章面向对象编程(下)


博主:命运之光
专栏:JAVA入门

学习目标
理解面向对象三大主要特征;
掌握类与对象的区别与使用;
掌握类中构造方法以及构造方法重载的概念及使用;
掌握包的定义、包的作用等;
掌握方法的参数传递规则。

在这里插入图片描述

目录

  • 【Java入门合集】第三章面向对象编程(下)
    • 封装初步分析
      • 什么是封装?
    • 封装的好处
      • 信息的封装和隐藏
      • 封装的使用
    • 构造方法
      • 构造方法的定义
    • 关键字this
      • 调用本类属性
      • 调用本类方法
      • 包的定义
      • 包的导入
    • 方法及参数传递
      • 参数传递


封装初步分析

什么是封装?

本意是把物体打包装到箱子里,然后封起来。

引申含义:把一系列功能打包到一台设备里,提供使用这些功能的界面
常见的封装体:汽车,电脑,洗衣机等。

封装的好处

  • 提高安全性
  • 提高复用性
  • 将复杂的事情简单化

Java中哪些内容体现了封装?
类、方法……

🍓🍓封装是面向对象编程的特点之一,将对象的属性和方法封装起来,其载体是,类通常对客户隐藏其实现细节,这就是封装的思想。
🍓🍓案例:观察没有封装的代码。

class Book { 			// 定义一个新的类
    String title; 		// 书的名字
    double price; 		// 书的价格
    public void getInfo() { 			// 此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class text1 {
    public static void main(String args[]) {
        Book book = new Book();		// 声明并实例化对象
        book.title = "Java开发";		// 设置属性内容
        book.price = -89.9;		// 设置属性内容
        book.getInfo();			// 调用方法
    }
}

在这里插入图片描述

此时代码没有任何语法错误,但在逻辑上是有错误的,因为没有任何一本书的价钱会是负数,为了避免这种错误的出现,需要将此属性设置为“私有属性(private)”

🍓🍓案例:将成员属性设置为私有属性(private关键字)。

class Book { 			// 定义一个新的类
    private String title; 		// 书的名字
    private double price; 		// 书的价格
    public void getInfo() { 			// 此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class test1{
    public static void main(String args[]) {
        Book book = new Book();		// 声明并实例化对象
        book.title = "Java开发";		// 设置属性内容
        book.price = -89.9;		// 设置属性内容
        book.getInfo();			// 调用方法
    }
}

在这里插入图片描述

编译出现错误,title,price属性用了private关键字,这样就表示这两个属性只能在Book类被访问,其他类不能直接进行访问。

信息的封装和隐藏

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXXX()和setXXX()实现对该属性的操作,以实现下述目的:

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作
  • 便于修改,增强代码的可维护性;

封装的使用

🍓🍓开发中,针对属性有这样一种定义:所有在类中定义的属性都要求使用private声明,如果属性需要被外部所使用,那么按照要求定义相应的setXXX、getXXX方法,以String title为例。
🍓🍓setXXX方法主要是设置属性内容,public void setTitle(String t),有参;
🍓🍓getXXX方法主要是取得属性内容:public String getTitle( ),无参

🍓🍓案例:为Book类中的封装属性设置setXXX、getXXX操作。

class Book { 					// 定义一个新的类
    private String title; 		// 书的名字
    private double price; 		// 书的价格
    public void setTitle(String t) {	// 设置title属性内容
        title = t;
    }
    public void setPrice(double p) {	// 设置price属性内容
        if (p > 0.0) {		// 进行数据验证
            price = p ;
        }
    }
    public String getTitle() {	// 取得title属性内容
        return title;
    }
    public double getPrice() {	// 取得price属性内容
        return price;
    }
    public void getInfo() { 		// 此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class text1{
    public static void main(String args[]) {
        Book book = new Book();		// 声明并实例化对象
        book.setTitle("Java开发");		// 设置属性内容
        book.setPrice(-89.9);			// 设置属性内容
        book.getInfo();			// 调用方法
    }
}

在这里插入图片描述

构造方法

构造方法的定义

🍓🍓在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法,就是专门用来创建对象的方法,当通过new关键字创建对象时,其实就是在调用构造方法

类名称 对象名称 = new 类名称()

  • 类名称: 规定了对象的类型,即对象可以使用哪些属性与方法,都是由类定义的;
  • 对象名称: 如果要想使用对象,需要一个名字,这是一个唯一的标记;
  • new:开辟新的堆内存空间,如果没有此语句,对象无法实例化
  • 类名称():调用了一个和类名称一样的方法,这就是构造方法

构造方法一直存在 !

构造方法:构造方法是类中一个特殊的成员方法,用于为类中属性初始化

//构造方法的定义格式:
public  方法名(【参数列表】) {
   ……….. //方法体
}

说明:
1、public:构造方法修饰符;
2、构造方法方法名类名相同;
3、构造方法在实例化新对象(new)的时候调用一次
4、构造方法没有返回值类型说明,不需要用void修饰符;
5、在构造方法中可以为成员变量赋值

如果想改变默认成员属性的初始化值,让系统创建对象时就为该对象的成员属性显式地指定初始值,可以通过构造方法来实现。

当类未定义任何构造方法,系统会自动提供一个默认的构造方法(不带参数的),又称缺省构造方法

缺省构造方法:进行对象初始化操作,默认初始化值

说明:
1、构造方法的核心作用:实例化对象时设置设置属性的初始值
2、一个类中至少保留一个构造方法;(若一个也未定义,系统会自动生成默认的无参构造方法)。

关键字this

在Java中,this关键字比较难理解,它的作用和其词义很接近。
this关键字的作用:

  • 调用本类属性;
  • 调用本类方法;

调用本类属性

🍓🍓案例:局部变量与成员变量同名。

class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        title = title;	// 原本目的是将构造方法的title变量内容设置给title属性
        price = price;	//原本目的是将构造方法的price变量内容设置给price属性
    }
    // setXXX、getXXX略
    public String getInfo() {
        return "书名:" + title + ",价格:" + price;
    }
}
public class text1 {
    public static void main(String args[]) {
        Book book = new Book("Java开发", 89.2);
        System.out.println(book.getInfo());
    }
}

在这里插入图片描述
🍓🍓案例:使用this关键字明确的表示访问类中的属性。

class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title; // this.属性表示的是本类属性
        this.price = price;
    }
    // setter、getter略
    public String getInfo() {
        return "书名:" + title + ",价格:" + price;
    }
}
public class text1 {
    public static void main(String args[]) {
        Book book = new Book("Java开发", 89.2);
        System.out.println(book.getInfo());
    }
}

在这里插入图片描述

调用本类方法

在一个类之中,可以使用this调用两种方法(普通方法构造方法),而在要调用本类方法也就分为两种形式:

  • 调用本类普通方法:如果现在要调用的是本类方法,则可以使用“this.方法()”调用;
  • 调用本类构造方法:在一个构造方法中要调用其他构造方法使用“this(【参数列表】)”调用。

🍓🍓范例:调用本类普通方法

class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    public void print() {
        System.out.println("调用本类的普通方法") ;
    }// setter、getter略
    public String getInfo() {
        this.print() ;	// 调用本类方法
        return "书名:" + title + ",价格:" + price;
    }
}
public class text1 {
    public static void main(String args[]) {
        Book book = new Book("Java开发", 89.2);
        System.out.println(book.getInfo());
    }
}

在这里插入图片描述

🍓🍓范例:调用构造方法

class Book {
    private String title;
    private double price;
    public Book() {         // 无参构造方法
        System.out.println("一个新的Book类对象产生。");
    }
    public Book(String title) {
        this() ; 	// 调用本类无参构造方法
        this.title = title;
    }
    public Book(String title, double price) {
        this(title) ;	// 调用本类有一个参数的构造方法
        this.price = price;
    }// setter、getter略
    public String getInfo() {
        return "书名:" + this.title + ",价格:" + this.price;
    }
}
public class text1 {
    public static void main(String args[]) {
        Book book = new Book("Java开发", 89.2);
        System.out.println(book.getInfo());
    }
}

在这里插入图片描述
说明:

  • 可以在类的构造方法中使用“this(形参列表)”的方式,调用本类中重载的其他的构造器;
  • 明确:构造方法中不能通过“this(形参列表)”的方式调用自身构造方法
  • 如果一个类中声明了n个构造方法,则最多有 n - 1个构造方法中使用了“this(形参列表)”;
  • “this(形参列表)”必须声明在类的构造方法的首行
  • 在类的一个构造方法中,最多只能声明一个“this(形参列表)”;

包的定义

🍍🍍在Java中,可以将一个大型项目中的类分别独立出来,分门别类的存到功能类似的程序里,保存到不同的包中,再将这些包中的程序文件一起编译执行,这样程序代码更易维护。

一个程序由多个不同的程序包组成

🍓🍓在Java程序之中的包,主要的目的是可以将不同功能的文件进行分割。所谓的包实际上指的就是文件夹。在Java之中使用package关键字来定义包,此语句必须写在*.java文件的首行。
包的定义格式: package 包名

package javase.ch3.demo ;    // 定义程序所在包,此语句必须放在首行
public class Hello {
	public static void main(String args[]) {
		System.out.println("Hello World !") ;
	}
}
  • 包名必须遵循标识符命名规则,通常用小写并且尽量“见名知意”;
  • 将Hello程序类定义在了一个“javase.ch3.demo”的包中;(在定义包的时候出现了“.”,那么就表示子目录, 即javase\ch3\demo );
  • 同一个包下,不能命名同名的类

包的导入

🍓🍓使用包可以将一个完整的程序拆分为不同的文件进行分别保存,这样就会造成一个问题,不同包之间有可能要进行互相访问,那么此时就需要使用包的导入(import语句)操作

语法格式: import 包.类

🍓🍓范例:导入一个包中的多个类。
要在一个类中导入同一个包中许多类的时候,则这样每次都重复编写“import 包.类”语句会很麻烦,所以可以使用“包.*”的方式来代替一个包中多个类的导入操作。

package demo02;
import  demo03.*; 		// 自动导入demo03包中所需要的类
public class TestMessage {
	public static void main(String args[]) {
		Message msg = new Message();	// 实例化对象
		msg.getMessage();			// 调用方法
	}
}

方法及参数传递

参数传递

Java 中方法的参数主要有3种,分别为值参数引用参数可变参数
1、值参数(基本类型)
🍓🍓表明实参与形参之间按值传递,当使用值参数的方法被调用时,编译器为形参分配存储单元,然后将对应的实参的值复制形参中,由于是值类型的传递方式,所以,在方法中对值类型的形参的修改并不会影响实参
2、引用参数
🍓🍓如果在给方法传递参数时,参数的类型是数组或者其他引用类型,那么,在方法中对参数的修改会反映到原有的数组或者其他引用类型上,这种类型的方法参数被称之为引用参数。
3、可变参数
🍓🍓声明方法时,如果有若干个相同类型的参数,可以定义为可变参数,该类型的参数声明如下:
🍓🍓权限修饰符 返回值类型 方法名(参数类型… 参数名)

注意:

  • 参数类型和参数名之间是三个点,而不是其他数量或省略号;
  • 可变参数调用时,固定参数部分不影响,可变参数部分跟数组一样;

请添加图片描述

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

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

相关文章

已做过算法题总结

217、存在重复元素(easy) 输入:nums [1,2,3,1] 输出:true 输入:nums [1,2,3,4] 输出:false 输入:nums [1,1,1,3,3,4,3,2,4,2] 输出:true 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &…

【2106. 摘水果】

来源:力扣(LeetCode) 描述: 在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上…

Android平台播放透明视频

Android平台播放透明视频 思路 设计一种特殊的视频,它的一半内容存储alpha信息,另一半内容存储rgb信息,接着通过OpenGL获取每个像素点的alpha值和rgb值进行混合,最后出来的画面就是带有透明效果的视频了。 可以上下的分&#xf…

【疯狂造轮子-iOS】JSON转Model系列之二

1. 前言 上一篇《【疯狂造轮子-iOS】JSON转Model系列之一》实现了一个简陋的JSON转Model的库,不过还存在很多问题。下面我会尝试一个个去解决。 2. 存在问题及解决思路 2.1 没有考虑JSON数据并不一定是NSDictionary类型 有时候JSON并不一定是NSDictionary类型&…

【医学影像数据处理】2D/3D patch的crop和merge操作汇总

在做3D分割任务中,多数的方法多采用整体缩放,或裁剪成一个个小的patch操作,这样做的一个主要原因是内存问题。 相较于整体缩放,采用裁剪成patch的方法,对于小目标会更加的鲁棒,这也是大多数3D分割任务中常…

Leetcode448. 找到所有数组中消失的数字

Every day a leetcode 题目来源:448. 找到所有数组中消失的数字 解法1:STL set set 是一个集合类型的容器,里面的元素具有唯一性,并且所有元素都会根据元素的键值自动被排序,以红黑树为底层数据结构。 我们使用集合…

git上传大大大文件项目好折磨人

本来想把unity项目的源码上传上gitee啊,但是那个项目有1个多G,还是个半成品,要是写完,都不知道行不行 正常的上传 所用到的命令: 1、 git init 初始化,创建本地仓库 2、 git add . 添加到本地仓库 3、 git…

【C++】打开C++大门,踏入C++世界

文章目录 ☑️前言一. 浅看【C】关键字二. 命名空间1. 命名空间的定义👌2. 命名空间的使用👌 三. 【C】输入输出(IO)四. 缺省参数1. 缺省参数的概念🏆2. 缺省参数的分类🏆 五. 函数重载1. 函数重载的概念✌️2. 【C】支持函数重载…

【计算机专业漫谈】【计算机系统基础学习笔记】W2-2-2 模运算系统和补码表示

利用空档期时间学习一下计算机系统基础,以前对这些知识只停留在应试层面,今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC,参考书籍也是袁老师的教材,这是我的听课自查资料整理后的笔记 补码表示法…

实验9 分类问题

1. 实验目的 ①掌握逻辑回归的基本原理,实现分类器,完成多分类任务; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等,…

GEE:基于变异系数法的遥感环境风险评估指数(RSEI)计算

作者:CSDN @ _养乐多_ 本文记录了基于变异系数法计算 Risk-Screening Environmental Indicators (RSEI) 的方法和代码。使用 变异系数法计算权重来代替PCA方法计算权重,根据权重计算综合指标。本文也记录了使用landsat-8数据计算LST、NDVI、NDBSI、WET四个指标的代码。 结果…

密码学:其他常见密码学应用.

密码学:其他常见密码学应用. 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学. 目…

二叉树基础概念详解

文章目录 前言1. 树的基本概念2. 二叉树的基本概念3. 特殊二叉树🍑 满二叉树🍑 完全二叉树🍑 斜树 4. 二叉树的性质🍑 性质一🍑 性质二🍑 性质三🍑 性质四🍑 性质五🍑 性…

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的…

【Java】线程池--ThreadPoolExecutor底层原理源码的理解

文章目录 一、根据代码查看jdk提供的3种线程池创建:二、3种方式源码分析1、Executors.newCachedThreadPool()2、Executors.newFixedThreadPool(10)3、Executors.newSingleThreadExecutor() 三、自定义方式执行提交优先级执行优先级 一、根据代码查看jdk提供的3种线程…

第2章Elasticsearch入门

1.正排索引和倒排索引 正排索引: 正排索引(Forward Index)是一种用于搜索引擎和文本检索系统的索引结构,它将文档中的每个单词都映射到该单词在文档中出现的位置。正排索引可以帮助快速定位、检索和渲染文档内容,但它需要消耗大…

AI 工具合辑盘点(十一)持续更新 之 AI 学术研究工具

许多学生和研究人员已经在利用人工智能进行研究。它可以让你更容易地了解最新研究成果,并帮助你组织和正确引用你最喜爱的研究论文。 从生成长篇研究论文摘要到通知你领域内的新趋势,研究中的AI工具节省了大量时间和精力。如果你在学术界,那…

数据库系统

目录 第三章、数据库系统1、数据库模式1.1、三级模式--两级映射1.2、数据库设计过程 2、ER模型3、关系代数与元组演算4、规范化理论4.1、函数依赖4.2、价值与用途4.3、键4.4、范式4.5、模式分解 5、并发控制6、数据库完整性约束7、数据备份8、数控故障与恢复9、数据仓库与数据挖…

网络安全合规-数据安全风险评估

一、法律依据: 依据《数据安全法》第三十条的规定,重要数据的处理者应当按照规定对其数据处理活动定期开展风险评估,并向有关主管部门报送风险评估报告。 依据《网络数据安全管理条例》(征求意见稿) 第三十二条规定&am…

实时通信的服务器推送机制 EventSource(SSE) 简介,附 go 实现示例

简介 不知道大家有没有见过 Content-Type:text/event-stream 的请求头,这是 HTML5 中的 EventSource 是一项强大的 API,通过服务器推送实现实时通信。 与 WebSocket 相比,EventSource 提供了一种简单而可靠的单向通信机制(服务器…