【Java面向对象】面向对象思考

文章目录

  • 1.类的抽象和封装
  • 2.面向对象的思想
  • 3.类的关系
    • 3.1 关联
    • 3.2 聚集和组合
  • 4.包装类
    • 4.1 Integer和Double
    • 4.2 自动装箱和自动拆箱
    • 4.3 Biginteger 和 BigDecimal类
    • 4.4 String 类
      • 4.4.1 创建
      • 4.4.2 不可变字符串与驻留字符串
      • 4.4.3 替换和拆分字符串
      • 4.4.4 使用模式匹配、替换和拆分
      • 4.4.5 字符串与数组之间的转换
      • 4.4.6 将字符和数值转换成字符串
      • 4.4.7 格式化字符串
    • 4.5 StringBuilder 类和 StringBuffer 类

1.类的抽象和封装

类的抽象是指将类的实现和类的使用分离开,实现的细节被封装并且对用户隐藏,这被称为类的封装。
类抽象 是将类的实现和使用分离。类的创建者描述类的功能,让使用者明白如何使用类。从类外可以访问的 public 构造方法、普通方法和数据域的集合以及对这些成员预期行为的描述,构成了类的合约。

类的使用者不需要知道类是如何实现的。实现的细节通过封装对用户隐藏起来,这称为类的封装。由于这个原因,类也称为抽象数据类型(abstract Data Type, ADT) 。

可以使用一张UML图。
在这里插入图片描述

2.面向对象的思想

面向过程的范式重点在于设计方法。面向对象的范式将数据和方法耦合在一起构成对象。使用面向对象范式的软件设计重点在对象以及对象上的操作。

public class BMI{private String name;private int age;private double weight;private double height;public BMI(String name,int age,double weihgt,double height){this.name = name;this.age = age;this.weight = weight;this.height = height;}public BMI(String name,double weight,double height){this(name,20,weight,height);}public double getBMI(){...};public String getStatus(){double bmi = getBMI();if(bmi < 18.5)return "Underweight";else if(bmi < 25)return "Normal";else if(bmi<30)return "Overweight"else return "Obese";}public String getName(){return name;}public String getAge(){return age;}public String getWeight(){return weight;}public String getHeight(){return height;}
}

在面向过程程序设计中,数据和数据上的操作是分离的,而且这种做法要求传递数据给方法。面向对象程序设计将数据和对它们的操作都放在一个对象中。这个方法解决了很多面向过程程序设计的固有问题。面向对象程序设计方法以一种反映真实世界的方式组织程序,在真实世界中,所有的对象都和属性及动作相关联。使用对象提高了软件的可重用性,并且使程序更易于开发和维护。Java 程序设计涉及对象这个术语的思想,一个 Java 程序可以看作是一个相互操作的对象集合。

3.类的关系

为了设计类,需要探究类之间的关系。类之间的关系通常有关联、聚合、组合以及继承。

3.1 关联

在这里插入图片描述
关联中涉及的每个类可以给定一个多样性 (multiplicity), 放置在类的边上用于给定 UML图中关系所涉及的类的对象数。多样性可以是一个数字或者一个区间,决定在关系中涉及该类的对象数。字符* 意味着无数多个对象,而 m…n 表示对象数位于 m 和 n 之间,并且包括m 和 n。

public class Student{private String name;private Course[] courseList;public void addCourse(Course c){...}; 
}public class Faculty{private String name;private Course[] courseList;public void addCourse(Course c){...}; 
}public class Course{int time;String name;private Students[] classlist;private Faculty faculty;public void addStudent(Student s){...};public void setFaculty(Faculty f){...};
}

3.2 聚集和组合

聚集是关联的一种特殊形式,代表了两个对象之间的归属关系。聚集对 has-a 关系进行建模。所有者对象称为聚集对象,它的类称为聚集类。而从属对象称为被聚集对象,它的类称为被聚集类。

如果被聚集对象的存在依赖聚集 对象,我们称这 两个对象之间的关系为组合( composition)。 换句话说,被聚集对象不能单独存在。

组合暗示了独占性的拥有。一个对象拥有另外一个对象:当拥有者对象销毁了,依赖对象也会销毁。在 UML 中,附加在聚集类(例如:Student)上的实心菱形表示它和被聚集类(例如:Name)之间具有组合关系;而附加在聚集类(例加:Student)上的
空心菱形表示它与被聚集类(例如:Address)之间具有聚集关系
在这里插入图片描述
在图 10-6 中,每个学生只能有一个地址,而每个地址最多可以被 3 个学生共享。每个学生都有一个名字,而每个学生的名字都是唯一的。

4.包装类

基本数据类型值不是对象,但是可以使用 Java API 中的包装类来包装成一个对象。

出于对性能的考虑,在 Java 中基本数据类型不作为对象使用。因为处理对象需要额外的系统开销,所以,如果将基本数据类型当作对象,就会给语言性能带来负面影响。
然而,Java 中的许多方法需要将对象作为参数。Java 提供了一个方便的办法,即将基本数据类型合并为或者说包装成对象 (例如,将 int 包装成 Integer 类,将 double 包装成 Double 类,将 char 包装成 Character 类)。通过使用包装类,可以将基本数据类型值作为对象处理。
Java 在 java.lang 包里为基本数据类型提供了 Boolean、Character、Double、Float、Byte、Short、Integer 和 Long 等包装类。

大多数基本类型的包装类的名称与对应的基本数据类型名称一样,第一个字母要大写。对应int 的 Integer 和对应 char 的 Character 例 外

数值包装类相互之间都非常相似。每个都各自包含了 doubleValue()、floatValue()、intValue()、 longValue() 、shortValue()和 byteValue()等方法。这些方法将对象 “转换”为基本类型值。

4.1 Integer和Double

在这里插入图片描述
包装类没有无参构造方法。所有包装类的实例都是不可变的,这意味着一旦创建对象后,它们的内部值就不能再改变。

每一个数值包装类都有常量 MAX_VALUE 和 MIN_VALUE。MAX_VALUE 表示对应的基本数据类型的最大值。对于 Byte、Short. Integer 和 Long 而言,MIN_VALUE 表示对应的基本类型byte、short 、int 和 long 的最小值。对 Float 和 Double 类而言,MINJALUE 表示 float 型和 double 型的最小正值。

每个数值包装类都包含各自方法doubleValue(),floatValue() ,intValue() ,longValue()和 shortValue()。这些方法 返回包装对象对应的 double ,float,int,long或short 值。
数值包装类中包含compareTo 方法用于比较两个数值,并且如果该数值大于、等于或者小于另外一个数值时,分别返回1、0、 -1。
数值包装类有一个有用的静态方法 value0f(String s)。该方法创建一个新对象,并将它初始化为指定字符串表示的值。

new Double(12.5).intValue(); // 12new Double(2).compareTo(new Double(2)); // 0Integer intnum = Integer.valueOf("12"); // 12

Integer 类中的 parselnt 方法将一个数值字符串转换为一个 int 值。每个数值包装类都有两个重载的方法,将数值字符串转换为正确的以 10 (十进制) 或指定值为基数(例如,2 为二进制,8 为八进制,16 为十六进制) 的数值。

public static int parseint (String s)
public static int parseint (String s , int radix)// 例如:
Integer.parseInt("11",2) // 3
// 另外,可以使用 format 方法将一个十进制数转换为十六进制数
String.format("%x",26) // 1A

4.2 自动装箱和自动拆箱

根据上下文环境,基本数据类型值可以使用包装类自 动转换成一个对象,反之也可以。
将基本类型值转换为包装类对象的过程称为装箱 ( boxing), 相反的转换过程称为拆箱(unboxing)。

Java 允许基本类型和包装类类型之间进行自动转换。如果一个基本类型值出现在需要对象的环境中,编译器会将基本类型值进行自动装箱;如果一个对象出现在需要基本类型值的环境中,编译器会将对象进行自动拆箱。这称为自动装箱和自动拆箱。

//下面两者等价
Integer a = new Integer(2);
Integer a = 2;//下面两者等价
int i = 0;
int i = Integer(0);

4.3 Biginteger 和 BigDecimal类

如果要进行非常大的数的计算或者高精度浮点值的计算,可以使用 java.math 包中的Biginteger 类和 BigDecimal 类。它们都是不可 变的。long 类型的最大整数值为 long.MAX_VALUE (即 9223372036854775807), 而 Biginteger 的实例可以表示任意大小的整数。

可以使用 new Biginteger(String) 和 new BigDecimal (String) 来创建 Biginteger 和 BigDecimal的实例,使用 add、subtract、multiple、divide 和 remainder 方法进行算术运算,使用compareTo 方法比较两个大数字。

BigInteger a = new BigInteger("343435135133435433");
BigInteger b = new BigInteger("45");
BigInteger c =a.multiply(b);

BigDecimal 对象可以达到任意精度。如果不能终止运行,那么 divide 方法会抛出ArithmeticException 异常。但是,可以使用重载的 divide(BigDecimal d,int scale, int roundingMode) 方法来指定scale值和舍入方式来避免这个异常,这里的 scale 是指小数点
后最小的整数位数。

BigDecimal a = new BigDecimal("343435135133435433");
BigDecimal b = new BigInteger("45");
BigDecimal c =a.divide(b,20,BigDecimal.ROUND_UP);

4.4 String 类

4.4.1 创建

String newString = new String(stringLiteral);String message = new String("Weicome to Java");String message = "Weicome to Java";chart] charArray = {'G*, '0' , 'o*, 'd' , ' ', 'D*, 'a', 'y'}String message = new String(charArray);

4.4.2 不可变字符串与驻留字符串

String 对象是不可改变的。字符串一旦创建,内容不能再改变。

String s = "Java";
s = "HTML";

第一条语句创建了一个内容为”Java" 的 String 对象,并将其引用赋值给s。第二条语句创建了一个内容为”HTML” 的新 String 对象,并将其引用赋值给 s。赋值后第一个 String 对象仍然存在,但是不能再访问它了,因为变量 s 现在指向了新的对象。

因为字符串在程序设计中是不可变的,但同时又会频繁地使用,所以 Java 虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串字面值使用同一个实例。这样的实例称为驻留的 (interned) 字符串。

String s1 = "Welcome to Java";
String s2 = new String("Weicome to Java" ) ;
String s3 = "Welcome to Java";
System.out.printin("s1 == s2 is " + (s1 == s2) ) ;
System.out.println("s1 == s3 is " + (s1 == s3) ) ;// s1 == s2 is false
// s2 == s3 is true

4.4.3 替换和拆分字符串

在这里插入图片描述

"Wei come",replace('e', 'A' );
"Wei come".replaceFirst ("e", "AB") ;
"Weicome".replace ("e", "AB");
"Weicome".replace("el", "AB" );String[] tokens = "Java#HTML#Perl".split("#") ;
for (int i = 0; 1 < tokens.length; i++)System.out.print (tokens[i] + " ") ;

4.4.4 使用模式匹配、替换和拆分

正则表达式 (regularexpression)(缩写regex) 是一个字符串,用于描述匹配一个字符串集的模式。可以通过指定某个模式来匹配、替换或拆分一个字符串。这是一种非常有用且功能强大的特性。

"Java".matches("Java") ;
"Java".equals("Java") ;

matches 方法的功能更强大。它不仅可以匹配固定的字符串,还能匹配一组遵从某种模式的字符串,具体可以专门学习正则表达式

4.4.5 字符串与数组之间的转换

字符串不是数组,但是字符串可以转换成数组,反之亦然。为了将字符串转换成一个字符数组,可以使用 toCharArray 方法。

char[] chars = "java".toCharArray();String str = new String(new char[]{'a','b'});
String str = new String(chars);

4.4.6 将字符和数值转换成字符串

在这里插入图片描述

4.4.7 格式化字符串

String 类包含静态方法 format, 它可以创建一个格式化的字符串。

String. format(format , iteml, item2 itemk);String s = String.format( "%7.2f%6d%-4s", 45.556, 14, "AB");
System.out.println(s);

4.5 StringBuilder 类和 StringBuffer 类

StringBuilder 和 StringBuffer 类似于 String 类,区 别在于 String 类是不可改变的。
一般来说,使用字符串的地方都可以使用 StringBui1der/StringBuffer 类。StringBuilder/StringBuffer 类比 String类更灵活。可以给一个 StringBuilder 或 StringBuffer 中添加、插入或追加新的内容,但是 String 对象一旦创建,它的值就确定了

StringBuffer 和StringBuilder 中的构造方法以及其他方法几乎是完全一样的。

具体使用见官方文档或其他资料

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

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

相关文章

美式键盘 QWERTY 布局的起源

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

基于计算机视觉的工地钢筋计数

手动钢筋计数是一项耗时的任务&#xff0c;而且容易出错和不一致。但是&#xff0c;你可以使用计算机视觉自动进行钢筋计数。你可以使用经过微调的计算机视觉模型来计算单个钢筋&#xff0c;这对于构建库存管理和质量验证系统非常有用 在这篇博文中&#xff0c;我们将学习如何…

生成树(STP)协议

一、生成树的技术背景 1、交换机单线路上链,存在单点故障,上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,网络将面临断网。 总结:以下网络不够健壮,不具备冗余性。 2、因此引入如下网络拓扑结构: 上述冗余拓扑能够解决单点故障问题,但同时冗拓扑也带来了…

【Godot4.2】MLTag类:HTML、XML通用标签类

概述 HTML和XML采用类似的标签形式。 之前在Godot中以函数库形式实现了网页标签和内容生成。能用&#xff0c;但是缺点也很明显。函数之间没有从属关系&#xff0c;但是多有依赖&#xff0c;而且没有划分出各种对象和类型。 如果以完全的面向对象形式来设计标签类或者元素类…

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合

一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500&#xff0c;w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中&#xff0c;可以使用VideoCapture来读取视频文件&#xff0c;或是摄像头数…

华为USG6000V防火墙安全策略用户认证

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1&#x1f923;防火墙FW1web服务配置 2.网络配置 要求1&#xff1a;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 要求2&#xff1a;生产区不…

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…

拒绝废话:computed、watch和methods的区分和使用场景

computed、watch和methods是用于处理数据和响应数据变化的不同方式&#xff0c;三者之间有什么不同呢&#xff0c;贝格前端工场作为10年前端老司机&#xff0c;用浅显的语言给大家分享一下。 computed&#xff1a; computed属性是用来定义一个基于依赖的响应式属性。它会根据…

OrangePi 学习摘录

文章目录 1. 参考2. 开发板 Orange-Pi-CM4 预览3. 烧录 Linux 镜像到 TF 卡中4. 制作桌面版镜像qemu/chroot 5. Armbian6. 编译 1. 参考 淘宝 香橙派官网 Orange-Pi-3B Orange-Pi-CM4 基于docker构建香橙派zero系统构建环境 2. 开发板 Orange-Pi-CM4 预览 3. 烧录 Linux 镜像…

微信小程序基本语法

官网 https://developers.weixin.qq.com/miniprogram/dev/framework/ 视频教程&#xff1a;尚硅谷微信小程序开发教程&#xff0c;2024最新微信小程序项目实战&#xff01; 仿慕尚花坊项目源码&#xff1a;https://gitee.com/abcdfdewrw/flower-workshop 目录 一&#xff0c;初…

【深度学习】BeautyGAN: 美妆,化妆,人脸美妆

https://www.sysu-hcp.net/userfiles/files/2021/03/01/3327b564380f20c9.pdf 【深度学习】BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversaria…

交叉编译ethtool(ubuntu 2018)

参考文章&#xff1a;https://www.cnblogs.com/nazhen/p/16800427.html https://blog.csdn.net/weixin_43128044/article/details/137953913 1、下载相关安装包 //ethtool依赖libmul git clone http://git.netfilter.org/libmnl //ethtool源码 git clone http://git.kernel.or…

国家护网行动面试题总结

一、信息收集流程 1.获取域名的 whois 信息 , 获取注册者邮箱姓名电话等。 2.通过站长之家、明小子、 k8 、站长之家等查询服务器旁站以及子域名站点&#xff0c;因为主站一般 比较难&#xff0c;所以先看看旁站有没有通用性的 cms 或者其他漏洞。 3、通过 DNS 域传送…

PriorityQueue 阅读记录

1、前言 1、优先队列&#xff0c;底层通过数组来构造树&#xff08;二叉树) 来实现的。 2、默认是最小堆&#xff08;取出来的是最小值)&#xff0c;可以通过传入一个比较器 comparator 来构造一个最大堆。 3、传入的参数不能为空&#xff0c;否则抛出NPE问题。 4、最大堆的…

Study--Oracle-07-ASM自动存储管理(一)

一、ASM实例和数据库实例对应关系 1、ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能&#xff0c;这是Oracle自己提供的卷管理器&#xff0c;主要用于替代操作系统所提供的LVM&#xff0c;它不仅支持单实例&#xff0c;同时对RAC的支持也是非常好。ASM可…

汽车开发阶段(OTS/VFF/PVS/OS/SOP)

OTS&#xff1a;即英语中的Off Tooling Sample&#xff0c;通常被称为工装样件。它指的是通过配套设备、工装夹具以及模具制造出来的样品&#xff0c;但并不强调生产的时间效率&#xff0c;主要用于验证产品的设计能力。 VFF&#xff1a;在德语中表示为Vorserien Freigabefahr…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读、捕获文件格式转换错误ExcelDataConvertException

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

C++基础知识:C++内存分区模型,全局变量和静态变量以及常量,常量区,字符串常量和其他常量,栈区,堆区,代码区和全局区

1.C内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff08;在编译器中所书写的代码都会存放在这个空间。&#xff09; 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分…

Mysql具体数据操作和表的约束(上)

表中数据的增删改查 插入数据(添加数据) 1.按指定字段插入数据:insert into <表名> (字段1,字段2,...) values (),(),.... 注意1:values后面的括号是指行数(几条记录),一个括号表示插入一条记录,多个括号以此类推 注意2:values后面括号内部插入的数据…

【python学习】第三方库之pandas库的定义、特点、功能、使用场景和代码示例

引言 pandas是一个强大的Python库&#xff0c;用于数据分析和数据处理。它基于NumPy&#xff0c;提供了灵活的数据结构&#xff08;Series和DataFrame&#xff09;和数据操作功能&#xff0c;是数据科学和机器学习中不可或缺的工具 文章目录 引言一、安装pandas第三方库二、pan…