7--黑马程序员--技术总结之几个重要的关键字
2015-05-08 21:44
417 查看
----------------------ASP.Net+Unity开发、.Net培训、期待与您交流!
----------------------
一.static关键字
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。
1、static变量(静态变量)和实例变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的,会浪费内存)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
1)在对象之间共享值时,即当类中的成员需要被所有对象共享时,用static修饰
2)方便访问变量时
代码示例:
[html] view
plaincopy
public class StaticDemo1 {
/**分别通过类和对象来读取静态变量
* @黑马ZWF
*/
public static void main(String[] args) {
梯形 t = new 梯形(3.0f, 10.0f, 20);
梯形.下底 = 200; //通过类操作静态变量
System.out.println("梯形的下底为" + t.获取下底() );
t.修改下底(100); //通过对象操作静态变量
System.out.println("梯形的下底为" + t.获取下底() );
}
}
class 梯形 {
float 上底, 高;
static float 下底;
梯形(float x, float y, float h) {
上底 = x;
下底 = y;
高 = h;
}
float 获取下底 () {
return 下底;
}
static void 修改下底(float b) {
下底 = b;
}
}
2.静态方法
类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。当一个类创建了一个对象后,这个对象就可以调用该类的方法。那么实例方法和类方法有什么区别呢?
当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。实例方法必须通过对象来调用,当某个对象调用实例方法时,该实例方法中出现的成员变量被认为是分配给该对象的成员变量,其中的类变量和其他对象共享,所以,实例方法既可以操作实例变量也可以操作类变量。
对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。所以Java规定:类方法中出现的成员变量必须是被所有对象共享的变量(类变量),即类方法不可以操作实例变量,这样规定的原因是:在类创建对象之前,实例成员变量还没有分配内存。类方法也不可以调用其他的实例方法,这是因为在类创建对象之前,实例方法也没有入口地址。
无论是类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的肉存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么,方法的局部变量会再次被分配新的内存空间,比如,方法在递归调用时,方法中的局部变量会再次被分配新的内存空间。在下面的代码示例中,我将通过递归调用类中的方法,计算出Fibinacii序列的第8项(Fibinacii序列的前两项是1,后续每项的值都是该项的前两项之和)
[html] view
plaincopy
public class StaticDemo2 {
/**通过递归调用类中的方法,计算出Fibinacii序列的第8项
* @黑马ZWF
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Fibinacii的第八项是" + Fibinacii.fibinacii(8)); //输出结果是21
}
}
class Fibinacii {
public static int fibinacii(int n) {
if (n == 1||n ==2) //Fibinacii的前两项都是1
return 1;
else
return fibinacii(n - 1) + fibinacii(n - 2); //通过自身的递归调用fibinacii方法得出结果
}
}
二.this关键字
this是Java的一个关键字,表示某个对象o this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。实例方法必须通过对象来调用,当this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。
实例方法可以操作类的成员变量,当实例成员变量在实例方法中出现时,默认的格式为:
this.成员变量
当static成员变量在实例方法中出现时,默认的格式为:
类名.成员变量
如:
[html] view
plaincopy
public class ThisDemo {
int x;
static int y; //定义静态变量y
void f () {
this.x=100; //this.成员变量
ThisDemo.y=200; //类名.成员变量
}
}
在上述A类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,this.x就表示当前对象的变量x,当对象调用方法f时,将100赋给该对象的变量x。因此,当一个对象调用方法时,方法中的实例成员变量就是指分配给该对象的实例成员变量,而static变量和其他对象共享。因此,通常情况下,可以省略实例成员变量名字前面的“this.”以及static变量前面的“类名.”。如:
[html] view
plaincopy
public class ThisDemo {
int x;
static int y; //定义静态变量y
void f () {
x=100; //省略this关键字
y=200; //省略类名
}
}
类的实例方法可以调用类的其他方法,对于实例方法调用的默认格式为:
this.方法;
对于类方法调用的默认格式为:
类名.方法;
如:
[html] view
plaincopy
public class ThisDemo2 {
void f () {
this.g(); //this.方法名
ThisDemo2.h(); //类名.方法名
}
void g(){
System.out.println("ok") ;
}
static void h() {
System.out.println("hello") ;
}
}
在上述B类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,方法f的方法体中this.g()就是当前对象调用方法g,也就是说,当某个对象调用方法f过程中,又调用了方法go由于这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:
[html] view
plaincopy
public class ThisDemo2 {
void f () {
g(); //省略this
h(); //省略类名
}
void g(){
System.out.println("ok") ;
}
static void h() {
System.out.println("hello") ;
}
}
注:this关键字不能出现在类方法中,这是因为,类方法可以通过类名直接调用。
三.final关键字
final关键字可以修饰类、成员变量和方法巾的参数。
final类不能被继承,即不能有子类。如:
final class A{
···
)
A就是一个final类。有时候是出于安全性的考虑,将一些类修饰为final类。例如:Java提供的String类,它对于编译器和解释器的正常运行有很重要的作用,对它不能轻易改变,
因此它被修饰为final类。
如果一个方法被修饰为final方法,则这个方法不能被重写。
如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。
如果方法的参数被修饰为final的,该参数的值不能被改变。
在下面的代码示例中,A类中szetArea方法的参数r使用final修饰。这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:
[html] view
plaincopy
public class FinalDemo {
public static void main(String[] args) {
A a = new A();
System.out.println("半径为100的圆面积为:" + a.getArea(100));
}
}
class A {
//final double PI, //非法,因为没有给初值
final double PI=3.1415926;// PI是常量且给定初值
public double getArea(final double r) {
//r=89; 非法,因为r已经被final修饰,不允许再改变r的值
return PI *r * r;
}
}
----------------------
一.static关键字
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。
1、static变量(静态变量)和实例变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的,会浪费内存)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
1)在对象之间共享值时,即当类中的成员需要被所有对象共享时,用static修饰
2)方便访问变量时
代码示例:
[html] view
plaincopy
public class StaticDemo1 {
/**分别通过类和对象来读取静态变量
* @黑马ZWF
*/
public static void main(String[] args) {
梯形 t = new 梯形(3.0f, 10.0f, 20);
梯形.下底 = 200; //通过类操作静态变量
System.out.println("梯形的下底为" + t.获取下底() );
t.修改下底(100); //通过对象操作静态变量
System.out.println("梯形的下底为" + t.获取下底() );
}
}
class 梯形 {
float 上底, 高;
static float 下底;
梯形(float x, float y, float h) {
上底 = x;
下底 = y;
高 = h;
}
float 获取下底 () {
return 下底;
}
static void 修改下底(float b) {
下底 = b;
}
}
2.静态方法
类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。当一个类创建了一个对象后,这个对象就可以调用该类的方法。那么实例方法和类方法有什么区别呢?
当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。实例方法必须通过对象来调用,当某个对象调用实例方法时,该实例方法中出现的成员变量被认为是分配给该对象的成员变量,其中的类变量和其他对象共享,所以,实例方法既可以操作实例变量也可以操作类变量。
对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。所以Java规定:类方法中出现的成员变量必须是被所有对象共享的变量(类变量),即类方法不可以操作实例变量,这样规定的原因是:在类创建对象之前,实例成员变量还没有分配内存。类方法也不可以调用其他的实例方法,这是因为在类创建对象之前,实例方法也没有入口地址。
无论是类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的肉存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么,方法的局部变量会再次被分配新的内存空间,比如,方法在递归调用时,方法中的局部变量会再次被分配新的内存空间。在下面的代码示例中,我将通过递归调用类中的方法,计算出Fibinacii序列的第8项(Fibinacii序列的前两项是1,后续每项的值都是该项的前两项之和)
[html] view
plaincopy
public class StaticDemo2 {
/**通过递归调用类中的方法,计算出Fibinacii序列的第8项
* @黑马ZWF
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Fibinacii的第八项是" + Fibinacii.fibinacii(8)); //输出结果是21
}
}
class Fibinacii {
public static int fibinacii(int n) {
if (n == 1||n ==2) //Fibinacii的前两项都是1
return 1;
else
return fibinacii(n - 1) + fibinacii(n - 2); //通过自身的递归调用fibinacii方法得出结果
}
}
二.this关键字
this是Java的一个关键字,表示某个对象o this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。实例方法必须通过对象来调用,当this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。
实例方法可以操作类的成员变量,当实例成员变量在实例方法中出现时,默认的格式为:
this.成员变量
当static成员变量在实例方法中出现时,默认的格式为:
类名.成员变量
如:
[html] view
plaincopy
public class ThisDemo {
int x;
static int y; //定义静态变量y
void f () {
this.x=100; //this.成员变量
ThisDemo.y=200; //类名.成员变量
}
}
在上述A类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,this.x就表示当前对象的变量x,当对象调用方法f时,将100赋给该对象的变量x。因此,当一个对象调用方法时,方法中的实例成员变量就是指分配给该对象的实例成员变量,而static变量和其他对象共享。因此,通常情况下,可以省略实例成员变量名字前面的“this.”以及static变量前面的“类名.”。如:
[html] view
plaincopy
public class ThisDemo {
int x;
static int y; //定义静态变量y
void f () {
x=100; //省略this关键字
y=200; //省略类名
}
}
类的实例方法可以调用类的其他方法,对于实例方法调用的默认格式为:
this.方法;
对于类方法调用的默认格式为:
类名.方法;
如:
[html] view
plaincopy
public class ThisDemo2 {
void f () {
this.g(); //this.方法名
ThisDemo2.h(); //类名.方法名
}
void g(){
System.out.println("ok") ;
}
static void h() {
System.out.println("hello") ;
}
}
在上述B类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,方法f的方法体中this.g()就是当前对象调用方法g,也就是说,当某个对象调用方法f过程中,又调用了方法go由于这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:
[html] view
plaincopy
public class ThisDemo2 {
void f () {
g(); //省略this
h(); //省略类名
}
void g(){
System.out.println("ok") ;
}
static void h() {
System.out.println("hello") ;
}
}
注:this关键字不能出现在类方法中,这是因为,类方法可以通过类名直接调用。
三.final关键字
final关键字可以修饰类、成员变量和方法巾的参数。
final类不能被继承,即不能有子类。如:
final class A{
···
)
A就是一个final类。有时候是出于安全性的考虑,将一些类修饰为final类。例如:Java提供的String类,它对于编译器和解释器的正常运行有很重要的作用,对它不能轻易改变,
因此它被修饰为final类。
如果一个方法被修饰为final方法,则这个方法不能被重写。
如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。
如果方法的参数被修饰为final的,该参数的值不能被改变。
在下面的代码示例中,A类中szetArea方法的参数r使用final修饰。这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:
[html] view
plaincopy
public class FinalDemo {
public static void main(String[] args) {
A a = new A();
System.out.println("半径为100的圆面积为:" + a.getArea(100));
}
}
class A {
//final double PI, //非法,因为没有给初值
final double PI=3.1415926;// PI是常量且给定初值
public double getArea(final double r) {
//r=89; 非法,因为r已经被final修饰,不允许再改变r的值
return PI *r * r;
}
}
相关文章推荐
- 黑马程序员_C语言几个不常用的关键字总结
- C++中几个重要的关键字总结
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- 黑马程序员-static关键字的小总结
- 国航OA项目技术总结(二)关于JVM虚拟机中对象的创建,手机端提速的重要优化
- 在C编程中使用到的几个重要关键字之一const
- 工作的几个技术小点总结
- Objective C运行时(runtime)技术的几个要点总结
- 黑马程序员 构造函数 this satatic final关键字总结
- 最近工作最重要的Java技术总结
- 黑马程序员—java技术blog—第六篇:IO流的总结
- 黑马程序员—java技术blog—第四篇:List和Set的总结
- 2016.10.13一些重要关键字的总结
- 关于V4L2中操作比较重要的几个命令以及一般操作流程总结
- 摄像机的几个重要的技术指标
- 【Linux技术】几个重要的linux内核文件
- 在C编程中使用到的几个重要关键字之一volatile
- 黑马程序员技术博客之集合框架总结
- 黑马程序员—java技术blog—第一篇 IO概述及字节流总结
- jsp小总结----java ee的开发中有几个重要的开发模式等