Java学习(八)——数字与静态

系列文章目录

一:上手
二:类和对象
三:primitive主数据类型和引用
四:方法操作实例变量
五:编写程序
六:继承、接口与多态
七:构造器与垃圾收集器
八:数字与静态



前言

行百里者半九十


1、非静态方法与静态方法的差别

Java是面向对象的,但若处于某种特殊的情况下,通常是使用方法,则不需要类的实例。static这个关键字可以标记处不需要实例的方法,一个静态的方法就代表说:“一种不依靠实例变量也就不需要对象的行为“。

非静态方法

public class Song {
	String title;//实例变量的值会影响到play行为
	public Song(String t) {
		title = t;
	}
	public void play() {
		Player player = new Player();
		player.playSound(title);//title的值会决定play方法的内容
	}
}

静态方法

public static int min(int a, int b) {
	//返回a与b中的较小值
}

以类的名称调用静态的方法,比如Math.min(8,9)
以引用变量的名称调用非静态的方法,比如
Dog d = new Dog();
d.eat();

事实上,带有main()的类都算有静态的方法。

2、静态方法的调用

静态的方法不能调用非静态的变量

静态的方法是在无关特定类的实例情况下执行的。因为静态的方法是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量。比如下面这段程序,编译器就会报错,因为它不知道你说的是哪个实例的变量

public class Duck {
	private int size;
	public static void main(String[] args) {
		System.out.println("Size of duck is " + size);//出错,不知道堆上是否有duck
	}
	
	public void setSize(int s) {
		size = s;
	}
	
	public int getSize() {
		return size;
	}
}

静态的方法也不能调用非静态的方法

比如下面这段程序就无法编译

public class Duck {
	private int size;
	public static void main(String[] args) {
		System.out.println("Size of duck is " + getSize());//调用getSize会用到size实例变量
	}
	
	public void setSize(int s) {
		size = s;
	}
	
	public int getSize() {
		return size;
	}
}

静态的变量的值对于所有的实例来说都是相同的

这就是静态变量的功能:被同类的所有实例共享的变量。
并且静态变量也是通过类的名称来进行存取
比如我们可以通过下面这样的程序来判断有多少个Duck对象被创建

class Duck {
	
	int size;
	static int duckNum = 0;
	//构造函数在此
	
	public Duck() {
		duckNum++;
		size =27;
		System.out.println("gagaga");
		System.out.println("Size is " + size);
	}
	
	public Duck(int DuckSize) {
		duckNum++;
		System.out.println("gagaga");
		size = DuckSize;
		System.out.println("Size is " + size);
	}
}

public class UseDuck {
	
	public static void main(String[] args) {
		System.out.println(Duck.duckNum);//创建实例之前
		Duck d1 = new Duck();//在这里会启动Duck的构造函数
		Duck d2 = new Duck(48);
		Duck d3 = new Duck();
		System.out.println(Duck.duckNum);//创建实例之后
		
	}
}

静态的final变量是常数

一个被标记为final的变量代表它一旦被初始化之后就不会改动。也就是说类加载之后静态final变量就一直维持原值。
public static final double PI = 3.1415926;

  • 此变量被标记为public,因此可供各方读取
  • 此变量被标记为static,所以不需要实例
  • 此变量被标记为final,因为圆周率是不变的
  • 常数变量的名称应该都要大写

静态final变量的初始化
1)声明的时候就初始化

public class Foo {
	public static final int FOO_X = 25;
}

2)在静态初始化程序中

public class Foo {
	public static final int FOO_X;

	static {
		FOO_X = (double) Math.random();
	}
}

final不只用在静态变量上
也可以用final关键字修饰非静态变量,包括实例变量、局部变量甚至方法的参数。不管哪一种,都代表它的值不能变动,也可以final来防止方法的覆盖或创建子类

1)非静态final变量

public class Foof {
	final int size = 1 ;//size将无法改变
	final int wuffie ;

	Foof() {
		whuffie = 24;//不能改变
	}
	
	void doStuff(final int x) {
		//不能改变x
	}
	void doMore() {
		final int z = 7;//不能改变z
	}
}

2)final的method

class Poof {
	final void calcWhuffie() {
		//绝对不能够被覆盖
	}
}

3)final的class

final class MyMostPerfectClass {
	//不能被继承过
}

3、primitive主数据类型的包装

每一个primitive主数据类型都有个包装用的类,且这些类都在java.lang中,所以不需要import他们。
当你需要以对象的方式来处理primitive主数据类型时,就要把它包装起来
Boolean
Character
Byte
Short
Integer
Long
Float
Double

装包

int i= 288Integer iWrap = new Integer(i);//传入primitive主数据类型给包装类的构造函数

拆包

int unWrapped = iWrap.intValue();//所有的包装类都有类似这样的方法

primitive int 的 ArrayList

当有自动装箱时,能够将primitive主数据类型转换成包装过的对象

public void doNumNewWay() {
	ArrayList<Integer> listOfNumbers = new ArrayList<Integer>();//创造Integer类型的ArrayList
	listOfNymbers.add(3);//直接加
	int num = listOfNumbers.get(0);//编译器会自动解开Integer对象的包装,因此可以直接赋值给int
}

自动装箱就是,虽然ArrayList没有add(int)这样的方法,但编译器会自动帮你包装。

将String转换成primitive主数据类型

String s = "2";
int x = Integer.parseInt(s);
double d = Double.parseDouble("420.33");

boolean b = new Boolean("true").booleanValue();//比较特殊

将primitive主数据类型转换成String

double d = 42.5;
String doubleString = "" + d;//+这个操作数是Java唯一有过重载的运算符

String doubleString = Double.toString(d); 

4、数字格式化结构

将数字带有逗号的形式输出

public class TestFormats {

	public static void main(String[] args) {
		String s1 = String.format("%,d", 100000000);//有逗号的数字格式
		System.out.println(s1);
	}
}

在这里插入图片描述

format方法中的%叫做格式化串,要把它想象成是会被方法其余参数替换掉的位置。
在格式化指令中,唯一必给的是类型。更多用法:

%,d:表示已十进制整数带有逗号的形式表示
%.2f:表示以小数点后两位的方式来格式化
%,.2f:整数部分由逗号表示,小数部分保留两位的方式格式化
%x:十进制保存
%c:保存ASCII码

当超过一项以上的参数时,依序进行格式化即可

public class TestFormats {

	public static void main(String[] args) {
		int one = 204566654;
		double two = 200567.24546;
		String s2 = String.format("The rank is %,d out of %,.2f", one, two);//超过一个参数
		System.out.println(s2);
	}
}

在这里插入图片描述

日期格式化表示

数字与日期时间格式化的主要差别在于日期格式的类型是用“t”开头的两个字符来表示:
主要是调用java.util.Date这个类,下面程序示例:

import java.util.*;

public class TestFormats {

	public static void main(String[] args) {
		
		String s3 = String.format("%tc", new Date());//完整日期与时间
		System.out.println(s3);
		
		String s4 = String.format("%tr", new Date());//只有时间
		System.out.println(s4);
		
		Date today = new Date();
		String s5 = String.format("%tA, %tB, %td", today, today, today);//周月日
		System.out.println(s5);
		
		String s6 = String.format("%tA, %<tB, %<td", today);//同上,但不用重复给参数
		System.out.println(s6);
		
	}
}

运行结果:
在这里插入图片描述

运用Calendar对象

java.util.Calendar主要是用来操作日期,要取得当前的 日期时就用Date,其他功能可以在Calendar上找。

import java.util.*;

public class TestCalendar {
	
	public static void main(String[] args){
		Calendar c = Calendar.getInstance();//对静态方法的调用
		c.set(2004,1,7,15,40);//设置日期
		long day1 = c.getTimeInMillis();//转换成微秒数,时间戳
		day1 += 1000 * 60 * 60;
		c.setTimeInMillis(day1);//加上一个小时
		System.out.println("new hour " + c.get(c.HOUR_OF_DAY));
		c.add(c.DATE, 35);//加上35天
		System.out.println("add 35 days " + c.getTime());
		c.roll(c.DATE, 35);//滚动35天,只有日期数字会滚动,月份不会动
		System.out.println("roll 35 days " + c.getTime());
		c.set(c.DATE, 1);//直接设定DATE值
		System.out.println("set to 1 " + c.getTime());
	}

}

执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值