java学习笔记孙卫琴文档格式.docx
《java学习笔记孙卫琴文档格式.docx》由会员分享,可在线阅读,更多相关《java学习笔记孙卫琴文档格式.docx(45页珍藏版)》请在冰豆网上搜索。
●Java源文件结构
一个Java程序中可以包含多个Java源文件,一个Java源文件中可以定义多个类,只有一个类是public类型。
Java源文件以public类型的类的名称命名。
●关键字
关键字是Java语言中的一些特殊的字符,如public、class、import、package和void等。
每个关键字都有特殊的含义。
关键字不能用作标识符。
●标识符
标识符是程序中包、类、变量或方法的名称。
●包引入语句
如果类A和类B位于不同的包中,并且类A要访问类B,那么在类A中,就必须通过import语句引入类B所在的包。
●方法的声明
一个方法可以有零个或者多个参数,可以没有或者有一个返回值。
关键字void表示没有返回值。
关键字return用于给定返回值,并且推出当前方法。
●注释语句
“//”用于提供单行注释,“/**/”或者“/***/”用于提供多行注释。
注释语句用于解释程序代码的作用。
●JavaDoc文档
Java类通过JavaDoc文档对外公布自身的用法。
第三章数据类型
3.1基本数据类型
基本数据类型有:
boolean、byte、char、short、int、long、float、double
其中,byte、short、int、long是整数类型
在Java语言中,如果数学表达式中都是整数,那么表达式的返回值必定是int类型或long类型。
3.1.1char类型与字符编码
常用的转义字符
\n:
换行符\t:
垂直制表符\r:
回车\\:
代表反斜杠
\’:
代表单引号\”:
代表双引号
3.2引用类型
String以及创建对象的引用类型
3.3基本类型和引用类型的区别
(1)基本类型代表简单数据类型,而引用类型所引用对象能够表示任意一种复杂的数据结构。
并且引用类型能够操作这种数据类型的行为。
比如,一个引用类型实体的变量、方法。
(2)Java虚拟机处理引用类型变量和基本类型的方式是不一样:
3.4直接数
变量声明之后,在使用前一般会显示地进行赋值,而赋值给变量的具体数值就是直接数。
Java的直接数有一下特点:
○对于基本类型的数据,除了byte和short类型之外,都有相应的直接数。
○对于long、float的double型直接数,可以分别加上后缀:
L或l、F或f,以及D或d。
○在整数后面加上“L”表示Long型直接数,但不能一次类推:
在整数后面加上“S”表示short型直接数,在整数后面加上“C”表示char型直接数。
○如果一个小数没有任何后缀,那么它是double型直接数,例如:
1.0就是一个double类型的直接数。
○对于Java对象,只有String类型对象有直接数。
○String类型直接数和char类型直接数的区别在于,前者表示字符串,位于双引号内,后者表示单个字符,在单引号内。
3.5章节小节
●Java基本数据类型
共有8种基本数据类型:
boolean、byte、short、int、long、float、double和char。
●引用类型
引用类型的变量用于引用特定的对象,程序通过引用类型的变量来访问特定对象的属性和方法。
●直接数类型
如果把直接数赋值给类型不一致的变量,有时必须使用强制类型转换(从高转向低的时候)。
第四章变量
4.1变量的作用域
成员变量:
在类的声明中,它的作用域是整个类
局部变量:
在一个方法的内部声明中,它的作用域是整个方法
方法参数:
方法的参数,它的作用域是整个方法
4.1.1实例变量和静态变量
类的静态变量在内存中只有一个,被类的所有实例共享,静态变量可以通过类名直接访问。
类的每个实例变量都有相应的实例变量,每创建一个类的实例,Java虚拟机就会为实例变量分配一次内存。
☆在打印语句“System.out.println()”中,System是java.lang包中一个类,out是System类的一个静态成员变量,out是PrintStream类型。
因此,“System.out.println()”用于调用System类的out静态成员变量所引用的PrintStream对象的print()方法。
4.1.2成员变量和局部变量同名
在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽,可通过this关键字访问。
4.2参数传递
注意内存的分析,方法体内的局部变量随着方法体的执行结束,局部变量(在栈内存)也就消失。
方法体内的引用变量随着方法体的执行结束,引用变量(在栈内存)也消失,其引用的内容(在堆内存)将会随着垃圾收集器的执行清理而消失。
4.3用new关键字创建的对象
○为对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值
○如果实例变量在声明时被显式初始化,就将初始化赋值给实例变量
○调用构造方法
○返回对象的调用
4.4章节小节
●变量的作用域
按照变量的作用域,变量可分为:
成员变量、局部变量、方法参数
●实例变量和静态变量
●对象的默认引用this
当一个对象创建好以后,Java虚拟机就会给它分配一个引用自身的指针:
this
第五章基本类型操作符
5.1自动数据转换
在进行赋值运算时,也会进行低位到高位的自动类型转换,赋值运算的自动类型转换规则如下:
byte->
short->
int->
long->
float->
double
byte->
char->
5.2强制类型转换
高位向地位转换的时候,使用。
第六章流程控制
6.1分支语句
6.1.1if-else语句
if-(elseif)-else
6.1.2switch语句
switch(expression){
CasevalueN
Statements;
Break;
…
Default:
}
valueN的类型必须是与int类型兼容的基本类型,包括byte、short、char、int类型。
break语句是为了跳出switch循环。
6.2循环语句
for语句:
先检查循环条件,再执行循环体,通常用于事先确定了循环次数的场合
while语句:
最常用的循环体,先检查循环条件,在执行循环体
do-while语句:
限制性循环体,在检查执行条件,循环体至少执行一次
6.3流程跳转语句
break、continue、return语句来控制流程跳转。
break:
从switch语句或循环语句中退出。
continue:
跳过本次循环,执行下一次循环。
return:
退出本方法,调到上层调用的方法;
如果本方法的返回类型不是void,需要提供相应的返回值。
break语句和continue语句可以与标号联合使用。
标号用来标志程序中的语句,标号的名字可以是任意合法的标识符。
例如在以下代码中,“loop1”和“loop2”为标号,分别标识for语句和switch语句。
第七章继承
7.1继承的基本语法
Sub类从Base类继承:
○当Sub类和Base类位于同一个包中:
Sub类继承了Base类中public、protected和默认访问级别的成员变量和成员方法。
○当Sub和Base类位于不同的包中:
Sub类继承Base类中public、protected访问级别的成员变量和成员方法。
7.2方法重载(Overload)(对返回值类型不做限制)
重载方法必须满足以下条件:
○方法名必须相同
○方法的参数类型、个数、顺序至少有一项不相同
7.3方法覆盖(Override)
如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
以下是覆盖方法的约束条件:
○子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致。
如果方法名和父类一样,但是返回值不一样,则编译错误。
原理:
Java编译器首先判断子类方法域父类方法的名称、参数签名,如果一致,Java虚拟机就认为子类试图覆盖父类方法。
○子类方法不能缩小父类方法的访问级别。
○子类方法不能抛出比父类方法更多的异常。
子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常时父类方法抛出异常类的子类。
7.4方法重载与方法覆盖的异同
方法重载是指在同一个类中,对方法提供多种不同的实现方式;
方法覆盖是指子类采用父类不同的实现方式。
方法重载和方法覆盖的异同:
○方法覆盖要求参数签名必须一致,而方法覆盖要求参数签名必须不一致
○方法覆盖要求返回类型必须一致,而方法重载对此不做限制。
○方法覆盖对方法的访问级别和抛出的异常有特殊的要求,而方法重载在整个方面没有任何限制。
7.5super关键字
Super和this关键字都可以用来覆盖Java语言的默认作用域,使被屏蔽的方法或变量变为可见,以下场合会出现方法或者变量被屏蔽的现象:
○在一个方法内,当局部变量和类的成员变量同名,或者局部变量和父类的成员变量同名时,按照变量的作用域规则,只有局部变量在方法内可见。
○当子类的某个方法覆盖了父类的一个方法,在子类的范围内,父类的方法不可见。
○当子类中定义了和父类同名的成员变量,在子类的范围内,父类的成员变量不可见。
7.6多态
Animalanimal=newDog();
以上animal变量被定义为Animal类型,但实际上有可能引用Dog的实例。
7.6.1多态引用绑定规则
在运行环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟就采用以下绑定规则:
○实例方法与引用变量实际引用的对象(new后面的)的方法绑定,这种绑定属于动态绑定,因为它是在运行时由Java虚拟机动态决定的。
○静态方法域引用变量所声明的类型(等号前的)的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经做了绑定。
○成员变量(包括静态变量和实例变量)与引用变量所声明的类型(等号前的)的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经做了绑定。
7.6.2多态引用类型转换
Basewho=newSub();
如果要用who访问子类有而父类没有的方法或者变量,需要进行类型的强制转换(向下转型):
((Sub)who).subVar=“111”;
但假如两种类型之间不再继承树上存在继承关系,那么Java编译器不允许进行类型转换。
如:
Dogdog=newDog();
Catcat=(Cat)Dog;
//编译出错
对于一个引用类型的变量,运行时Java虚拟就按照它实际引用的对象来处理,例如,以下代码可以编译通过,但是运行时会抛出ClassCastException运行时异常。
Basewho=newBase();
Subs=(Sub)who;
//运行时抛出ClassCastException
总结:
在运行时,子类的对象那个可以转换为父类类型,而父类的对象实际上是不能转换为子类类型。
7.7章节小节
●继承的作用和语法
继承是提高代码复用的有力手段,extends关键字用于声明一个子类继承了某个父类,子类会自动拥有父类的一些属性和方法。
一个类只能有一个直接的父类,但是它可以有多个间接的父类。
假如在定义一个类时,没有使用extends关键字,那么这个类直接继承Object类。
●重载方法必须满足以下条件
1、方法名必须相同;
2、方法的参数签名必须不同
●方法覆盖必须满足的条件
1、子类方法的名称及参数签名必须与所覆盖的方法相同
2、子类方法的返回值必须与所覆盖的方法相同
3、子类方法不能缩小所覆盖方法的访问级别
4、子类方法不能抛出比所覆盖方法更多的异常
●super关键字的用途
当子类的某个方法覆盖了父类的一个方法,在子类范围内,父类的方法不可见。
当子类中定义了和父类同名的成员变量,在子类的范围内,父类的成员变量不可见。
在这两种情况下,在子类中可通过使用super关键字访问父类的被屏蔽的成员变量和方法。
●多态
1、对于一个引用类型的变量,编译器按照它声明的类型处理
2、对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象处理。
3、在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
实例方法与引用变量实际引用的对象的方法绑定;
静态方法域引用变量所声明的类型的方法绑定;
成员变量(包括静态变量和实例变量)与引用变量声明的类型的成员变量绑定。
第八章引用类型操作符
8.1字符串连接操作符“+”
如果“+”操作符中有一个操作元是String类型,则另一个操作元可以是任意类型(包括基本类型和引用类型),另一个操作元将被转换为字符串。
如果另一个操作元为引用类型,就调用所引用对象的toString()方法来获得字符串。
如果“+”操作符的两个操作元都不是String类型,那么“+”操作符的两个操作元必须都是除boolean以外的基本数据类型或者其包装类型,此时“+”作为数学加法操作符处理。
8.2操作符“==”与对象的equals()方法
8.2.1操作符“==”
当操作符“==”两边都是引用类型变量时,这两个引用变量必须都引用同一个对象,结果才为true。
8.2.2对象的equals()方法
当参数obj引用的对象与当前对象为同一个对象(类型),就返回true,否则返回false。
Object类的equals()方法定义:
publicBooleanequals(Objectobj){
if(this==obj)returntrue;
elsereturnfalse;
在JDK类库中,有一些类覆盖了Object类的equals()方法,它们的比较规则为:
如果两个对象的类型一致,且内容一致,则返回true。
这类类包括:
java.io.File、java.util.Date、java.lang.String、包装类(如java.lang.Integer和java.lang.Double类等)
8.3操作符“!
=”
比较两个引用变量是否部引用同一个对象。
这个“==”相反。
8.4“=”操作符
进行赋值运算,是左边的引用类型操作元与右边的引用类型操作元引用同一个对象。
引用类型的变量之间赋值时,子类赋值给直接或间接父类,会自动进行类型转换。
父类赋值给直接或间接子类,需要进行强制转换。
8.5instanceof操作符
Instanceof操作符用于判断一个引用类型所引用的对象是否为一个类的实例,instanceof操作符左边的操作元是一个引用类型,右边的操作元是一个类名或接口名。
返回值为true或者false。
第九章访问控制修饰符
9.14种访问控制级别
Java语言采用访问控制修饰符来精确地控制类及类的方法和变量的访问权限。
访问控制分四种级别:
○公开级别:
public修饰,对外公开
○受保护级别:
用protected修饰,向子类及同一个包中的类公开。
○默认级别:
没有访问控制修饰符,向同一个包中的类公开
○私有级别:
用private修饰,只有类本身可以访问,不对外公开。
注:
访问级别仅适用于类及类的成员,而不适用于局部变量。
局部变量只能在方法内部被访问,不能用public、protected或private修饰。
第十章abstract(抽象)修饰符
10.1abstract修饰符的修饰内容
Abstract修饰符可用来修饰类和成员方法:
○用abstract修饰的类表示抽象类,抽象类上不能被实例化,即不允许创建抽象类本身的实例。
没有用abstract修饰的类称为具体类,具体类可以被实例化。
○用abstract修饰的方法表示抽象方法,抽象方法没有方法体。
抽象方法用来描述类具有什么功能,但不提供具体的实现。
没有用abstract修饰的方法称为具体的方法,具体方法拥有方法体。
10.2abstract修饰符的语法规则
○抽象类中可以没有抽象方法(即可以只有实例方法)
○如果一个类有一个或多个抽象方法,那么这个类必须被定义为抽象类。
如果子类没有实现父类中所有的抽象方法,那么子类也必须定义为抽象类。
○没有抽象静态方法,即abstract和static不能连用,
○抽象类不能被实例化(是被抽象化的,所以逻辑上也不能被实例化)
第十一章final(不可改变)修饰符
11.1final用法
○用final修饰的类不允许被继承,即没有子类
○用final修饰的方法不允许被子类的方法覆盖
○用final修饰的变量表示常量,只允许被赋一次值
11.2final类
用final修饰的类不允许有子类。
在以下情况,可以考虑把类定义为final类型:
○不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系。
假如随意创建这些类的子类,子类可能会覆盖父类的方法,并且错误的修改父类的实现细节。
○处于安全原因,类的实现细节不允许有任何的改动
○确信这个类不会再被扩展
11.3final变量
用final修饰的变量表示取值不会改变的常量。
(1)final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量。
(2)final变量都必须显示初始化,否则会导致编译错误。
对于final类型的实例变量,可以定义变量时,或者在构造方法中进行初始化。
对于final类型的静态变量,只能在定义变量时进行初始化。
(3)final变量只能赋一次值,不允许改变final变量的值。
第十二章static(静态)修饰符
12.1Java语言用static修饰符来修饰类的静态类型信息,这些静态类型信息的特点是不依赖于特定的实例。
Static修饰符可以用来修饰类的成员变量、成员方法和代码块。
○用static修饰的成员变量和成员方法被称为静态的变量和类方法,可以直接通过类名来访问。
这些变量和方法归类的所有实例共享。
○用static修饰的程序代码块被称为静态代码块,当Java虚拟机加载类是,就会执行该代码块。
12.2static变量
○当java虚拟机加载类时,会为静态变量分配内存。
Java虚拟机只会为每个静态变量分配一次内存,因此每个静态变量在内存中只有一个备份。
程序可以直接通过类名访问静态变量。
静态变量能被类的所有实例共享,可以作为各实例之间进行交流的共享数据。
○对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个备份,互不影响。
12.3static方法
在JDK类库中有一个java.lang.Math类,提供了许多用于数学运算的静态方法。
12.3.1静态方法可以访问的内容
由于静态方法不需通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用引用当前实例的this关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。
12.3.2实例方法可以访问的内容
实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
12.3.3静态方法必须被实现
静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。
既然如此,当前类必须为静态方法提供实现。
换句话说,一个静态的方法不能被定义为抽象方法。
12.3.4作为程序入口的main()方法是静态方法
作为程序入口的main()方法必须是静态方法,因为这样可使java虚拟机只要加载了main()方法所属的类,就能执mian()方法,而无需县创建这个类的实例。
因此,main()静态方法中不能直接访问实例变量和实例方法,
12.4static代码块
Java虚拟机加载类时,会执行这些静态的代码块。
如果类中包含多个静态块,那么java虚拟机按他们在类中出现的顺序(不是main()方法中出现的顺序)依次执行他们,每个静态代码块执行一次。
静态代码块示例:
Static{System.out.println(“FirstStaticcode”);
第十三章接口
13.1接口的概念与语法规则
接口用于声明其实现类所具备的功能,或者说对外所提供的服务,但是不提供具体的实现。
接口与抽象类有点相似,两者都包含抽象方法,都不能实例化。
接口的语法规则如下:
○接口中的成员变量默认是public、static、final类型的,必须被显式初始化。
○接口中的方法默认都是public、abstract类型的。
○接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。
在接口中试图定义实例变量、非抽象的实例方法及静态方法,都是非法的。
类型必须是public类型的。
○接口中没有构造方法,不能被实例化(即方法不能有方法体)。
○一个接口不能实现另一个接口,但是可以继承多个其他的接口。
继承多个接口的接口被称为复合接口。
○接口必须通过类来实现它的抽象方法,类实现接口的关键字是implements。
○与子类继承抽象父类相似,当类实现了某个接口,它必须实现接口中所有的抽象