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. 场景1:将基本数据类型放入集合类 --》自动装箱
  2. 场景2:包装类型和基本类型的大小比较 --》自动拆箱,== ,包装类拆箱变成基本数据类型比较
  3. 场景3:包装类型的计算 --》自动拆箱成基本类型计算
  4. 场景4:三目运算符的使用 --》第2,第3位操作数分别是基本类型和对象,其中对象会拆箱成基本类型。如果对象是null会发生空指针异常。
  5. 场景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学习:第十章-数字很重要的更多相关文章

  1. Java学习笔记 06 数字格式化及数学运算

    一.数字格式化 DecimalFormat类 >>DecimalFormat是NumberFormat的子类,用于格式化十进制数,可以将一些数字格式化为整数.浮点数.百分数等.通过使用该类 ...

  2. 201671010140. 2016-2017-2 《Java程序设计》java学习第十二周

    java学习第十章:图形程序设计       本章,介绍的是如何编写使用图形用户界面GUI的java程序.主要讲的是如何编写定义屏幕上的窗口大小和位置的程序,如何在窗口中采用多种字体显示文本,如何显示 ...

  3. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  4. java学习 猜数字

    package study; import java.util.Scanner; /** * 猜数字小游戏 * * @author carry * */ public class GuessNumbe ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

  7. Java学习第一天

    Java学习第一天 对于网络管理员或者黑客必须知道的八个cmd命令 详情请参考:http://www.2cto.com/os/201608/533964.html          nbtstat  ...

  8. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  9. Java学习-047-数值格式化及小数位数四舍五入

    此小工具类主要用于数值四舍五入.数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍 ...

  10. Java学习-027-JSON 之一 -- 初识

    通常,我们在生活中使用的应用产品(无论是 Web应用还是 App 应用),又或者我们平常的信息交流,均无可避免的存在着信息交互,在信息交互的过程中就有着信息载体的存在.那么,在我们熟知的网络应用产品中 ...

随机推荐

  1. 千万级数据深分页查询SQL性能优化实践

    一.系统介绍和问题描述 如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系:并对外提供各种关系查询,比如查询用户的关注商品或店铺列表, ...

  2. 【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控

    大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接 ...

  3. 基于opencv-pyhton与opencv-c++的结合理解与学习

    2023年上半年,一直在学习opencv-c++版本,学习了其中的多个库函数 笔记链接:https://www.cnblogs.com/Tan-code/category/2339311.html o ...

  4. Excelize 开源基础库 2.8.0 版本正式发布

    Excelize 是 Go 语言编写的用于操作电子表格办公文档的开源基础库,基于 ISO/IEC 29500.ECMA-376 国际标准.可以使用它来读取.写入由 Microsoft Excel.WP ...

  5. Codeforces Round 882 div.2 B

    Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...

  6. 了解JAVA内存模型(JMM)

    1.概述 我们常说的JMM指的是Java内存模型(Java Memory Model,JMM),主要用于控制Java程序解决线程间如何通信和数据同步,JMM规范了多线程访问共享内存时的 可见性.有序性 ...

  7. 主动写入流对@ResponseBody注解的影响

    问题回溯 2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的) 商家中心报错(JSON串): {"code":-1, ...

  8. 探析ElasticSearch Kibana在测试工作中的实践应用

    一. 为什么使用ES Kibana 离线数据测试中最重要的就是数据验证,一部分需要测试es存储数据的正确性,另一部分就需要验证接口从es取值逻辑的正确性.而为了验证es取值逻辑的正确性,就需要用到Ki ...

  9. Solution Set -「ABC 197」

    「ABC 197A」Rotate Link. 略. #include<bits/stdc++.h> using namespace std; int main(){ char a,b,c; ...

  10. tiptopGP5.2链接所有表或报不存在函数处理

    修改交易的表时需要特别注意,改完要关联所有有关的表r.rb.rb pja_file 当链接提示不存在的函数调用,又无法确定具体是那个关联程序时, 可以在本函数内先定义这个报错的函数,重新链接时,系统会 ...