接口实现
接口是类能够做什么的合约,但它们没有指定类操作的实现方式!
接口能够被继承树中的任何类实现
接口就像一个百分百抽象类,无论是否对其在声明中使用了abstract修饰符,它隐含是抽象的
接口只能有抽象方法,不允许有具体方法
接口默认是公共的和抽象的,这些修饰符的显式声明是可选的
接口可以有常量,它们隐含是 public,static和final
public,static和final接口常量声明可以选择任意组合
合法的非抽象实现类具有以下属性:
它为来自接口的所有方法提供具体实现
对于它实现的方法,必须符合所有的合法重写规则
它一定不能为实现方法声明任何新的检查异常
它一定不能声明比接口方法中所声明异常更宽的检查异常
无论接口声明如何,它都可以在任何接口方法实现上声明运行时异常
它必须包含与它所实现方法完全相同的方法签名和返回类型(但不必声明该接口的异常)
实现接口的类自身可以是抽象的
抽象实现类不必实现接口方法(但是第一个具体子类必须实现)
类只能扩展一个类,但是它能实现多个接口
接口能够扩展一个或多个其他接口
接口不能扩展类,或实现一个类或接口
成员访问修饰符
方法和实例变量(非局部)称为“成员”
成员可以使用四个访问级别:public ,private,protected和默认
成员访问有两种形式:
类中的代码能够访问另一个类中的成员
子类能够继承其超类中的成员
如果不能访问类则不能访问其成员
要在确定成员可见性之前确定类可见性
公共成员能够被其他所有类访问,甚至是不同包中的类
如果超类成员是公共的,那么无论在哪个包中,子类都继承它
不用.运算符访问的成员必须在同一个类中
this.总是只想当前执行的对象
this.aMethod与只调用 aMothod完全相同
私有成员只能被同一个类中的代码访问
私有成员对子类是不可见的,因此不能继承私有成员
默认和保护成员的区别只是在子类被调用时;
默认成员只能被处于同一个包中的其它类访问
保护成员能够被同一包中的其他类访问,也能被任意包中的子类访问
保护=包+子孙
对于包外子类,只能通过继承访问保护成员;包外子类不能通过使用对超类实例的引用来访问保护成员;
实际上,子类从其他包继承的保护成员对其他类来说都是私有的
局部变量
局部变量声明不能有访问修饰符
final是唯一可用与局部变量的访问修饰符
局部变量没有默认值,因此在使用之前必须将其初始化
其他修饰符--成员
final方法在子类中不能重写
abstract方法用分号结束,而不是大括号
有三种方法识别非抽象方法
该方法没有标示为abstract
该方法有大括号
该方法在两个大括号之前有代码
扩展abstract的第一个非抽象类必须实现所有abstract类的abstract方法
synchronized修饰符只能用于方法和代码块
synchronized方法能够具有任何访问控制,包括final
抽象方法必须被子类实现,基于这种原因,所以:
abstract方法不能是私有的
abstract方法不能是final
native修饰符只能应用与方法
strictfp修饰符只能应用与类和方法
具有var-arg的方法
从JAVA5开始,方法可以声明一个接受零个或多个的形数,即所谓的var-arg方法
var-arg是用语法type...name声明的,例如doStuff(int...x){}
var-arg方法只能带一个var-arg形参
在带有正常形参和一个var-arg形参的方法中,var-arg形参必须出现在最后面
变量声明
实例变量能够--
具有任何访问控制
被标示为final或transient
实例变量不能被标示为abstract,synchronized,native和strictfp
用与实例变量系那个痛的名称声明局部变量是合法的,这被称作“隐藏”
最终变量具有以下属性:
一旦赋值之后,最终变量不能被重新初始化
一旦将对象赋予最终变量,则最终引用变量不能再引用不同的变量
在构造函数完成前,最终变量必须完成初始化
根本没有final对象这种说法,标示为final的引用不是指该对象自身是不可变的
transient修饰符只能用于实例变量
volatile修饰符只能用与实例变量!