Head First Java(2)——数字与静态及异常处理

10 数字与静态

static这个关键词可以标记出不需类实例的方法。

非静态方法:                                                                                                              

 静态方法:(米有对象,绝对木有)


以类的名称调用静态的方法;Math.min(88,86);

以引用变量的名称调用非静态的方法:Song  t2 = new Song();  t2.play();


静态方法无法看到实例变量的状态————》静态方法不能调用非静态变量;静态方法不能调用非静态方法。


静态变量:它的值对所有的实例来说都相同(被同类的所有实例共享)  静态变量只会在第一次载入时被初始化

实例变量:每个实例一个

静态变量:每个类一个


静态变量会在该类的任何对象创建之前就完成初始化。

静态变量会在该类的任何静态方法执行之前就初始化。


静态变量也是通过类的名称来存取。如果没有给静态变量赋初值,它就会被设定默认值。(静态变量的位置跟实例变量一样,实例变量在未设定初值的情况下也会被赋默认值)

静态的final变量是常数。一个被标记为final的变量代表它一旦被初始化之后就不会改动。常数变量的名称都是大写字母。

静态final变量的初始化:

静态初始化程序是一段在加载类时会执行的程序代码,它会在其他程序可以使用该类之前就执行。


  1. final可以修饰静态变量,也可以修饰非静态变量(实例变量、局部变量、方法的参数)
  2. final的变量代表你不能改变它的值。
  3. final的method代表你不能覆盖该method。
  4. final的类代表你不能继承该类(也就是创建它的子类)

静态方法不能存取非静态变量:

被静态修饰的东西是属于类的。优先于对象存在,同样也优先于实例变量存在。(用存在的访问未必存在的当然错误)

静态方法和变量,只要程序加载了类地字节码,不用创建任何实例对象就会被分配空间,他们就可以直接通过类访问;而类中的实例变量属于对象,只有对象被创建了,才会被分配空间。


在Java中的常量是把变量同时标记为static和final的。

generic类型的规则是你只能制定类或接口类型。so  ArrayList< 类型 >中的类型只能是Integer而不能是int。


autoboxing  primitive数据类型与引用对象互换(包装与解开)

1.方法的参数:如果参数是某种包装类型,可以传入相对应的primitive主数据类型,反之亦然


2.返回值:如果method声明为返回某种primitive主数据类型,可以返回兼容的primitive主数据类型或该primitive主数据类型的包装类型。


3.boolean表达式: 任何预期boolean值的位置都可以用求出boolean的表达式来代替。


4.数值运算:在使用primitive主数据类型作为运算子的操作中以包装类型来替换。可以对Integer的对象作递增运算。

Integer i = new Integer(42);

i++;

将String转换成primitive主数据类型:int x = Integer.parseInt(s);    s是String

将primitive主数据类型转换成String:


日期的格式化输出:



要取得当前的日期时间就用Date,其余功能可以从Calendar上面找。


Calendar cal = Calendar.gerInstance();     Calendar的引用到底引用了谁?

答:你无法取得Calendar的实例(抽象类),但是可以取得它的具体子类的实例。返回的是具体子类的实例。


滥用静态变量和方法是不成熟面向对象程序员的招牌。程序员应该想的是对象的状态而不是类地状态。


叉叉:构造函数不可以标记为静态的。

违背了面向对象规则。构造函数是为了将一个类实例化一个对象才需要使用的,进行一些必备的初始化操作(即使没写任何代码,实际上运行库爷帮你添加了很多操作)。何为静态,就是全局的,已经初始化过的,静态函数就是指该函数不和具体对象相关,只和类相关,但是构造函数是和对象直接关联的。矛盾~!!!!


11 异常处理

JavaSound被分为两个部分:MIDI和取样。 MIDI:不同电子发声装置沟通的标准协议。(MIDI文件带有音乐的信息,但不具备声音本身)本身不带声音,它带的是有MIDI播放功能装置的指令。


谁把异常抛出来的?   

当你的程序代码调用有风险的方法时,也就是声明有异常的方法,就是该方法把异常丢给你的。



方法2抓到了方法1抛出的异常,但是要在方法2中来解决。


除了RuntimeException这种特例之外,编译器会关照Exception所有的子集。任何继承过RuntimeException的类都不会受编译器关于是否声明它会抛出RuntimeException的检查。编译器不会注意RuntimeException类型的异常。RuntimeException不需要声明或被包在try/catch的块中。

可能会抛出异常的方法必须生命成throws Exception

如果try或catch块有return指令,finally还是会执行,流程会跳到finally然后再回到return指令~!!!


方法可以抛出多个异常,但该方法的声明必须要有含有全部可能的检查异常(若两个或两个以上的异常有共同的父类时,可以只声明该父类就行)


一个try,多个catch


有多个catch块时要从小到大,即从最底层的子类——>父类——>父类,最底层到最上层。

使用catch块时,Java虚拟机只会从头开始往下找到第一个符合范围的异常处理块。


方法抛出异常时,方法会从栈上立即被取出,而异常会再度丢给栈上的方法,也就是调用放方,如果调用方式个ducker(又一次throw此异常),则此ducker也会从栈被取出,异常再度抛给此时栈上方的方法。



异常处理规则:

1. catch与finally不能没有try

2. try一定要有catch finally

3. try与catch之间不能有程序

4. 只带有finally的try必须要声明异常(try 、 finally)

ex:void go() throws FooException{

try{

x.doStuff();

}finally{  }

}


编译器的检查异常和运行期异常都会被捕获。

main()方法必须处理所有未被处理的异常。错误~!!!如果它不管,Java虚拟机中断




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值