构造器和垃圾收集器
栈与堆
方法的调用和局部变量在栈,所有的对象在堆
栈顶上的方法是目前正在执行的。
对象的引用变量(就是遥控器)存放在栈上,而对象则存放到堆上
实例变量存放在所属对象的堆空间上。
构造函数
构造函数并不是一个方法
构造函数没有返回的类型,并且名称要与类名一致
分辨方法和构造函数的办法就是是否有返回类型
如果写了一个带有参数的构造函数,那么应该再写一个没有参数的构造函数
构造函数重载,编译器看的是参数的类型和顺序,不是参数的名字
实例变量有默认值,局部变量没有
构造函数可以是私有的
在创建新对象时,所有继承下来的构造函数都会执行。
抽象类作为父类,他的构造函数也会在具体子类创建出实例时执行。
调用父类的构造函数使用的是:super(); 如果我们在子类的构造函数里面不写,那么编译器会自动帮我们添加,只不过添加的是没有参数的版本
使用this()来从某个构造函数调用同一个类的另外一个构造函数,this()只能用在构造函数中,且必须是第一行语句。super()和this()不能兼得。
对象的生命周期
当最后一个引用消失的时候,对象就会变成可回收的。
对null引用执行圆点运算符会在执行期遇到NullPointerException这样的错误
数字与静态
Math方法
最接近全局的方法。
这个类中的所有方法都不需要实例变量值,因为这些方法是静态的。
静态(static)
静态的方法是以类名来调用的,静态的方法不需要类的实例
可以使用私有的构造函数来限制非抽象类被初始化
静态的方法不能调用非静态的变量,也不能调用非静态的方法
以引用变量名调用静态方法的程序代码可以实现,但是不推荐使用
静态变量的值对于所有的实例来说都相同,同一类所有的实例共享一份静态变量
静态变量会在该类的任何静态方法执行前就初始化。
final
final的变量代表你不能改变它的值。
final的方法代表你不能覆盖掉该方法。
final的类代表你不能继承该类(也就是创建子类)
总结一下(这块真的有点乱啊)
变量用static代表这是能够修改的全局变量,变量用final代表这是不能修改值的变量(可以看成是全局的),abstract不能修饰变量。
类用abstract修饰表示是类本身不能声明实例,只能由子类来声明实例;类用final修饰表示类不能有子类来继承;static不能修饰类。
方法用abstract修饰那么该类也是abstract,表示该方法必须由子类覆盖;方法用final代表子类中不能覆盖该方法;方法用static表示该方法的调用时用类名来实现的,不需要实例。
autoboxing(自动装箱)
包装类型(Interger)和primitive主数据(int)可以相互转换
可以用在很多的地方:方法的参数、返回值、Boolean表达式、数值运算、赋值
包装也有静态的实用性方法!(将String转换成primitive主数据类型:Integer.parseInt)、(将primitive主数据类型转换为String Double.toString)
数值转换成String,最简单的方法是将数字接上现有的String String doubleString = “ ” + d;
数字的格式化
调用静态的String.format()并传入值与格式设定
格式化说明的格式:%[argument number] [flags] [width] [.precious] type
format()函数不是用的重载实现的,而是使用的java的一项新的功能:可变参数列表
日期
Date Today = new Date();
String.format("%tA, %<tB %<td", Today);
操作日期可以使用:java.util.Calendar
Calendar cal = Calendar.getInstance();
静态import
可以少打几行代码,但是会使代码变得难以阅读
11、异常处理
使用try/catch块告诉编译器调用方法有风险的
异常时一种Exception类型的对象
方法可以抓住其他方法所抛出的异常。异常总是会丢给调用方。会抛出异常的方法必须要声明他有可能会这么做
finally:无论如何都要执行的部分
异常时多态的,以异常的父类来声明会抛出的异常
如果不想处理异常,可以把它duck掉来避开,但这是在踢皮球
异常处理规则:如果只带有finally的try必须要声明异常