基本数据类型:
变量的生命周期
1.静态变量和实例变量的生命周期:
类的成员变量有两种:一种是被 static 关键字修饰的变量,叫做=类变量或静态变量,另一种是没有被static关键字修饰的变量,叫做实例变量。
静态变量和实例变量的区别在于:
-
类的静态变量在内存中只有一个,Java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名被访问。静态变量的生命周期取决于类的生命周期,当加载类的时候,静态变量被创建并分配内存,当类卸载的时候,静态变量被销回并撤销所占内存。
-
类的没个实例都有相应的实例变量。没创建一个实例,Java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中。实例变量的声明周期取决于实例的生命周期,当创建实例的时候,实例变量被创建并分配内存,当销实例的时候,实例变量被销毁并撤销所占内存。
用new关键字创建对象:
为对象分配内存空间,将对象的实例变量自动化初始化为其变量类型的的默认值。
如果实例变量在声明时被显示的初始化,那就把初始化值赋给实例变量。
调用构造方法。
返回对象的引用。
对象的默认引用 this:
当一个对象创建好后,Java虚拟机就会给它分配一个引用自身的指针:this。所有对象默认的引用名都叫this.
在程序中,在以下情况下回使用关键字:
-
在类的构造方法中,通过this语句调用这个类的另一个构造方法。
-
在一个实例方法内,局部变量和实例变量名相同,实例变量被屏蔽,因此使用this.实例变量的方式来区分。
-
在一个实例方法内,访问当前实例的引。
-
需要主意的是:
只能在构造方法或实例方法内使用this关键字,而在静态方法和静态代码块内不能使用this关键字。
为什么在静态方法和静态代码块中不能使用this关键字?
成员方法分为静态方法和实例方法。用static 修饰的方法叫静态方法,或类方法。静态方法和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。
因为静态方法不惜以不需要要通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用this关键字,也不能直接访问所属类的实例变量和实例方法,但可直接访问所属类的静态变量和静态方法。
因为Java虚拟机在执行静态方法时,能顺利的在方法去内找到,而对于实例,java虚拟机无法判断其所属哪个实例对象,java虚拟机只会砸在包含类信息的方法区内寻找,而不会到存放类所有实例对象的放堆区去寻找。
所以在静态方法中不能直接访问所属类的实例变量或者实例方法,因为java虚拟机无法定位到它们。
abstract 修饰符:
用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。
y用abstrac 修饰的方法表示抽象方法,抽象方法没有方法体,抽象方法用来描述系统具有什么功能,但不提供具体的实现。
使用abstract修饰符需要遵循的语法规则:
- 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类的所有抽象方法,那么子类也必须定义为抽象类。否则编译出错。
- 抽象类及抽象方法不能被final修饰符修饰。abstract修饰符和final修饰符不能连用。因为抽象类只允许创建其子类,它的抽象方法才能被实现,并且只有它的子类才能被实例化,而用final修饰的类不允许拥有子类,用final修饰的方法不能被子类覆盖,因此abstrac 和final修饰符连用,会导致自相矛盾。
final 修饰符:
- 用final修饰的类不能被继承,没有子类。
- 用final修饰的方法不能被子类的方法覆盖。
- 用fianl修饰的变量表示常量,只能被赋一次值。
- final不能用来修饰构造方法,因为 方法覆盖,这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法不存在覆盖关系,因此使用final修饰的构造方法是无意义的。
父类中用 private 修饰的方法不能被子类的方法覆盖。因此private 类型的方法默认是 final 类型的。
final变量特征:
- fianl可以修饰静态变量,实例变量和局部变量,分别表示静态常量和实例常量和局部常量。
- 被final修饰的成员变量都必须显示的初始化,否则会导致编译错误。
- 对于 final 类型的实例变量,可以在定义变量时,或者再构造方法中进行初始化。
- 对于final修饰的静态变量,可以在定义时进行初始化,或者在静态代码块中初始化。
- final变量只能赋一次值。否则会出现编译错误。
- 如果将引用类型的变量用 final修饰,那么该变量只能使用引用一个对象,但是可以修改对象的内容。
static 修饰符:
- static 修饰符可以用来修饰类的成员变量、成员方法、和代码块。
- 用 static 修饰的成员变量表示静态变量,可以直接通过类的名称来访问。
- 用 static 修饰的方法表示静态方法,可以直接通过类名来访问。
- 用 static 修饰的程序代码块表示静态代码块,当java 虚拟机加载类时,就会执行该代码块。
被static 所修饰的成员变量和成员方法表示归属某个类所有,它不依赖于类的特定实例,被所有的实例共享。只要这个类被加载,java虚拟机就能根据类名在运行时数据区的方法区定位到它们。
静态变量和实例变量的区别:
- 静态变量在内存中只有一个拷贝,运行时java虚拟机只为静态变量分配内存,在类加载的过程中完成静态变量的内存分配。可以直接通过类名访问静态变量。
- 对于实例变量,没创建一个实例,就会为实例变量分分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
static变量的作用:
- 能被类所有实例共享,可以作为实例之间进行交流的共享数据.
- 如果类的所有实例都包含一个相同的常量属性,可以把这个属性定义为静态常量类型,从而节省内存空间。
静态方法:
静态方法必须被实现:
静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既如此,当前类,必须为静态方法提供是实现。换句话说,一个静态方法不能被定义为抽象方法。
作为程序入口的main(String[] args)为什么是静态方法?
因为把mian方法定义为静态方法,可以使得java虚拟机只要加载类main方法所属的类,就能执行main()方法,而无需先创建这个类的实例。
static代码块
类中可以包含静态代码块,它不存在于任何方法体中。在java虚拟机加载类时会执行这些静态代码块。如果类中包含多个静态块,那么java虚拟机将按照它们在类中出现的顺序依次执行。
方法的字节码都位于方法区:
不管实例方法还是静态方法,它们的字节码都位于方法区内。
网友评论