SCJP认证 1.7小结(声明访问控制)

    技术2022-05-20  33

    标识符(考试目标1.3)

    标识符可以用字母、下划线或货币符号开头。在第一个字符之后,标识符还可以包含数字。标识符可为任意长度。必须使用骆驼命名法规则命名JavaBean方法,并且根据方法的目的,必须以set、get、is、add或remove开头

     

    声明规则(考试目标1.1)

    一个源代码文件只能有一个公共类。如果源文件包含公共类,则该文件名称应该与公共类名称相同。一个文件只能有一条package语句,但可以有多条import语句。package语句(如果有的话) 必须位于package语句之后、类声明语句之前。如果没有package语句,则import语句必须是源文件的第一条语句(注释语句除外) 。如果没有package语句和import语句应用于该文件中的所有类。一个文件可以具有多个非公共类。没有公共类的文件没有任何命名规则。

     

     

    类访问修饰符(考试目标1.2)

    有3个访问修饰符:public、protected和private。有4个访问级别:public、protected、默认和private。类只能有public或默认访问级别。具有默认访问级别的类对于所有包中的所有类都是可见的。具有public访问级别的类队友所有包中的所有类都是可见的。类的可见性设计到类中代码是否能够: 创建另一个类的实例。扩展(或子类化) 另一个类访问另一个类的方法或变量。

     

     

    类修饰符(非访问)(考试目标1.2)

     类也能够被修饰成final、abstract或strictfp。 类不能同时被修饰成final和abstract。 最终类本鞥被子类化。  抽象类不能被实例化。 类中的单个抽象方法意味着整个类整个必须是抽象的。 抽象类可以有抽象方法和非抽象方法。 扩展类的第一个具体类必须是实现所有的抽象方法。 

     

    接口实现(考试目标1.2)

     接口是类能够做什么的契约,但是它们没有指定类操作的实现方式。 接口都能被来自任何继承树的任何类实现。 接口就像一个100%抽象类,无论是否在其声明中键入abstract修饰符,他都能隐含是抽象的。 接口只能有抽象方法,不允许有具体方法。 接口方法默认是公共的和抽象的,这些修饰符的现实是可选的。 接口可以有常量,它们隐含总是公共的、静态的和最终的。 公共的、静态的和最终的接口常量声明可以选择任意组合。 合法的非抽象实现类具有如下属性:   它为接口的所有提供具体实现。  对于他实现的的方法,必须遵守所有的合法重写规则。  它一定不能为实现的方法声明任何新的检验异常。  它一定不能声明比该接口方法中的声明的异常更广泛的任何检验异常。  无论接口声明如何,它都可以在任何接口方法实现上(捕捉异常)声明运行时异常。  它必须包含于它所实现方法完全相同的方法签名和返回类型(但不必该接口的异常)   实现接口的类本身可以是抽象的。 抽象实现类不必实现接口方法(但是第一个具体子类必须实现)  类只能扩展一个类(没有多重基础那个) ,但它能够实现多个接口。 接口可以扩展一个或多个其他接口。 接口不能扩展类,或者实现类和接口。 当参加考试时,请在验证其他代码逻辑之前检查接口和类声明的合法性。 

    成员访问修饰符(考试目标1.3和1.4)

    方法和实例(非局部的) 变量称为成员。成员可以使用所有4个访问级别:public、protected、默认和private。成员访问有两种形式:  1. 一个类中的代码能够访问另一个类的成员。 2. 子类能够继承其超类的成员。 如果不能访问类,则不能访问其成员。要在确定成员可见性之前类可见性。公共成员能够被其他所有类访问,甚至是不同包中的类。成员能够被其他所有类访问,甚至不同包中的类。如果超类成员是公共的,则无论在哪个包中,子类都会继承这个属性。不用点运算符(.) 访问的成员必须属于同一个类。this总是引用当前执行的对象。this.总是引用当前执行对象。this.aMethod()与只调用aMethod()完全相同。私有成员只能被同一个类中代码访问。私有成员对子类是不可见的,因此,不能继承私有成员。默认成员和保护成员的区别只是在子类被调用时: 1. 默认成员只能被同一个包中的类访问2. 保护成员能够被同一个包中的其他类访问,也可以被任意包中的子类访问。3. 保护 = 包 + 子孙(子孙指子类) 。4. 对于包外子类,只能通过继承访问保护成员,不能通过使用超类示例的引用来访问保护成员(换句话说,继承是保外子类访问其超类保护成员的唯一机制)。5. 对位于子类包中的任何其他类来说,该子类其他包中继承的保护成员都是不可访问的,但子类自己的子类除外。

     

     

    局部变量(考试目标1.3)

     局部(方法、自动或栈)变量声明不能有访问修饰符 final是唯一可用于局部变量的修饰符 局部变量没有默认值,因此,在使用前必须加以初始化 

     

    其他修饰符(考试目标1.3)

     final方法在子类中不能被重写 用签名、返回类型以及可选的throws自居声明abstract方法,但是没有实现这些方法。 abstract方法以分号而不是波形括号结尾。 有3中方法识别非抽象方法:   1. 该方法为标识为abstract  2. 该方法有波形括号  3. 该方法在两个波形括号之间有代码。 扩展abstract类的第一个非抽象(具体)类必须实现所有抽象类抽象方法:  synchronized修饰符只能应用于方法和代码块 sunchronized方法能够具有任何访问控制,也能标识为final。 抽象方法必须被子类实现,因此,它们必须是可继承的。原因如下:   1. abstract方法不能是私有的。  2. abstract方法不能是最终的。  native修饰符只能应用于方法。 strictfp修饰符只能应用于类和方法 。

     

    具有var-arg的方法(考试目标1.4)

     从Java5起,方法可以声明一个接受零个或多个变元参数,即所谓的var-arg方法。 var-arg参数是用语法type...name声明的,例如:doStuff(int... x){} var-arg方法只能带有一个var-arg参数。 在带有常规参数和一个var-arg参数。  实例边不能标识为abstract、synchronized、native或strictfp。  声明与实例变量同名的巨变量是合法的,这成为“隐藏”。   final变量具有如下属性:     一旦赋值之后,final变量就不能重新初始化。    一旦将对象赋予final变量,则final引用变量不能引用不同的对象。    在构造函数完成之前,final引用变量必须初始化。   根本没有“最终对象” 这种说法。标识为final的对象引用并不是意味着该对象本身是不可变的。  transient修饰符只能应用于实例变量。  volatile修饰符只能应用于实例变量。

     

     

    变量声明(考试目标1.3)

     实例变量能够: 具有任何访问控制被标识为final或transient 实例变量本鞥标识为abstract、synchronized、native或strictfp。声明与实例变量同名的局部变量是合法的,着称为“隐藏” 。fianl变量具有如下属性: 一旦赋值之后,fianl变量就本鞥重新初始化。一旦将对象赋予final变量,则,final引用变量不能引用不同的对象。在构造函数完成之前,fianl引用变量必须初始化。 根本没有“最终对象” 这种说法。编制为final的对象阴阳永并不意味着该对象是不可变的。transient 修饰符只能应用于实例变量volatile 修饰符只能应用于实例变量

     

    数组声明(考试目标1.3)

    数组能够保存基本类型或对象类型,但数组本身就是对象。当声明数组时,括号可以位于变量名的左边或右边。在声明中包含数组大小用源是不合法的。对象数组能够保存通过该数组声明类型IS-A(或者instanceof) 测试的任何对象。如果Home扩展Animal,那么House对象就能放入Animal数组中。

     

     

    静态变量和方法(考试目标1.4)

    它们不属于类的任何具体实例。不需要类的实例,因为可以使用类的静态成员。静态变量/静态类只有一份副本,所有实例共享此副本。 静态方法不能直接访问非晶态成员。

     

    枚举(考试目标1.3)

    枚举值定了一个常量值列表,它们赋予某个类型。

    枚举不是String或int,枚举常量的类型是枚举类型。例如,SUMMER和FALL就属于枚举类型Season。

    枚举可在类外部或内部声明,但不能在方法中声明。

    在类外声明的枚举不能被标识为static、final、abstract、protected或private。

    枚举可以包含构造函数、方法、变量和常量特定类体。

    枚举常量可以使用语法BIG(8) 将变元发送给枚举构造函数,其中int型字面值8会传递给枚举构造函数。

    枚举构造函数可以带有变元,并且可以被重载。

    永远不能在代码中直接调用枚举构造函数。它们总是在初始化枚举是自动调用的。

    枚举声明末尾的分号是可选的。下面的代码是合法的:

    enum Foo{ONE, TWO, THREE} enum Foo{ONE, TWO, THREE};

    MyEnum.values()返回一个数组,包含MyEnum的值。

     

     

     

     


    最新回复(0)