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. 每日一库:fsnotify简介

    fsnotify是一个用Go编写的文件系统通知库.它提供了一种观察文件系统变化的机制,例如文件的创建.修改.删除.重命名和权限修改.它使用特定平台的事件通知API,例如Linux上的inotify,m ...

  3. 用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力

    本教程收集于:AIGC从入门到精通教程汇总 操作指引 ChatGPT产生文案=>腾讯智影数字人播报=>粘贴文案=>导出视频. 说明:部分资源只有会员才能用~,非会员可生成5分钟视频. ...

  4. mac安装mysql8.0

    1.进入下载页 历史版本:https://downloads.mysql.com/archives/community/ 最新版本:https://dev.mysql.com/downloads/my ...

  5. 《Kali渗透基础》07. 弱点扫描(一)

    @ 目录 1:漏洞发现 1.1:Exploit-DB 1.2:searchsploit 1.3:nmap 2:漏洞管理 3:弱点扫描类型 4:漏洞基本概念 4.1:CVSS 4.2:CVE 4.3:O ...

  6. 多重断言插件之pytest-assume的简单使用

    背景: pytest-assume是Pytest框架的一个扩展,它允许在单个测试用例中多次断言.通常情况下,当一个断言失败时,测试会立即停止执行,而pytest-assume允许我 们继续执行剩余的断 ...

  7. stencilJs学习之构建 Drawer 组件

    前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop.State.Event.Listen.Method.Component 以及生命周期方法.这些 ...

  8. Linux下MySQL备份指定数据库命令

    比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [root@linuxsir01 root]# mysqldump -u root -p li ...

  9. 【matplotlib基础】--样式表

    Matplotlib库 由于诞生的比较早,所以其默认的显示样式很难符合现在的审美,这也是它经常为人诟病的地方. 不过,经过版本更迭之后,现在 Matplotlib 已经内置了很多样式表,通过使用不同的 ...

  10. 从DevOps实践落地的角度谈谈“流程”和“规范"的反模式

    最近在经历的一些事情,让我突发灵感,觉得要写点关于DevOps体系建设过程中的"流程规范",记录下来. 如何解读"流程规范" 谈到DevOps落地,无一例外都会 ...