您的位置:首页 > 职场人生

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: