SCJP笔记_章一_声明与访问控制

 

      打算考SCJP。上SUN的网站模考了一下,没有全做(3小时太长了),做完的题目只对了40%,当然语言方面也有障碍。感觉自己基础挺差,逛来逛去买本《SCJP考试指南》,每天花一点时间看看,给自己找个目标。

     先写个流水账的笔记,以后慢慢精简,修正。请大家多多提意见,谢谢大家!

     

第一章 声明与访问控制

 

1.1 Java回顾

没啥好说的,基本概念的罗列:

  • ——模板。对象——模板的实例。状态和行为(也就是变量和方法)。
  • 标识符(identifier——类、变量和方法等java组件的名称。
  • 关键字(keyword——java占了不,让我们用的名字。当然标识符我们也不能用。
  • 继承(inheritance——书云:此乃面向对象语言的核心。好像是这么回事。
  • 接口(interface——书云:接口好比100%抽象的超类。我想说说抽象类和接口的使用,很多兄弟把接口用烂了,一个项目全都是接口,看不见一个抽象类。有为同事说的很好:接口是用来管理类的。抽象类才是体现对象关系。


1.2 标识符和JavaBeans

相关考试目标:

      考试目标1.3 编写代码,将基本类型、数组、枚举和对象作为静态变量、实例变量和局部变量声明、初始化并使用。此外,使用合法的标识符为变量命名。

      考试目标1.4 编写代码,声明静态和非静态方法,(如果合适的话)使用遵循JavaBeans命名标准的方法名。此外,编写代码,声明并使用可变长度的变元列表。

      本节说的是两个考试目标中的Java标识符相关内容:

  • 合法标识符——编译器判断名称合法性的规则。
  • SunJava编码规范——Sun对类,变量和方法的命名建议。
  • JavaBeans命名标准——JavaBeans规范的命名要求。

1.2.1 合法标识符

Unicode字符、数字、货币符号、连字符组成。Unicode字符这里可以理解为"可以组成字的符号"。换句话说只要你高兴,用中文命名变量也可以。但是一些特殊的符号是不能用的,比如+-./.

必须知道的几条规则:

  • 不能以数字开头,必须以"字母""$""_"开头。
  • (复习可忽略)首字之后,可以字母、数字、"$""_"任意组合。
  • (复习可忽略)标识符的字符数没有限制。
  •  关键字不能用作标识符,注意1.4新增assert1.5新增enum。其他不常用的关键字:const,native,strictfp,transient,volatile.
  •  大小写敏感

一些非法的标识符:

int :b;    //:非法 
int -d;    //-非法
int e#;   //#非法  
int .f;      //.非法  
int 7g;    //不能以数字开头

1.2.2 Sun的Java编码规范

Sun的一些命名建议:

  • 类和接口。首字母大写,驼峰命名法,名词。
  • 方法。首字母小写,驼峰命名法,动词-名词组合。
  • 变量。首字母小写,驼峰命名法,有意义的短名称。
  • 常量。表示为static和final的变量。全部大写,并以下划线做分隔符。

1.2.3 JavaBeans标准

标准的目的:说白话就是你写的别人能看懂,别人写的你也知道是什么。

JavaBeans由两部分组成:属性(property)和事件监听器(event listener)。

属性就是JavaBean的私有变量,以及访问属性的对应getter,setter方法。

JavaBeans属性命名规则:

 

private String property;
	private Boolean flag;
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
	}
	public Boolean getFlag() {
		return flag;
	}
	public void setFlag(Boolean flag) {
		this.flag = flag;
	}

JavaBeans 监听器命名规则:

  • 向事件源注册的监听方法以“add”开头
  • 取消注册的方法以“remove”开头
  • 要操作的监听器类型必须作为变元传递给方法
  • 必须以“Listener”结尾

不规范的例子:

void setCustomerName(String s)  		//must be public
public void modifyMyValue(int v)		//can't be 'modify'
public void addXListener(MyListener m)	//listener type mismatch

 

1.3 声明类

相关考试目标:

      考试目标1.1 编写代码,声明类(包括抽象类和各种形式的嵌套类)、接口和枚举。编写代码,包含包和导入语句(包括静态导入)的恰当使用。

1.3.1 源文件声明规则

  • 每个源代码文件只能有一个public类
  • 注释可以出现在任一行的开始或结尾
  • 如文件中有一个public类,那么文件名必须与类名匹配
  • 如果有package语句,那么它必须位于源代码文件的第一行,并出现在任何import语句之前
  • 如果有import语句,则它们必须位于package和类声明之间
  • 如果没有package和import语句,那么类声明必须位于第一行
  • 一个文件可以具有多个非公共类
  • 不包含公共类的文件可以具有与该文件中的任何类都不匹配的名称。

1.3.2 类声明和修饰符

修饰符分为两类:

  • 访问修饰符:public  默认
  • 非访问修饰符:strictfp final abstract

书云——Java是一种以包为中心的语言。

这句话告诉我们为什么要有类声明和修饰符——访问控制。

当类A可以访问类B时,即B对A可见(visibility),这意味着类A可以:

  • 创建类B的一个实例(instance)
  • 扩展(extend)类B,就是继承B
  • 访问(access)类B,就是访问类B的某些变量和方法,当然这取决与他们的访问修饰符

其他(非访问)类修饰符:strictfp final abstract

  • strictfp 对于考试,我们只要知道它是关键字就可以了。它可以修饰类和方法,但不可用于变量。作用是声明该类或方法在处理浮点数时将遵守IEEE754标准。否则在处理浮点数时可能与平台相关。
  • final 最终类。该类不能再有子类,即不能被继承。
  • abstract 抽象类。与final相反,就是让你继承来实现的。

 

 

1.4 声明接口

考试目标1.1 编写代码,声明类(包括抽象类和各种形式的嵌套类)、接口和枚举。编写代码,包含包和导入语句(包括静态导入)的恰当使用。

考试目标1.2 编写代码,声明接口。编写代码,实现或扩展一个或多个接口。编写代码,声明抽象类。编写代码,扩展抽象类。

1.4.1 声明接口

接口就是一份契约(contract),说明它能够做什么。任何实现这个接口的类都必须同意为该接口的所有方法提供实现。

  • 接口方法隐含都是公共的和抽象的,所以不必实际地键入public或abstract修饰符。
  • 接口只能声明常量,不能声明实例变量。
  • 接口方法一定不能是静态的。因为接口方法是abstract的,static是必须被是实现的。
  • 接口可以继承,并且只能继承接口。
  • 用interface来声明。
  • 接口类型能够被多态地使用。

1.4.2 声明接口常量

接口中可以定义常量,而且都是public static final的,常量一旦被定义是无法修改或重新赋值的。

 

//接口InterfaceA
public interface InterfaceA {
	public static final int CONSTANT_1 = 1;
	int CONSTANT_2 = 2;
	void addElement(Object o);
	void addElement(Integer id);
}

//接口InterfaceB 继承了InterfaceA
public interface InterfaceB extends InterfaceA {	
	void delElement(Object o);
}

//InterfaceB的实现类ImplB
public class ImplB implements InterfaceB {

	public void delElement(Object o) {
		int i  = CONSTANT_1;
	}

	public void addElement(Object o) {
		// TODO Auto-generated method stub
	}

	public void addElement(Integer id) {
		id = CONSTANT_2;		
	}

}

 

 

1.5 声明类成员

相关考试目标:

      考试目标1.3 编写代码,将基本类型、数组、枚举和对象作为静态变量、实例变量和局部变量声明、初始化并使用。此外,使用合法的标识符为变量命名。

      考试目标1.4 编写代码,声明静态和非静态方法,(如果合适的话)使用遵循JavaBeans命名标准的方法名。此外,编写代码,声明并使用可变长度的变元列表。

在类中,方法和实例变量(非局部的)统称为成员(member)。可以使用访问修饰符和非访问修饰符修饰成员,并且比声明类时有更多的修饰符可供选择(和组合)。

1.5.1 访问修饰符

类成员可以使用全部4种访问修饰符,包括:public protected private 和默认。

对于protected的成员变量,在包外可以通过继承来访问父类的protected成员。但是,在子类中实例化父类,用"."的类引用方式是无法访问的。

对于局部变量,不可以使用访问修饰符局部变量唯一一个可以使用的修饰符是final。

4种访问级别的可访问范围:

访问级别访问控制修饰符同类同包同包子类包外子类包外
公开public
受保护protected继承可以
默认
私有private

 

 

 

 

 

 

 

 

1.5.2 非访问修饰符

类的成员变量可以使用的非访问修饰符:

final、abstract、static、transient、synchronized、native、strictfp

final方法:

子类不能重写父类中的final成员

final变元:

变元就是方法声明中出险在两个圆括号之间的变量声明。变元也是一种局部变量,它可以使用的修饰符只有final,被final声明的变元,意味着不能在该方法中修改它,final变元必须保持与传递给方法时参数所具有的值相同。

抽象方法:

抽象类的第一个具体子类必须实现超类的所有抽象方法。

不能同时标识为abstract和final,abstract表示超类完全不知道子类在该方法中该怎样运作,final表示超类知道子类在该方法中该怎样运作的每件事情(无论继承树有多深)。

不能同时标识为abstract和private,子类无法访问超类的private的方法,当然也就无法实现。

不能同时标识为abstract和static。

同步方法:

synchronized方法一次只能被一个线程访问,只能应用于方法,可以使用所有的访问控制级别。

本地方法:

native修饰符表明方法是用与平台相关的语言(通常为C)实现的。只能应用于方法。它实质上就是一个本地接口,比如

	public native void runFormC();

strictfp方法:

跟修饰类的时候一样,它可以修改类或方法,不能用于变量。

具有可变变元列表的方法(var-arg):

数量可变的变元。要注意:

 

  • var-arg必须制定它的变元类型,即它是int?char?还是Object?
  • 一个使用var-arg的方法中有其他参数是合法的。
  • var-arg必须是方法签名中的最后一个参数,且一个方法中只能有一个var-arg。

合法的var-arg声明:

 

void doStuff(int...x){}
	void doStuff(char c,int...is){}
	void doStuff(Object...objects){}

 

1.5.3 构造函数声明

  • 构造函数没有返回类型。
  • 构造函数的名称必须与类名一致。
  • 不能标识为static、final、abstract
class Foo2{
	
	//legal constructors
	
	Foo2(){  }
	private Foo2(byte b){  }
	Foo2(int x){  }
	
	//illegal constructors
	
	void Foo2(){  }		//it's a method,not a constructor
	Foo2(){  }			//not a method or a constructor
	Foo2(short s);		//looks like an abstract method
	static Foo2(float f){  }//can't be static
	final Foo2(long x){  }//can't be final
	abstract Foo2(char c){  }//can't be abstract
	Foo2(int... x,int t){  }//bad var-arg syntax

}

 

1.5.4 变量声明

两种类型的变量:

  • 基本变量:char,boolean,byte,short,int,long,double,float
  • 引用变量:用于引用(访问)一个对象。

基本变量的范围:

类型字节最小范围最大范围
byte81-2^72^7-1
short162-2^152^15-1
int324-2^312^31-1
long648-2^632^63-1
float324----
double648----

 

 

 

 

 

 

 

 

 

 

 

声明引用变量

Object o;
String str;

实例变量

实例变量定义在类中,但位于任何方法之外,并且只有在实例化类时才会被初始化。

  • 实例变量可以使用所有4种访问修饰符。
  • 可以标识为final、transient
  • 不可以标识为abstract、synchronized、strictfp、native
  • 不可以标识为static,否则就是类变量(静态变量)了。

局部(自动/栈/方法)变量

局部变量是在方法内声明的变量,作用域只在方法内部。可以用的修饰符只有final。

 

数组声明

Java中,在声明数组中不可指定数组的大小,只有在实例化的时候,JVM才分配空间。

 

int[] key;
int key [];
int key[];
String[][][] str;
String[] str [];

 

final变量

对于声明为final的基本变量,只是说它们的值不可以修改;而对于引用变量,是指不能修改“引用”了,仍然可以修改该引用的对象的数据。

 

transient变量

表示为瞬态的,则是在告诉JVM,当试图序列化包含这个变量的对象时应跳过它。不需熟悉。

 

volatile变量

volatile告诉JVM,访问该变量的线程必须总是使自己对该变量的私有副本与内存中的主副本保持一致。不需熟悉。

 

静态变量和静态方法

static成员独立于为类而创建的任何实例

 

修饰符使用表:

修饰符    类     成员方法构造方法成员变量局部变量
abstract(抽象的)
static(静态的)
public(公共的)
protected(受保护的)
private(私有的)
synchronized(同步的)
native(本地的)
transient(暂时的)
volatile(易失的)
final(不可改变的)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.5.5 声明枚举

Java5.0以后,我们可以使用枚举——enum

枚举就是限制一个变量只能具有几个预定义的值中的某个值。

枚举可以被声明为独立的类,类成员,但是不能在方法内声明它们。

声明枚举的方式:

enum CoffeeSize {BIG,HUGE,OVERWHELMING};      //在这个枚举声明的后面没有其他声明的情况下,可以加一个分号

枚举类中的构造函数:

enum CoffeeSize{
	BIG(8),HUGE(10),OVERWHELMING(16);
	CoffeeSize(int ounces){
		this.ounces = ounces;
	}
	private int ounces;
	public int getOunces(){
		return ounces;
	}
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值