一、static
static 关键字表示静态,可以修饰成员变量、方法和代码块。
1、static 修饰成员变量
● 该成员变量则成为了类变量,它
不属于任何对象,是属于类本身的变量
。
● 使用 类名. 的方式调用,虽然使用 对象名. 的方式也可以调用,不过这种调用不建议使用,因为静态变量与对象没有什么直接关系。
●该变量在类加载的时候(即将 Java 文件存入 jvm 的时候)就初始化,生命周期与类相同
。
●static 成员变量和类的信息一起存储在方法区,而不是在堆中,一个类的static成员变量只有一份,无论该类创建了多少个对象
。
2、static 修饰方法
● static修饰的成员方法变成了类方法,可以直接通过类名调用。由于 static 在调用时没有具体的对象,因此在 static 方法中不能对非 static 成员(对象成员)进行访问
● 这种方法称为静态方法,静态方法也是在类加载的时候初始化
。静态方法中,不能使用涉及对象的内容:对象的非静态属性(成员变量),对象的非静态方法(成员方法),以及 this 和super关键字
。
●在类与类之间,静态方法可以被继承,但是不能被重写,不存在多态
。如果父类中有一个静态的方法,子类也有一个与其方法名、参数类型、参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写
。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法不在存在多态的性质。因此通过父类调用的静态方法是父类中定义的方法,通过子类调用的静态方法是子类中定义的方法
。
● 在 jdk1.8 以后,接口中可以定义默认方法和静态方法,但是接口之间继承时,静态方法不可以继承
。
● 使用 static 修饰的类有以下特点:随着类的加载而加载、优先于对象存在、被所有对象所共享、可以直接被类名调用。
3、static 修饰代码块
● 此时该代码块称为静态代码块,属于类本身,该代码块也是
在类加载的期间执行一次,也就是说,如果加载过这个代码块,就不会再加载了。可以为未初始化的静态常量赋值
。
二、final
final关键字表示最终的、不可改变,可以修饰变量、方法和类。
1、final 修饰变量
●
final 修饰变量,表示该变量会变成常量,不能够被修改,没有默认值,一般常量名都使用大写
。
● 当 final 修饰成员变量时,如果是非静态变量那么必须在声明的时候赋值
或者在构造方法中为其赋值;如果是静态变量那么必须在声明的时候赋值或者是在静态代码块中赋值。
2、static final 常量
●
static final 修饰的成员变量成为常量,必须声明同时初始化,不可被改变
。
2、final 修饰方法
● 被 final 修饰的方法,
只能被继承但不能被重写
。
3、final 修饰类
● 被 final 修饰的类
不能够被继承
。
三、abstract
abstract关键字表示抽象的,可以修饰方法和类。
1、抽象方法和抽象类
● 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个分号结尾(一个普通方法中{}表示方法体,抽象方法中不能有{});
●一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类
;
●如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)
;
●抽象类不可以实例化
。即使一个类中没有抽象方法,也可以将其定义为抽象类
,同样,该类不可以实例化。但是有抽象方法的类必须是抽象类;
●abstract 和 final 关键字不可以同时用于修饰一个类,因为 final 关键字使得类不可继承,而 abstract 修饰的类如果不可以继承将没有任何意义
。
注意:
① 有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法
。abstract修饰符在修饰类时必须放在类名前。
② final 和 abstract,private 和 abstract,static 和 abstract,这些是不能放在一起的修饰符
,因为abstract修饰的方法是必须在其子类中重写,才能以多态方式调用,以上修饰符在修饰方法时期子类都不能重写这个方法,final是不可以重写,private是不能够继承到子类,所以也就不能重写,static是不可以重写,所以上的修饰符不能放在一起
。
2、 抽象类的意义
● 为其子类提供一个公共的类型;
● 封装子类中的重复内容(成员变量和方法);
● 定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
四、super 与 this
在 Java 类中使用 super 来引用父类的成分,用 this 来引用当前对象。
如果一个类从另外一个类继承,我们 new 这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。可以使用 super 来引用引用里面的父类对象,this 引用当前对象,super 是当前对象里面的父对象的引用
。
super 和 this都可以使用在实例方法中,并且都不能使用在静态方法当中
,“this”大部分情况下都是可以省略的,只有在方法中区分局部变量和实例变量的时候不能省略。
1、关键字 super
super 代表父类的引用,用于访问父类的属性、方法、构造。
● 调用父类的方法。
● 调用父类的构造方法。
① super 能出现在实例方法和构造方法中,不能使用在静态方法中,且大部分情况下可以省略。
② super() 只能出现在构造方法第一行,通过当前的构造方法去调用"父类"中其它的构造方法
,目的是代码复用(创建子类对象的时候,先初始化父类型特征)。
③ 当一个构造方法第一行既没有 this() 又没有 super() 的话,默认会有一个 super();表示通过当前子类的构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的
。
④ this() 和 super() 不能共存,它们都是只能出现在构造方法第一行
。
子类构造函数中的 super()
继承结构中,子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)父类的构造器。调用父类的构造方法要在子类的构造器中使用super()。
在创建子类实例时,必须先创建父类对象。
正常情况下,子类会默认自动调用父类的无参构造函数
(不管是自己手动写的的还是系统自动新建的),但是如果父类没有无参构造器,子类必须要使用 super 显式地调用父类的带参构造器,而且必须是在子类构造器中做的第一件事(第一行代码)
。
2、this 关键字
this代表当前对象的一个引用。所谓当前对象,指的是调用类中方法或属性的那个对象。
● this调用本类中的属性,也就是类中的成员变量;
● this调用本类中的其他方法;
●this调用本类中的其他构造方法,调用时要放在构造方法的首行
。
① 可以使用 this 关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句
。
② this 不能用于静态方法。main 方法也是静态的,所以 this 也不能用于 main 方法。