一、静态方法
1 概念
静态方法不需要实例变量,用static关键词标记方法即为静态方法;
以类的名称调用静态的方法,以实例变量调用非静态的方法;
如下是非静态方法:
public class Song{
// 实例变量的值会影响play()方法的行为
String title;
public Song(String t){
title = t;
}
public void play(){
SoundPlayer player = new SoundPlayer();
player.playSound(title);
}
}
如下是静态方法,没有实例变量,直接用类的名字调用方法Math.min(1988, 1991);
public static int min(int a, int b){
// 返回a和b中较小的值
}
2 静态/非静态方法对静态/非静态变量的调用
2.1 静态方法不能直接调用非静态变量;
public class Duck{
private int size;
public static void main(String[] args){
// 编译器报错,无法确定是哪个实例的变量
System.out.println(size);
/*
但可new一个对象,来对其非静态的变量进行访问
Duck duck = new Duck();
System.out.println(duck.size);
*/
}
public void setSize(int s){
size = s;
}
public int getSize(){
return size;
}
}
2.2 静态方法不能直接调用非静态方法;
public class Duck{
private int size;
public static void main(String[] args){
// 编译器报错,无法确定是哪个实例的方法
System.out.println(getSize());
/*
但可new一个对象,来对其非静态的变量进行访问
Duck duck = new Duck();
System.out.println(duck.getSize());
*/
}
public void setSize(int s){
size = s;
}
public int getSize(){
return size;
}
}
2.3 静态方法可调用静态变量;
2.4 非静态方法可调用静态变量和静态方法;
二、静态变量
静态变量是共享的,同一类所有的实力共享一个静态变量;
静态变量只在类第一次载入的时候被初始化;
每个实例一个实例变量,每个类一个静态变量;
以类的名称调用静态变量,以实例变量调用非静态变量;
静态变量在该类的任何对象创建之前就完成初始化,在该类的任何静态方法执行之前初始化;
三、静态final常数
1 概念
静态的final变量是常数,即常数是把变量同时标记为static和final的;
常数变量的名称应该都是大写字母,并以下划线将字符隔开;
一旦被初始化就不会改动;
2 静态final变量的初始化方法:
2.1 声明的时候
public class Foo{
public static final int FOO_X = 5;
}
2.2 在静态初始化程序中
public calss Bar{
public static final double BAR_SIGN;
static{
BAR_SIGN = (double)Math.random();
}
}
3 final修饰变量、方法、类
final的变量一旦复制就不能更改;
final的方法不能被覆盖;
final的类不能被继承;
注意:若一个类不能被子类化,则其方法根本无法被覆盖;若只是想要限制部分的方法不能被覆盖,则单独标记其为final;
四、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(-325);
double d = Math.abs(325.829);
3 Math.round()
根据参数是浮点数或双精度浮点数,返回四舍五入后的整型或长整型值;
int x = Math.round(-3.25f);
long y = Math.round(8.29);
4 Math.min()
返回两个参数中较小的一个;
该方法有int、long、float或double的覆盖版本;
int x = Math.min(325, 829);
double y = Math.min(3.25, 8.29);
5 Math.max()
返回两个参数中较大的一个;
该方法有int、long、float或double的覆盖版本;
五、包装类
1 概念
每个primitive主数据类型都有一个包装用的类,且因为这些包装类都在java.lang包中,因此无需import它们;
包装类包括Boolean、Character、Byte、Short、Integer、Long、Float、Double;
1.1 包装值
int i = 829;
Integer iWrap = new Integer(i);
1.2 解开包装
int unWrapped = iWrap.intValue();
2 自动打包autoboxing
不必把primitive主数据类型与对象分得太清楚;
public void doNumsNewWay(){
// 创建Integer类型的ArrayList
ArrayList<Integer> listOfNumbers = new ArrayList<Integer>();
// 虽然ArrayList没有add(int)方法,但编译器会自动包装
listOfNumbers.add(3);
// 编译器自动解开Integer对象的包装,可直接赋值给int
int num = listOfNumbers.get(0);
}
注意:ArrayList<int>无法通过编译,因为generic类型的规则是只能指定类或接口类型;
2.1 方法的参数
若参数是某种包装类型,可传入相对应的primitive主数据类型,反之亦然;
// 可传入int类型或Integer对象
void takeNumber(Integer i){
}
2.2 返回值
若方法声明为返回某种primitive主数据类型,可返回兼容的primitive主数据类型或该primitive主数据类型的包装类型;
int giveNumber(){
// x可以是int类型或Integer对象
return x;
}
2.3 boolean表达式
任何预期boolean值得为之都可用求出boolean的表达式代替;
// bool可以是boolean类型或Boolean对象
if(bool){
System.out.println("true");
}
2.4 数值运算
可在使用primitive主数据类型作为运算子的操作中以包装类型代替;
Integer i = new Integer(29);
i++;
Integer k = i + 3;
2.5 赋值
可将包装类型或primitive主数据类型赋值给声明成相对应的包装或primitive主数据类型;
// x可以是int类型或Integer对象
Double d = x;
3 包装类型的方法
3.1 将String转换成primitive主数据类型值
String str = "520";
int num = Integer.parseInt(str);
3.2 将primitive主数据类型转换成String
方法1 "+"操作数
double d = 3.25;
String doubleString = "" + d;
方法2 使用Double包装类的静态方法
double d = 8.29;
String doubleString = Double.toString(d);
六、数字格式化
1 导入类
import java.util.Formatter;
2 静态方法
String s = String.format(<格式指令>, <要格式化的值>);
3 格式化说明
格式化说明最多有5个部分(不包括%),以下[]都是可选项,因此只有%和type是必须的;
格式化说明的顺序是有规定的,必须要以这个顺序来指定;
"% [argument number] [flags] [width] [.precision] type"
其中,[argument number]——若要格式化的参数超过一个以上,可在此处指定哪一个;
[flags]——特定类型的特定选项,如数字要加逗号或正负号;
[width]——最小的字符数,但不是总数,输出可以超过次宽度,若不足则自动补零;
[.precision]——精确度,注意前面有个圆点符号;
type——一定要指定的类型标识,d表示参数与int相容,f表示参数是浮点型,x表示参数必须是byte/short/int/long/BigInteger,c表示参数必须是byte/short/int/long;
int one = 19880325;
double two = 19910829.00000;
String s = String.format("The rank is %,d out of %,.2f", one, two);
// The rank is 19,880,325 out of 19,910,829.00