Head First Java#10_数字与静态

在Math这个类中的所有方法都不需要实例变量值。因为这些方法都是静态的,所有你无需Math的实例。你会用到的只有它的类本身。
非静态方法与静态方法的差别
static这个关键字可以标记出不需要实例的方法,一个静态的方法代表说:“一种不依靠实例变量也就不需要对象的行为”。
非静态方法和静态方法
非静态方法有实例变量,静态方法没有实例变量
非静态:以引用变量的名称调用非静态的方法
            Song t2 = new Song();
            t2.play();
静态:以类的名称调用静态的方法
           Math.min(88.86);
静态类它不能够被初始化,它的构造函数是被私有化了,要记得,被标记为private的方法代表只能被同一类的程序说调用。只有main()的类都算有静态的方法。
静态的方法不能调用非静态的变量
静态的方法是通过类的名称来调用,所以静态的方法无法引用用该类的任何实例变量。
静态变量:它的值对所有的实例来说都相同
静态变量的功用:被同类的所有实例共享的变量(静态表里只会在第一次载入时会被初始化)
静态变量的起始动作
静态 变量是在类被加载时初始化的。类会被加载是因为Java虚拟机认为它该被加载了。
静态项目的初始化:
     静态变量会在该类的任何对象创建之前就完成初始化。
     静态变量会在该类的任何静态方法执行之前就初始化。
静态的final变量是常数、
public static final double PI = 3.141592653589793;

final不只用在静态变量上...
你可一颗永final关键字来修饰非静态的变量,这包括了实例变量,局部变量甚或是方法的参数。不管哪一种,这都代表它的值不能变动。你也可以用final来防止方法的覆盖过创建子类。
final的变量代表你不能改变它的值
final的method代表你不能覆盖掉该method
final的类代表你不能继承该类

要点:
@静态的方法应该用类的名称来调用,而不是用对象引用变量
@静态的方法可以直接调用而不需要堆上的实例
@静态的方法不能存取非静态的方法。
@如果类只有静态的方法,你可以将构造函数标记为private的以避免被初始化
@静态变量为该变量所属类的成员所共享。静态变量只会有一份,而不是每个实例都有自己的一份。
@在Java中的常量时把变量同时标记为static和final
@final的静态变量值必须在声明或静态初始化程序中赋值
    static {
     DOG_CODE = 420;
}
@常量的命名惯例是全部使用大写字母。
@final值一旦被赋值就不能更改
@final的方法不能被覆盖
@final的类不能被继承

primitive主数据类型的包装
Boolean,Character,Byte,Short,Integer,Long,Float,Double
Character和Interger这个名称与primitive主数据类型不同,是完整拼出来的
包装值:
 int i = 288;
 Integer iWrap = new Integer(i);
解开包装:
int unWrapped = iWrap.intValue();所有的包装类都有类似这样的方法

包装也有静态是实用性方法!
除了一般类的操作外,Integer.parseInt()
这个方法取用String并返回给你primitive主数据类值。
将String转换成primitive主数据类型值是很容易的
String s = "2";
int x = Integer.parseInt(s);
double d = Double.parseDouble("420.24");

boolean b = new Boolen("true").booleanValue();其实没有Boolean.parseBoolean(),但是Boolean的构造函数可以取用String来创建对象但是这样的话,就要出差错了
String t = "two";
int y = Integer.parseInt(t);


反过来讲primitive主数据类型值转换成String
有好几种方法可以将数值转换成String. 最简单的方法是将数字接上现有的String
  Double d = 42.5;
   String doubleString = "" + d; "+"这个操作符是java中唯一有重载过的运算符

 double d= 42.5;
  String doubleString = Double.toString(d); Double这个类的静态方法。

数字格式化
在java中,数字与日期的格式化功能并没有结合在输出/输入功能上。通常对用户显示数字时通过GUI来进行的,你会把String放在可滚动的文字区域或表格中。如果格式化功能只有绑在文字模式输出的命令上,那就没有办法吧字符串以比较漂亮的格式输出到GUI上。只需要调用静态的String.format()并传入值与格式设定就好。
我们还是得知道如何提供格式设定。

将数字以带逗号的形式格式化
   public class TestFormats{
    public static void main(String[] args){
        String s = String.format("%, d",1000000000);   “%, d”格式设定,用来只是用该用那种形式来输出,这里                                                                       的逗号是表示数字要以逗号来分开,并不是说这里有%与d两项参数
        System.out.println(s);
      }
}
output:   1,000,000,000


解析格式化结构
格式指令 :描述要输出的特殊格式
要格式化的值 :不是所有东西都能被格式化。例如,如果你的格式指令适用于浮点数,则你就不能传入Dog或看起来很像浮点数的String。
format( , );
格式说明的顺序室友规定的:
%[argument number] [flags] [width] [.precision]type
                                  flags:特定类类型的特定选项,例如数字要加逗号或正负号
                                           width:最小的字符数。注意:这不是总数;输出可以超过次宽度,若不足则会主动补零
                                    .precision:精确度,注意前面有个圆点符号
                                            type:一定要指定的类型标识
format("%,6.1f", 42.000);--->42.0

%d 参数必须能够与int相容
%f 参数必须是浮点数类型
%x 参数必须是byte,short,int,long,BigInteger.
%c 参数byte,short,int,long,

数值与日期时间格式化的主要差别在于日期格式的类型是用“t”开头的两个字符来表示
完整的日期与时间:%tc
  String .format("%tc",new Date()); Sun Nov 28 14:52:41 MST 2017
只有时间: %tr
   String.format("%tr",new Date()); 03:01:47 PM
周,月,日:%tA %tB %td
   因为没有刚好符号我们要求的输出格式,所以得组合3中形式来产生出所需要的格式:
        Date today = new Date();
         String.format("%tA, %tB %td",today,today,today);  Sunday, November 28
同上,但不用重复给参数
          Date today = new Date();
          String.format("%tA, %<tB %<td",today );  "<"这个符号是个特殊的指示,用来告诉格式化程序重复利用之前用过的参数


操作日期
要去的当前的日期时间就用Date,其余功能可以从Calendar上面找.
java.util,cakendar

要用静态的方法:
Calendar cal = Calendar.getInstance();  这个语法看起来很熟悉--是个对静态方法的调用
无法取得实例,但你可以取得它的具体子类的实例。
运用Calendar对象
要运用Calendar对象你得先了解几个关键的概念:
@字段会保存状态---Calendar对象使用许多字段来表示某些事物的最终状态,也就是日期和时间。比如说你可以读取和设定它的year或month字段。
@日期和时间可以运算---Calendar的方法能够让你对不同的字段作加法或减法的运算,比如说对month字段加一个月或对year减去三年
@日期与实践可以用millisecond来表示---Calendar可以让你将日期转换成微秒的表示法,或将微秒转换成日期。因此你可以执行精确的相对时间计算。
Calendar c = Calendar.getInstance();

c.set(2017.8.2.15.10);  将时间设定为2017年8月2日15:10,注意月份是零基的
long day1 = c.getTimeInMillis(); 将目前时间转换为以millisecond表示
day1 += 1000 * 60 * 60;
c.setTimeInMillis(day1);将c的时间加上一个小时
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());

Calendar  API的精华
重要方法:
add(int field,int amout)  加减时间值
get(int field)取出指定字段的值
getInstance()返回Calendar,可指定地区
getTimeInMillis()以毫秒返回时间
roll(int field,boolean up)加减时间值,不进位
set(int field,int value)设定指定字段的值
set(year,month,day,hour,minute)设定完整的时间
setTimeInMillis(long millis)以毫秒指定时间
关键字段
DATE/DAY_OF_MONTH  每月的记号
HOUR/HOUR_OF_DAY  小时
MILLISECOND 毫秒
MINUTE  分钟
MONTH 月份
YEAR 年份
ZONE_OFFSET   时区位移



旧式的写法:
import java.lang.Math;
class NoStatic{
    public static void main(String [] args){
         System.out.println("sqrt" + Math.sqrt(2.0));
         System.out.println("tan" + Math.tan(60));
     }
}

使用static import 的写法
import static java.lang.System.out;
import static java.lang.Math.*;
class WithStatic {
   public static void main(string [] args) {
      out.println("sqrt" + sqrt(2.0));
      out.println("tan" + tan(60));
    }
}

如果只会用到一两次,不如不用静态的import,这样程序会比较好阅读
如果用到多次,或许用static的import会让程序看起来比较清爽
在静态import的声明中也可以使用.*这样的通用字符
更重要的问题是很容易产生名称的冲突,例如add()到底是要调用哪个方法




  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值