10 数字与静态
static这个关键词可以标记出不需类实例的方法。
非静态方法:
静态方法:(米有对象,绝对木有)
以类的名称调用静态的方法;Math.min(88,86);
以引用变量的名称调用非静态的方法:Song t2 = new Song(); t2.play();
静态方法无法看到实例变量的状态————》静态方法不能调用非静态变量;静态方法不能调用非静态方法。
静态变量:它的值对所有的实例来说都相同(被同类的所有实例共享) 静态变量只会在第一次载入时被初始化
实例变量:每个实例一个
静态变量:每个类一个
静态变量会在该类的任何对象创建之前就完成初始化。
静态变量会在该类的任何静态方法执行之前就初始化。
静态变量也是通过类的名称来存取。如果没有给静态变量赋初值,它就会被设定默认值。(静态变量的位置跟实例变量一样,实例变量在未设定初值的情况下也会被赋默认值)
静态的final变量是常数。一个被标记为final的变量代表它一旦被初始化之后就不会改动。常数变量的名称都是大写字母。
静态final变量的初始化:
静态初始化程序是一段在加载类时会执行的程序代码,它会在其他程序可以使用该类之前就执行。
- final可以修饰静态变量,也可以修饰非静态变量(实例变量、局部变量、方法的参数)
- final的变量代表你不能改变它的值。
- final的method代表你不能覆盖该method。
- 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虚拟机中断