打算考SCJP。上SUN的网站模考了一下,没有全做(3小时太长了),做完的题目只对了40%,当然语言方面也有障碍。感觉自己基础挺差,逛来逛去买本《SCJP考试指南》,每天花一点时间看看,给自己找个目标。
先写个流水账的笔记,以后慢慢精简,修正。请大家多多提意见,谢谢大家!
第一章 声明与访问控制
1.1 Java回顾
没啥好说的,基本概念的罗列:
1.2 标识符和JavaBeans
相关考试目标:
考试目标1.3 编写代码,将基本类型、数组、枚举和对象作为静态变量、实例变量和局部变量声明、初始化并使用。此外,使用合法的标识符为变量命名。
考试目标1.4 编写代码,声明静态和非静态方法,(如果合适的话)使用遵循JavaBeans命名标准的方法名。此外,编写代码,声明并使用可变长度的变元列表。
本节说的是两个考试目标中的Java标识符相关内容:
1.2.1 合法标识符
由Unicode字符、数字、货币符号、连字符组成。Unicode字符这里可以理解为"可以组成字的符号"。换句话说只要你高兴,用中文命名变量也可以。但是一些特殊的符号是不能用的,比如+-./等.
必须知道的几条规则:
一些非法的标识符:
int :b; //:非法 int -d; //-非法 int e#; //#非法 int .f; //.非法 int 7g; //不能以数字开头
1.2.2 Sun的Java编码规范
Sun的一些命名建议:
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 监听器命名规则:
不规范的例子:
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 源文件声明规则
1.3.2 类声明和修饰符
修饰符分为两类:
书云——Java是一种以包为中心的语言。
这句话告诉我们为什么要有类声明和修饰符——访问控制。
当类A可以访问类B时,即B对A可见(visibility),这意味着类A可以:
其他(非访问)类修饰符:strictfp final abstract
1.4 声明接口
考试目标1.1 编写代码,声明类(包括抽象类和各种形式的嵌套类)、接口和枚举。编写代码,包含包和导入语句(包括静态导入)的恰当使用。
考试目标1.2 编写代码,声明接口。编写代码,实现或扩展一个或多个接口。编写代码,声明抽象类。编写代码,扩展抽象类。
1.4.1 声明接口
接口就是一份契约(contract),说明它能够做什么。任何实现这个接口的类都必须同意为该接口的所有方法提供实现。
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声明:
void doStuff(int...x){} void doStuff(char c,int...is){} void doStuff(Object...objects){}
1.5.3 构造函数声明
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 变量声明
两种类型的变量:
基本变量的范围:
类型 | 位 | 字节 | 最小范围 | 最大范围 |
byte | 8 | 1 | -2^7 | 2^7-1 |
short | 16 | 2 | -2^15 | 2^15-1 |
int | 32 | 4 | -2^31 | 2^31-1 |
long | 64 | 8 | -2^63 | 2^63-1 |
float | 32 | 4 | -- | -- |
double | 64 | 8 | -- | -- |
声明引用变量
Object o; String str;
实例变量
实例变量定义在类中,但位于任何方法之外,并且只有在实例化类时才会被初始化。
局部(自动/栈/方法)变量
局部变量是在方法内声明的变量,作用域只在方法内部。可以用的修饰符只有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; } }