`

Java中的关键字与保留字

阅读更多

关键字(45个)

Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。

包引入和包声明:import package
用于类的接口声明:class extends implements interface
修饰符:abstract final native private protected public static synchronized transient volatile
数据类型:boolean byte char short int long float double
流程控制:break case continue default for do while if else return switch
创建对象:new
引用:this super
方法返回类型:void
异常处理:catch finally throw throws try
操作符:instanceof
某些数据类型的可先值(非关键字):false true null

保留字(14个)

保留字是为java预留的关键字,他们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。

byValue cast false future generic inner operator outer rest true var goto const null

abstract class与interface

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。
比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class AbstractClass {
  public int t; // 普通数据成员
  public abstract void method1(); // 抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
  public void method2() {// 非抽象方法
    // 抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
  }
}
public interface Interface{
  static final int I = 0; //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改
              //可以不用static final 修饰,会隐式的声明为static和final
  public void method1();  //接口中的方法一定是抽象方法,所以不用abstract修饰
              //接口中不能赋予方法的默认行为,即不能有方法的具体实现
}

共同点:

  • 抽象类和接口中的抽象方法都不能有具体实现,而必须由他们的子类实现所有的抽象方法(必须实现,哪怕方法体是空的)。
  • 都不能被实例化。

不同点:

  • 继承上,子类只可以继承一个抽象类,却可以实现多个接口。所以抽象类作为类型定义工具的效能大打折扣。在这一点上,接口的优势就出来了,任何一个实现了一个接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个接口,从而这个类就有了多种类型。
  • 成员方法上,抽象类可以提供方法的实现,供子类继承,而接口不可以。这是抽象类的优点,抽象类添加的实现方法,所有子类都可以得到,而在接口中添加抽象方法,还需要在所有子类中都去一一实现这些方法。
  • 数据成员上,抽象类中可以有自己的数据成员,而在接口中只能够有静态的不能被修改的数据成员。不过在接口中一般不定义数据成员。
  • 设计理念上,抽象类像是提取一些具体子类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

final

在Java环境中,final关键字具有“无法改变”含义。可以用来修饰非抽象类、非抽象成员方法和变量。可能出于两种理解而阻止改变:设计和效率。

  • final类。final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。 
  • final方法。定义为final的方法无法被子类覆盖,子类只能继承,无法修改。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
  • final变量。用final修饰的成员变量是常量,值一旦给定就无法修改。
  • final参数。final修饰的参数,可以读取使用,但无法修改参数值。

static

static是“静态的”的意思,修饰成员变量、成员方法、形成静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

静态变量与实例变量

  • 静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(不推荐)。静态变量不属于某个实例对象,而是属于类,所以叫类变量。
  • 实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。实例变量属于某个对象的属性,必须创建了对象,才能使用实例变量。

静态方法

  • 静态方法可以通过类来调用,也可以通过实例访问。
  • 静态方法中不能用this和super关键字。
  • 静态方法中不能直接访问类中的实例变量和实例方法,只能访问所属类的静态变量和静态方法,因为实例成员与特定的对象关联。
  • 因为static独立于任何实例,所以静态方法必须被实现,而不能是抽象方法。

静态代码块

静态代码块是独立于类成员的语句块,可以有多个,可以在任意位置,不在任何方法体内。当JVM加载类时会按照位置先后顺序执行这些static代码块,每个代码块只执行一次。利用静态代码块可以对一些static变量进行赋初值。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics