Java 面向对象(五)
包装类
什么是包装类
在面向对象当中“一切皆对象”。基本数据类型变量不是对象,比如 int a = 10; 当中就没有对象,所以就很矛盾。此时我们就可以对基本数据类型进行包装,把基本数据类型包装一个对象。把基本数据类型变的更强大,以面向对象的思想来去使用这些类型。
对基本数据类型包装的好处
(1)使用包装对象后,功能变的更加强大。
比如:以前使用double来去表示一个人的分数。此时这个人的分数考了0分,可以表示0.0。如果这个人没有来考试,那就代表这个没有分数,使用包装类型后, 即可表示这两种状态一个是0.0,一个是null,基本数据类型就办不到。
(2)包装类当中给我们提供了很多方法,可以直接过来使用
比如:我们要将一个数据转成二进制,使用包装对象后, 就可以直接调用方法算出来,不需要我们再去手动去算。
基本数据类型对应的包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱操作
把基本数据类型变成包装类,我们称为装箱操作。可以使用以下两种方式进行装操作
(1)包装类的构造器
(2)包装类的静态方法 valueOf()
Integer num1 = new Integer(10);
Integer num2 = Integer.valueOf(20);
Integer.valueOf本质也是new Integer创建,只不过当中多了一个缓存判断
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
public static void main(String[] args) {
int a = 10;
// 把基本数据类型变成 包装类 ,装箱操作
Integer num = Integer.valueOf(a);
// Integer 内部覆盖了toString
System.out.println(num); // 10
// 知道是有什么基本数据类型包装过来的
System.out.println(num.TYPE); // int
System.out.println(num.MAX_VALUE); // 2147483647
System.out.println(num.MIN_VALUE); // -2147483648
}
拆箱操作
把包装类对象转成对应的基本数据类型,我们称为拆箱操作。
包装类的 xxxValue() 方法,xxx为对应的基本数据类型。
// Integer a;
int num = a.intValue();
自动装箱
自动装箱:可以直接把一个基本数据类型的值赋值给包装类对象。
// 自动装箱
Integer i = 10;
自动拆箱
自动拆箱:可以直接把一个包装类对象赋值给基本数据类型的变量。
// 自动拆箱
int n = i;
自动装箱和自动拆箱的本质
自动装箱和自动拆箱是一种语法糖,可以通过反编译查看他们的本质。
public static void main(String[] args) {
// 自动装箱
Integer i = 10;
// 自动拆箱
int n = i;
}
反编译后:
public static void main(String args[])
{
Integer i = Integer.valueOf(10);
int n = i.intValue();
}
字符串与其他类型的转换
基本数据类型转字符串
(1)包装类的toString()方法
(2)String的valeOf()方法
(3)加上一个空字符串
int i = 10;
String str1 = Integer.toString(i);
String str2 = String.valueOf(i);
String str3 = i + "";
System.out.println(str1 + ", " + str2 + ", " + str3); // 10, 10, 10
字符串转基本数据类型
(1)包装类的parseXxx()方法,Xxx为对应的基本数据类型。
(2)包装类的valueOf()方法转为基本数据类型的包装类,会自动拆箱。
String s = "10";
int i1 = Integer.parseInt(s);
int i2 = Integer.valueOf(s);
字符串转包装类
(1)包装类的构造器
(2)包装类的静态方法 valueOf()
Integer i1 = new Integer("13");
Integer i2 = Integer.valueOf("13");
其实是由字符串转为基本数据类型,再由基本数据类型转成包装类
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
特殊的,字符串转Boolean
字符串为true才为true,其它都是false
Boolean b1 = new Boolean("true");
Boolean b2 = Boolean.valueOf("tru");
System.out.println(b1); // true
System.out.println(b2); // false
包装类转字符串
包装类的toString()方法
Integer num = Integer.valueOf(10);
String str = num.toString();
基本数据类型和包装类的区别
(1)默认值
int: 0
Intege:null
(2)包装类当中提供了很多方法直接给我们使用
比如:Integer.toBinaryString(5)
(3)集合框架当中不能存放基本数据类型。只能存对象。
什么时候使用基本数据类型?什么时候使用包装类?
在类当中,成员变量一般都使用包装类。
在方法当中,我们一般都使用基本数据类型。
方法中,基本数据类型存储在栈当中,包装类型存放在堆当中。
包装类valueOf的缓存设计
当使用valueof创建一个包装类,它内部的实现会先从缓存当中查看是否已经有该存在匹配条件 的值 ,如果就就直接返回,不会再去创建新的地址。如果没有,就去创建新的地址。
valueOf:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
例子:
// 比较是地址 每new 都会创建一个新的地址
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1 == i2); // false
// 包装类当中缓存设计 在 -128-127之间
Integer i3 = Integer.valueOf(123);
Integer i4 = Integer.valueOf(123);
System.out.println(i3 == i4); // true
// range -128 to 127
// 缓存的范围只有-128 到 127 超过这个范围 就不会使用缓存 ,直接创建新的地址
Integer i5 = Integer.valueOf(300);
Integer i6 = Integer.valueOf(300);
System.out.println(i5 == i6); // false
Java 面向对象(五)的更多相关文章
- 深入java面向对象五:Java的内存管理
一. Java对象的引用种类 Java内存管理包括内存分配和内存回收, 这个动作都是由JVM自动完成,所以过多的内存分配增加了内存的消耗,且垃圾回收线程的不断运行会给后台增加压力,降低系统的性能. 1 ...
- 20155201 实验五《Java面向对象程序设计》实验报告
20155201 实验五<Java面向对象程序设计>实验报告 一.实验内容 1. 数据结构应用 2. 结对编程:利用IDEA完成网络编程任务,1人负责客户端,1人负责服务器 3. 密码结对 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Java第五次作业--面向对象高级特性(抽象类与接口)
Java第五次作业--面向对象高级特性(抽象类与接口) (一)学习总结 1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结. 2.汽车租赁公司,出租汽车 ...
- Java第五次作业--面向对象高级特性(抽象类和接口)
一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握抽象类的设计 掌握接口的设计 理解简单工厂设计模式 理解抽象类和接口的区别 掌握包装类的应用 掌握对象的比较方法和比较器的使用 学习使用日期操 ...
- JAVA学习(五):Java面向对象编程基础
Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
- java的五种数据类型解析
不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自 ...
- java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...
- 20145213《Java程序设计》实验二Java面向对象程序设计实验报告
20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...
- 20145208 实验三 Java面向对象程序设计
20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
随机推荐
- 使用browser-sync预览pandoc markdown???
由于 pandoc markdown在sublime下面并不能很好的预览,因此可以直接 使用 pandoc build成html,然后借助下面的工具进行实时在浏览器里面预览 http://www.br ...
- 50个Sql语句实战
/* 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句. 问题及描述:--1.学生表Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生 ...
- 基本代码、插值表达式、v-cloak
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 虚拟机更改MAC
有两种方式修改MAC地址 方法一 现实中网卡一出厂就有MAC地址,虚拟机的MAC地址见下图,这个就相当于出厂MAC.在这里修改MAC相当于直接修改硬件MAC 方法二 这里修改MAC,硬件MAC并没有变 ...
- MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式
方法1: 笔记要点出错分析与总结工程组织数据库组织0.重新修改Bean类 修改1.定义接口 //批量插入 public void addEmps(@Param("emps") ...
- 轻院校赛-zzuli 2266: number【用每位的二进制的幂的和来进行hash(映射)处理】
zzuli 2266: number 大致题意: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9] ...
- P2746 P2812 [USACO5.3]校园网Network of Schools[SCC缩点]
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校").注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学 ...
- postgresql —— 零碎笔记
聚合函数 -- 聚合查询 SELECT city, max(temp_lo) FROM weather WHERE city LIKE 'S%' GROUP BY city HAVING max(te ...
- Selenium常用API的使用java语言之2-环境安装之IntelliJ IDEA
1.安装IntelliJ IDEA 你可能会问,为什么不用Eclipse呢?随着发展IntelliJ IDEA有超越Eclipse的势头,JetBrains公司的IDE基本上已经一统了各家主流编程语言 ...
- 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)
题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间. ...