对象的生与死
栈与堆:生存空间
对象的生存空间堆,和方法调用及变量的生存空间栈
当java虚拟机启动的时候,它自动从内存中扣取一块内存,并以此区段来执行java程序,至于有多少内存以及你是否能够调整它都要取决于java虚拟机和平台的版本。
变量的生存空间:
局部变量:栈
实例变量:所属的对象中
当调用一个方法的时候,该方法会放在调用栈的栈顶。实际被堆上栈的是堆栈块,它带有方法的状态,包括执行到哪一程序,以及所有的局部变量
栈顶的方法是目前正在执行的方法
为什么要了解堆与栈的机制?
如果想要了解变量的有效范围,对象的建立,异常处理,内存管理和线程处理,认识堆栈是很重要的
构造方法,new 的时候会执行其中的代码
如何分辨构造函数和方法:
java中可以有与类同名的方法,但是这样的方法有返回类型
构造函数不会被继承
父类的构造函数在对象的生命中所扮演的角色
在创建新对象的时候,所有继承下来的构造函数都会执行
构造函数链(从上网下运行)
调用父类的构造函数——super()
带参数的super(参数),因为在父类中,构造函数可以被重载,如果不给参数,那么就只会调用无参数的构造方法。如果有参数,则根据参数来调用相关的构造方法
由于父类必须在子类创建完成之前就需要完整地成型,因此super()在构造函数中必须写在首部,不能写在语句的后面,因为子类可能会用到某些继承下来的方法必须调用父类的实例变量
有参数的父类构造函数
没有无参数的构造函数的类将不能被继承
使用this()来从某个构造函数调用同一个类的另一个构造函数
this()只能用在构造函数中,且必须是第一行语句
super()与this()不能兼得
当我们不同的重载的构造函数之间仅仅有很小的不同的时候,如果我们仍然将大量相同的程序代码进行多次复制,那么就会造成空间的大大浪费,因此,在这里,我们会在构造函数中使用this()来调用一个共所有的构造函数共享的程序的构造函数,由它向上调取父类的构造函数
对象的生命周期
和引用相关
局部变量只能在声明它的方法在执行中才能被使用
只要有活着的引用,对象也就会活着
除非有对对象的引用,否则该对象一点意义都没有
当最后一个引用消失时,对象就会变成可回收的
三种方式释放对象的引用:
1.引用被赋值到其他的对象上,因为这样再也没有引用变量能够取得那个对象存储的地址
2.引用永久性离开他的范围(所在的方法结束)
3.直接将引用设定为null
数字与静态
1.在静态中没有this这个关键字
如何理解?
静态是随着类的加载而加载的,this是随着对象的创建而存在
静态比对象先存在
一个静态的方法代表说,一种不依靠实例变量也就不需要对象的行为
静态的方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量只能访问静态变量
成员方法只能访问静态方法
非静态方法:
成员变量:可以访问静态静态变量也可以访问成员变量
成员方法:都可以
可以用私有的构造函数来限制非抽象类被初始化
静态的final变量为常数
一个被标记的静态变量代表它一旦被初始化之后就不会改动
public static final double PI = 3.141592653589793
final
静态final变量的初始化
1.声明的时候
public static final int ddd=25;
2.在静态初始化过程中
public static final int ddd;
static{
ddd=25;
}
final不只是用在静态变量上,不管修饰哪一种,都代表它的值不能变动
因此可以使用final来防止方法的覆盖和创建子类
final变量代表你不能改变它的值
final方法代表你不能将它覆盖
final类代表你不能继承该类,也就是创建它的子类
autoboxing
ArrayList <Intteger> lll = new ArrayList<Integer>() ;
此处不能直接声明ArrayList<int>,generic类型规定只能指定类或接口类型,不过由于存在autobox,你可以直接将基本数据类型塞进去
可以让我们在各种地方交换使用primitive主数据类型和它的包装类型
Integer i =1;
int c = 12;
c=i;
System.out.println(c);
数字的格式化
将想要输出的数字转化为字符串的格式
格式化结构:
格式指令 描述要输出的特殊格式
要格式化的值 不是所有东西都能被格式化,只能格式化相同类型的
String s = String.format("%,d",1000000);
%代表一项变量,此变化就是跟在格式化指令后面的参数
格式化说明的格式
最多有五个部分
%[argument number][flags][width][.precision]type
其中只有%和type是必要的
超过一项以上的参数
String s = String.format("%,d %,d",1000000,23231);
这表示第一项参数取得是第一个%的格式,第二个是第二个百分号的格式