Head First Java学习:第十章-数字很重要
1、Math 方法:最接近全局的方法
一种方法的行为不依靠实例变量值,方法对参数执行操作,但是操作不受实例变量状态影响,那么为了执行该方法去堆上建立对象实例比较浪费。
举例:
Math mathObject = new Math();
报错:Math() has private access in java.lang.Math
而是可以直接使用:
int x = Math.round(43.4);
int y = Math.min(43,23);
int z = Math.abs(-34);
总结:在Math这个类中的所有方法都不需要实例变量值。因为这些方法都是静态的,所以无需Math的实例,你会用到的只有类本身。
2、非静态方法与静态方法的差别
当 需要方法而不需要类的实例,那么可以用 static 关键字标记出该。
使用 static 关键字标记“不需要类实例的方法”,称为“静态方法”。
举例:
public static int min(int a,int b){
//返回a与b中较小的值
}
如何调用:
- 以类的名称调用静态方法:min(88,43);
- 以引用变量的名称调用非静态的方法:
Song t = new Song();
t.play();
3、带有静态方法(static)的含义
抽象类(abstract修饰),不能创建出实例,即抽象的类不能被初始化。
非抽象的类如何限制初始化?
把构造方法标记为私有(private,只能被同一类的程序调用),则无法创建出类的实例,编译器会知道不能存取这些私有的构造函数。
不代表有一个或多个静态方法的类不能被初始化,只要有main的类都有静态方法。main()一般用来启动或测试其他类,从main() 中创建类的实例并调用新实例上的方法。
在类中可以组合静态方法和非静态方法。非静态方法都需要以某种实例操作,取得新对象的方法只有通过new或者序列化(deserialization)或者Java Reflection Api。
4、静态方法调用其他方法和变量
第一:静态方法不能调用非静态的变量
静态方法使用通过类的名称来调用,不需要类的实例(不知道堆上有哪些实例),所以也无法引用到该类的任何实例变量,也不会知道可以使用哪个实例变量值。
如果调用非静态的变量,会报错:non-static variable size cannot be referenced from a static context
第二:静态方法不能调用非静态的方法
非静态方法都是以实例变量的状态来影响该方法的行为。调用非静态方法,会在非静态方法中用到实例变量,但是静态方法无法引用该类的任何实例变量。
如果调用非静态的方法,会报错:non-static method getSize() cannot be referenced from a static context
5、静态变量
静态变量是共享的。
同一个类所有的实例共享一份静态变量。
实例变量:每个实例一个
静态变量:每个类一个,也叫类变量。类名.静态变量名 存取
代码举例:
package chap10;
public class Duck {
private int size;
// 静态变量只有在类第一次载入的时候被初始化
static int duckCount = 0;
// 构造函数执行时,静态变量duckCount的值就会增加1
public Duck(){
duckCount ++;
System.out.println("duckCount的值是:"+duckCount);
}
public void setSize(int s){
size = s;
}
public int getSize(){
return size;
}
}
package chap10;
public class TestDuck {
public static void main(String[] args) {
Duck d1 = new Duck();
d1.setSize(10);
System.out.println(d1.getSize());
Duck d2 = new Duck();
d2.setSize(20);
System.out.println(d2.getSize());
Duck d3 = new Duck();
d3.setSize(30);
System.out.println(d3.getSize());
Duck d4 = new Duck();
d4.setSize(40);
System.out.println(d4.getSize());
System.out.println("静态变量duckCount的值:"+Duck.duckCount);
}
}
结果:
duckCount的值是:1
10
duckCount的值是:2
20
duckCount的值是:3
30
duckCount的值是:4
40
静态变量duckCount的值:4
静态变量的起始动作:类被加载时初始化。
静态项目的初始化有两项保证:
- 静态变量会在该类的任何对象创建之前就完成初始化
- 静态变量会在该类的任何静态方法执行之前就初始化
默认值:主数据类型:0/0.0/false;对象引用:null
如果没有给静态变量赋初值,它会被设定默认值。静态变量的默认值就是该变量类型的默认值。
6、静态的final变量是常数
标记为final的变量,一旦被初始化就不会改动;
类加载后,静态final变量就一直会维持原值。
举例:public static final double PI = 3.141592653589793;
- public 可以供各方读取
- static,不需要Math的实例
- final,类加载后,不变
注意:如何区分变量为不变的常数:都是大写字母!
静态final变量初始化:
方法一:声明的时候
public class Foo{
public static final int FOO_X = 25;
}
方法二:在静态初始化程序中
public class Foo{
public static final double BAR_SIGN;
// 类加载时执行
static{
BAR_SIGN = (double) Math.random();
}
}
如果以上两种方法都没有使用,编译器会报错,变量没有被初始化
7、其他的final
非静态final变量:不能改变它的值。
final的方法:不能被覆盖
final的类:不能被继承
目的:安全
8、Math的常用方法
1)Math.random() 返回0.0~1.0之间的双精度浮点数
double r1 = Math.random();
int r2 = (int) (Math.random() * 5);
2)Math.abs() 返回双精度浮点型参数的绝对值,有覆盖版本
int x = Math.abs(-230); //230
double d = Math.abs(240.45); //240.45
3)Math.round() 返回四舍五入之后的整型或长整型
int x = Math.round(-24.8f);//-25
int y = Math.round(24.45f);//24
4)Math.min() 返回参数中较小的一个
5)Math.max() 返回参数中较大的一个
9、主数据类型的包装类
包装类型
给每个基本类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类型统称包装类(Wrapper Class),位于 java.lang 包。
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Boolean |
| int | Integer |
| long | Long |
| double | Double |
| float | Float |
| char | Character |
| boolean | Boolean |
除了Integer和Character类,其他类都和基本类型一致,只是类名第一个字母大写。
为什么要包装类:
有些地方需要用到对象而不是基本数据类型,比如集合的容器要求元素是 Object类型,因此int、double等类型就benign放进去。
拆箱和装箱
装箱(boxing): 基本数据类型 --> 包装类,实现:包装类.valueof()
拆箱(unboxing):包装类 --> 基本数据类型,实现:包装类对象.xxValue()
举例:
// 装箱
Integer integer = Integer.valueof(1);
// 拆箱
int i = integer.intValue();
自动拆箱和自动装箱
java自动把上述过程实现,原理还是:包装类.valueof() 实现自动装箱;包装类对象.xxValue()实现自动拆箱。
public static void main(String[] args){
Integer integer = 1;//装箱
int i = integer; // 拆箱
}
补充:哪些地方会自动拆装箱
- 场景1:将基本数据类型放入集合类 --》自动装箱
- 场景2:包装类型和基本类型的大小比较 --》自动拆箱,== ,包装类拆箱变成基本数据类型比较
- 场景3:包装类型的计算 --》自动拆箱成基本类型计算
- 场景4:三目运算符的使用 --》第2,第3位操作数分别是基本类型和对象,其中对象会拆箱成基本类型。如果对象是null会发生空指针异常。
- 场景5:函数参数和返回值
10、String 和 primitive主数据类型的互转
1)将String转换成primitive 主数据类型
package chap10;
public class Test02 {
public static void main(String[] args) {
String s = "2";
// String 转换成int
int x = Integer.parseInt(s);
// String 转换成 double
double y = Double.parseDouble("23.45");
// String 转换成 boolean
// Boolean 的构造函数可以取用String来创建对象
boolean b = new Boolean("true").booleanValue();
}
}
有异常的场景:
String t = "two";
int z = Integer.parseInt(t);
编译不报错,运行报错

2)将primitive 主数据类型转换成String
// 主数据类型转换成String
double d = 42.5;
// 方法1:使用 + 操作符
String doubleString = ""+d;
// 方法2:使用静态方法 toString()
String doubleString2 = Double.toString(d);
11、数字的格式化,格式化解析
将数字以带逗号的形式格式化:举例
public class TestFormats {
public static void main(String[] args) {
// 格式设定:将数字以都逗号分开
String s = String.format("%,d",1000000000);
System.out.println(s); // 1,000,000,000
}
}
format("%,d",1000000000) 格式化的两部分:格式指令 + 要格式化的值。
1)格式指令:"%,d" ,说明:% 符号表示把第二个参数放到这里;",d" 该参数要使用的格式
2)要格式化的值:1000000000
含义:把第二个参数以第一个参数所表示带有逗号的整数方式表示。
常用格式化语句语法:
%,d :代表以十进制整数带有逗号的方式表示
%.2f :代表以小数点后两位的方式格式化此浮点数
%,.2f :代表整数部分以有逗号的形式表示,小数部分保留两位
“格式化说明的格式”

必填的只有类型,比如 %d、%f、%x、%c。
有多项参数时:按照顺序对应到格式化设定
int one = 23456567;
double two = 12345.34567;
String result = String.format("the rank is %,d out of %,.2f",one,two);
System.out.println(result);//the rank is 23,456,567 out of 12,345.35
12、日期
日期的格式化:
Date today = new Date();
String t1 = String.format("%tc", today);// 完整的日期和时间
String t2 = String.format("%tr",today);// 只有时间
String t3 = String.format("%tA %tB %td",today,today,today);// 周、月、日
System.out.println("t1: "+ t1);//t1: 星期一 五月 09 17:46:05 CST 2022
System.out.println("t2: "+ t2);//t2: 05:46:05 下午
System.out.println("t3: "+ t3);//t3: 星期一 五月 09
Java.util.Date
适合取得当前时间,如:Data today = new Date();
Java.util.Calendar
1、Calendar 抽象的
抽象类无法new 对象创建实例,但是可以调用其静态方法 getInstance(),会返回继承过Calendar的对象。
Calendar cal = Calendar.getInstance();
大部分java版本会返回 java.util.GregorianCalendar 的实例。
2、运用Calendar对象
- 字段会保存状态
- 日期和时间可以运算
- 日期和时间可以用微秒表示
package chap10;
import java.util.Calendar;
public class TestCalendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.set(2022,3,14,18,30);
System.out.println(c);//java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=3,WEEK_OF_YEAR=20,WEEK_OF_MONTH=2,DAY_OF_MONTH=14,DAY_OF_YEAR=129,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=30,SECOND=0,MILLISECOND=398,ZONE_OFFSET=28800000,DST_OFFSET=0]
// 当前时间以微秒展示
long day1 = c.getTimeInMillis();
System.out.println(day1);//1649932200398
// day1 加上一个小时
day1 += 1000*60*60;
System.out.println(day1);//1649935800398
//加一个小时
c.setTimeInMillis(day1);
System.out.println("new hour:"+c.get(c.HOUR_OF_DAY));//new hour:19
// 加35天
c.add(c.DATE,35);
System.out.println("add 35 days: "+c.getTime());// add 35 days: Thu May 19 19:30:48 CST 2022
//滚动35天
c.roll(c.DATE,35);
System.out.println("roll 35 days: "+c.getTime());//roll 35 days: Mon May 23 19:30:48 CST 2022
// 设置DATE的值
c.set(c.DATE,1);
System.out.println("set to one: "+c.getTime());//set to one: Sun May 01 19:30:26 CST 2022
}
}
Head First Java学习:第十章-数字很重要的更多相关文章
- Java学习笔记 06 数字格式化及数学运算
一.数字格式化 DecimalFormat类 >>DecimalFormat是NumberFormat的子类,用于格式化十进制数,可以将一些数字格式化为整数.浮点数.百分数等.通过使用该类 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十二周
java学习第十章:图形程序设计 本章,介绍的是如何编写使用图形用户界面GUI的java程序.主要讲的是如何编写定义屏幕上的窗口大小和位置的程序,如何在窗口中采用多种字体显示文本,如何显示 ...
- Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)
Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...
- java学习 猜数字
package study; import java.util.Scanner; /** * 猜数字小游戏 * * @author carry * */ public class GuessNumbe ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第六周《Java学习笔记》
20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...
- Java学习第一天
Java学习第一天 对于网络管理员或者黑客必须知道的八个cmd命令 详情请参考:http://www.2cto.com/os/201608/533964.html nbtstat ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- Java学习-047-数值格式化及小数位数四舍五入
此小工具类主要用于数值四舍五入.数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍 ...
- Java学习-027-JSON 之一 -- 初识
通常,我们在生活中使用的应用产品(无论是 Web应用还是 App 应用),又或者我们平常的信息交流,均无可避免的存在着信息交互,在信息交互的过程中就有着信息载体的存在.那么,在我们熟知的网络应用产品中 ...
随机推荐
- 千万级数据深分页查询SQL性能优化实践
一.系统介绍和问题描述 如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系:并对外提供各种关系查询,比如查询用户的关注商品或店铺列表, ...
- 【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控
大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接 ...
- 基于opencv-pyhton与opencv-c++的结合理解与学习
2023年上半年,一直在学习opencv-c++版本,学习了其中的多个库函数 笔记链接:https://www.cnblogs.com/Tan-code/category/2339311.html o ...
- Excelize 开源基础库 2.8.0 版本正式发布
Excelize 是 Go 语言编写的用于操作电子表格办公文档的开源基础库,基于 ISO/IEC 29500.ECMA-376 国际标准.可以使用它来读取.写入由 Microsoft Excel.WP ...
- Codeforces Round 882 div.2 B
Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...
- 了解JAVA内存模型(JMM)
1.概述 我们常说的JMM指的是Java内存模型(Java Memory Model,JMM),主要用于控制Java程序解决线程间如何通信和数据同步,JMM规范了多线程访问共享内存时的 可见性.有序性 ...
- 主动写入流对@ResponseBody注解的影响
问题回溯 2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的) 商家中心报错(JSON串): {"code":-1, ...
- 探析ElasticSearch Kibana在测试工作中的实践应用
一. 为什么使用ES Kibana 离线数据测试中最重要的就是数据验证,一部分需要测试es存储数据的正确性,另一部分就需要验证接口从es取值逻辑的正确性.而为了验证es取值逻辑的正确性,就需要用到Ki ...
- Solution Set -「ABC 197」
「ABC 197A」Rotate Link. 略. #include<bits/stdc++.h> using namespace std; int main(){ char a,b,c; ...
- tiptopGP5.2链接所有表或报不存在函数处理
修改交易的表时需要特别注意,改完要关联所有有关的表r.rb.rb pja_file 当链接提示不存在的函数调用,又无法确定具体是那个关联程序时, 可以在本函数内先定义这个报错的函数,重新链接时,系统会 ...