java final abstract_Java 中的 abstract、final、static 关键字

一、abstract

1、abstract 可以修饰类和方法(构造方法不行),分别叫做抽象类和抽象方法;

2、抽象类中可以没有抽象方法(一般无意义,抽象类中应该拥有抽象方法),而拥有抽象方法的类必须被声明为抽象类;

继承抽象类的子类也可以是抽象类,这样的抽象子类可以对基类中的抽象方法进行重写也可以不进行重写,一般不进行重写(除非要在抽象子类内部调用这个重写的方法,可通过这个抽象子类的非抽象子类的对象调用继承于抽象子类中重写的方法。有点绕啊,不过是个小技巧^_^)。抽象子类中也能再次声明父类的抽象方法,只是这样做没有任何意义,正常人不会这样做^_^);

定义的抽象类可以不被继承,若被继承且该抽象类中又有抽象方法,则继承该抽象类的非抽象子类必须重写父类的抽象方法。当然我们通常期望:抽象类中应该有抽象方法,抽象类应该被继承并且其中的抽象方法一定要被非抽象的子类重写!

3、抽象类不能被实例化。 抽象类的父类可以是非抽象类,但一般情况下,这样的继承关系不常用。

4、抽象方法只需声明,无需实现(即不用写大括号和大括号内的东西)。

二、final

1、final 可以修饰成员变量、局部变量、方法(构造方法不行)和类;

2、final 修饰的变量不能被更改!final 修饰的成员变量一定要初始化(注意:声明成员变量时不使用final是可以不初始化变量的,系统会给其相应类型的默认值;能够修饰局部变量的关键字只有 final,无论有无 final 修饰,声明某个局部变量时,可以不赋值,但使用此局部变量时则一定要先将其初始化);

3、final 修饰的方法可以被继承,但不能被子类重写;

4、final 修饰的类不能被继承。

三、static

1、static 可以修饰成员变量和方法(构造方法不行);

2、被 static 修饰的变量或者方法独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。

3、在类被加载的时候,就会去加载被 static 修饰的部分。被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以用类名去访问(当然您也可以用具体的对象去访问,但我们使用 static 是希望直接用类名去访问)。

4、static 修饰的方法可以被继承,但不能被子类重写;static 不能修饰子类中需要重写的方法(final可以修饰)。

5、父类若有 static 修饰的方法,子类也拥有 static 修饰的同样返回值和同名的方法时,子类的此方法将隐藏(hide)父类的静态方法。这两个方法不存在多态特性,具体调用哪个方法是根据引用的类型来确定,而不是以实际对象来确定, 这一点和子类中定义的非父类的成员变量和没有重写的新方法相像。

6、在同一个类里,静态的上下文中(静态方法内部)只能访问静态的属性(这里的“静态的属性”是指使用 static 修饰的属性),若要访问非静态的属性则需要 new 一个自身对象来访问;非静态上下文(非静态方法)既可以访问非静态的属性,也可以访问静态的属性。(注:不同类之间属性的访问,要么使用类名 . 属性来访问静态的属性,要么使用对象引用 . 属性来访问所有属性。当然,前句提到方法受到权限修饰符的限制,如 private 修饰的属性,不同的类是不能通过上述方法访问的)。

小贴士:从上可看出, abstract 不能与 static 或 final 一起修饰某个方法;

若在一个抽象父类中使用 abstract 声明了一个抽象方法,而继承的任何子类(包括抽象子类)都需要重写这个方法,则不能使用 static 来修饰重写的方法,但可以使用 final 来修饰子类需要重写的方法;

static 和 final 可以一起修饰某个不需要重写的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值