这两天在家清理了下书架,发现原来一本学习java的书已经落满了灰尘,不有自主的擦干净翻开看了看,里面的知识熟悉又陌生,所有的知识自己都知道,但是很难讲的很透彻,因此决定这段时间将java中相关的知识写成博客,以便自己在遗忘的时候可以随时温习下。
java中的关键字有很多,大约50多个,在这我不会一一去阐述,知识捡几个比较常用且重要的关键字进行说明。
一 this
在Java程序设计中经常会见到this的使用,this使得程序设计变得规范、简单、灵活,而且代码的可读性比较强。
public class Book {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
name = name;
}
}
public class Test {
public static void main(String[] args) {
Book book = new Book();
book.setName("java基础");
System.out.println(book.getName());
}
}
打印的结果:null
由运行结果可以看出,通过name=name并没有正确的将内容赋给属性,为什么呢?因为此时操作的name实际上是方法中的,跟类中的属性完全不沾边。
另外,这个程序代码中,有一个成员变量name,同时在方法中有个形式参数,参数名也是name。然后在方法中将形式参数name的值传递给成员变量name。虽然我们可以看明白这个代码的含义,但是作为Java编译器它是怎么判断使用哪个变量的呢?到底是将形式参数name的值传递给成员变量name,还是反过来讲成员变量name的值传递给形式参数name呢?
此时的解决方法有两种:
1 public void setName(String c_name) {name = c_name;} 将setName方法中的变量那么改为c_name,就是讲局部变量改的和成员变量不同,那样java虚拟机能够进行区分,但是这样做就使代码的可读性变弱了,明明都是名字属性,为什么还要不一样呢?
2 引出this关键字 public void setName(String name) {this.name = name;}his这个关键字代表的就是类中的成员变量,又叫做类的属性。所以此时,为了明确的表示出哪一个是类中的属性,就要加上“this.属性名称”的操作,为什么呢?如果成员变量和方法中的局部变 量的名字相同时,那么在方法中成员变量将会被屏蔽。如果这个时候还要使用成员变量,就需要使用关键字this。
其实this关键字还能引用成员方法,由于我们在平时写代码的时候在一个方法中调用另外一个方法已经默认去掉了this,所以关于this引用成员方法就不在细细讲解了。
二 super
super关键字的应用主要出现在java的继承上的,super的意思就是在子类中可以调用父类的成员变量和方法。
class Parent
{
int size=10;
void printsize()
{
System.out.println(size);
}
}
class Child extends Parent
{
int size=20;
void printsize()
{
System.out.println(size);
System.out.println(super.size);
super.printsize();
}
}
打印的结果:20,10,10
当然super可以调用当前对象的父类对象的构造函数注意: 子类调用父类的构造方法时,super语句必须是子类构造方法的第一句,这个简单常用不再讲解。
三 static
为什么要引出关键字static? 方便在没有创建对象的情况下来进行调用(方法/变量)。 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。 static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
1)static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。 但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
简单的代码片段正是对以上文字的强有力的证明。
2)static变量 static变量也称作静态变量,静态变量和非静态变量的区别是: 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。 非静态变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
3)static代码块 static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。下面看个网上找到的一个形象的例子:
class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
isBornBoomer是用来这个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好。
一个关键字的引出总归是有它的作用,就看我们能不能的灵活去应用,这里的静态代码块完美的解决了对象的重复创建导致的空间浪费问题。
今天的文章就先到这,下次会讲解final,finally,finalize()的用法。