Java程序结构
类和对象
成员变量和局部变量
构造器
初始化块
成员方法
封装性
继承性
多态性
-
Java程序结构
(1) Java程序层次结构:包,类,接口,方法,变量,表达式,运算符,常量等等; -
1 类和对象
(1) 类的修饰符:为可选项,其修饰符及组合关系为[public][abstract | final];
用public修饰的类必须位于以该类类名命名的".java"文件中;
(2) 类名;
(3) extends 继承父类: 父类必须是一个已存在,可访问,可被继承的类,如果该extends选项不存在,就默认继承java.lang.Object;
(4) implements 接口列表 : 可实现一个或多个接口;
(5) 成员变量的定义: 修饰符为 [public | protected | private] [static] [final][transient][volatile];
(6) 初始化块 : 修饰符为缺省或static
(7) 成员方法 : 类方法和实例方法 ,修饰符为[public | protected | private] [ abstract | final ][ static][native][synchronized]
(8) 构造器 : 修饰符为 [public | protected | private];
(9) 内部类和内部接口 ;
2.2 对象的创建和使用
[ 修饰符 ] 类名 变量名 [ = 初始值] ; 使用类创建的变量都是引用变量;
可以通过赋值语句指向内存中实质的对象或者NULL;
可以通过赋值语句将对象赋值给由该类或者该类的父类或该类实现的接口创建的引用变量;
变量的数据类型必须与该对象的数据类型相同或系统支持自动类型转换;
2.3 指针 ,引用与对象
对象是调用类的构造器创建类的实例,实例创建后会系统会在内存中开辟一片空间来存储与实例有关的数据;
指针是指向一个对象存储在内存中的地址;
引用是对指针的再封装,限制了指针的一些赋值,只能将 引用 ,对象 或者 NULL 赋值给引用;
2.4 对象的this引用
this引用可以在类的3个位置出现 : 非static 初始化块,非static方法 ,构造器;
2.5 类成员和实例成员
实例成员(没有static修饰) 可通过相应的引用变量来调用,或者在创建对象时直接通过构造器返回的对象来调用;
类成员(static修饰 ) 可通过引用变量,对象 或者类名来调用;
3 成员变量和局部变量
成员变量是在类里面并且在类中其他成员方法,初始化块之外定义的变量;
局部变量是在方法中,代码块中或形参列表中定义的变量;
3.1 成员变量的定义和使用
所有变量需要被初始化才能使用,初始化就是给变量分配空间和赋初始值;
一般,成员变量没有显式地进行初始化的话,系统会在类或者对象初始化阶段对其进行初始化( final ) 除外;
3.2 局部变量的定义和使用
(1) 形参 : 在方法声明中定义的变量,其作用域从形参定义开始,到方法体结束;
(2) 代码局部变量: 在代码块中定义的局部变量,其作用域从定义该变量的位置开始,到该代码块末尾结束;
代码块不包括类体代码块;
局部变量在访问之前必须进行显式地初始化,系统不会为局部变量赋值;
3.3 变量同名问题
不同类和不同接口不存在变量同名问题,因为在指定其变量时必定要指定类名或引用变量前缀;
(1) 成员变量和成员变量同名 : 成员变量 不允许同名存在,不管是否有static修饰;
(2) 成员变量和局部变量: 成员变量和局部变量能够同名存在,在这种情况下,局部变量会在其作用域中覆盖其成员变量,除非通过类名或引用来指定成员变量;
(3) 局部变量和局部变量 : 不能同名;
4 构造器
4.1 构造器的定义
(1) 修饰符只能为访问控制符 : public ,protected,private 或缺省 来指定构造器的可被访问的范围;
(2) 没有返回值,可以存在return 语句,但是不能返回任何有效数据,包括this;
(3) 构造器与类名同名;
(4) 形成列表和throws异常列表是可选项;
(5) 构造器主要是来初始化对象的相关数据;
如果类中没有显式定义构造器,系统会默认生成一个public 无参数 空方法体的构造器;
4.2 构造器的调用
(1) new 构造器名();
(2) this (形参列表),该方式是指在构造器重载的情况下,在构造器A中可以通过该语句调用本类的另外一个构造器B的执行代码,并且该语句必须放在构造器A的第一条语句位置外,使用这种方式可以提高构造器代码的复用,而且不会产生一个新的对象;
(3) 使用super关键字调用构造器,这种方式主要是用在类的继承中,当子类的构造器需要显式的调用其父类的构造器时,可以使用super(形参列表) 来调用父类指定的构造器;
5 初始化块
初始化块也是也是类成员之一;没有关键字和标识符,因此无法显式调用,只能在加载类或者创建对象时隐式调用;
5.1 代码块
使用{} 包括的代码段称为代码块;
(1) 类体代码块: 在类的声明语句后定义的代码块称为类体代码块,这种特殊的代码块已经不具备普通代码块的特征,类中各个成员并非按顺序执行,类体中先执行静态成员变量的初始化,在执行非静态成员变量的初始化,然后执行静态成员方法的声明,和非静态成员方法的声明;
(2) 方法代码块:
(3)静态代码块: 其主要作用是对静态成员变量进行初始化;
(4) 同步代码块 : 使用synchronized 修饰的代码块 ,他表示同一时间只能有一个线程进入到该代码块,是一种多线程保护机制;
(5 ) 构造代码块: 在类中直接定义没有任何修饰的代码块即为构造代码块,其在创建对象并进行初始化时调用;
(6) 普通代码块:
(7) 语句代码块;
5.2 普通初始化块:即类体中没有用static修饰的普通代码块;普通初始化块是在对象被创建时隐式调用的,普通初始化块的执行顺序与在类体中定义的顺序相同;
实际上,普通初始化块是一个假象,当Java程序编译完成后,在Java类中定义的初始化块就会消失,并自动添加到每个构造器中的代码前面;
5.3 静态初始化块
静态初始化块在该类的所有对象初始化之前进行,并且只执行一次;
5.4 初始化块的执行
Java系统在创建某个类的对象时,总是先保证其所有父类(包括直接父类和间接父类,并且是从顶层父类开始)全部加载并初始化,并且对类的初始化只执行一次,在保证当前类和其他父类都进行初始化之后再进行当前类的对象的初始化工作,同样,在此对象初始化之前,也要先保证该类的所有父类的对象全部初始化完成(也是从顶层父类的对象开始)。对于任何一个类的对象的初始化,总是按代码先后顺序全部执行其所有的普通初始化块,再执行其相应的构造器;
6 成员方法
6.1 方法的定义和调用
在Java语言中,方法不能在文件中独立存在,必须定义在类体中(以及接口,枚举类等中);
(1) 修饰符: 方法前的修饰符为可选项,其具体定义规则为: [public | protected | private ] [ static] [ final | abstract] [native] [ synchronized] ;其中public,protected,private用来限定方法的访问权限,static 设置方法的归属性,final 限定方法是否可以继承,abstract限定为抽象方法;
(2) 返回值类型 : void 方法可以有return语句,但是不能返回任何有效数据;
(3) 方法名;
(4) 形参列表 :
(5) throws 异常名列表;
(6) 方法体;
6.2 方法重载
同一个作用域,方法形参列表的数量或形参类型不同就能构成重载;
6.3 方法的参数传递机制
6.4 实参长度可变的方法
定义实参长度可变的方法可以在方法调用时传入不同长度的实参列表;
定义方式: void fun ( int i ,String …str) {};在一个形参类型与参数名之间加上三个连续的“." ;只有最后一个形参能够定义成”能和不确定长度的实参相匹配的“;长度可变的形参可理解为数组类型参数的变种;
7 封装性
7.1 包Package
7.2 Java常用包
Java核心包都放在Java包及其子包,Java扩展的许多类都放在Javax 包以及子包;
(1) Java.lang : Java语言包,为Java的核心包,其中包含了Object类,数据类型包装类,数学类,字符串类,系统,运行时类,操作类,线程类,过程类,错误和异常处理类,系统会自动将这个包下所有类导入到程序中,无须import;
(2)Java.util : 包含集合类,时间处理模式,日期时间工具等各类常用工具包;
(3) Java.net : 包含执行与网络有关的类;
(4) java.io : 包含提供多种输入输出功能的类和接口;
(5) Java.sql : 提供Java语言访问并处理存储在数据库中的数据的相关类和接口;
(6) Java.text : 包含Java格式化相关的类;
(7) Java.swing : 包含Swing 图形用户界面编程的相关类和接口,可用来构建平台无关的GUI程序;
(8)Java.math : 包含执行精度数学运算功能的相关类;
(9) Java.awt : 提供了绘图和图像类,主要是用于编写GUI 程序,包括按钮,标签等常用组件以及相关的事件类;
7.3 类成员的封装和访问控制
private : 只能在同一个类中访问;
protected : 可以在同一个包中访问,protected 的作用是在default 的基础上让不同包的子类也可以继承父类的成员;
public : 可以在任意地方访问;
default: 可以在同一个包中访问;
7.4 类的访问控制和import语句
只有public 和default(默认) 可以控制类的访问权限;
默认 : 只能在同一个包中访问;
public : 可以在任意包中访问;
使用import 导入包中的类 :
import package1.[package2…].(classname | *); 只能导入public 类;
( * )表示导入包中所有public类;
import static package1[.package1…].classname.(staticMemberName | * ) : 导入某个public类的静态成员;
8 继承性
8.1 类的继承
访问控制符取决于该成员能否被子类继承;
private : 不可继承;
protected : 可以被在不同包的类继承 ,但是只能在被继承的那个类里面使用;
public : 可以在任意包中被继承;
default : 只能在同一个包中继承,不能在不同包中继承;
8,2 方法的重写
子类重写父类方法的几个原则:
(1) 子类重写的方法名与父类相同,但是形参列表相同;如果形参列表不同,则形成重载,重载是形成一个新的方法;
(2) 子类重写的方法的返回值类型和父类的方法的返回值相同;
(3) 如果父类被重写的方法抛出异常声明,则子类重写方法也应该抛出异常,且该异常应与父类抛出的异常类相同或为子类;
(4) 子类重写方法的访问权限应该比父类方法的访问权限相同或更大;
(5) 子类重写的方法与父类方法要么都是类方法,要么都是成员方法;
(6) 如果子类中定义了与父类同名的成员变量,父类的该变量(能被继承)将被覆盖并且子类覆盖父类成员变量不受数据类型和 访问控制符控制;
8.3 super 关键字
super 两种通用形式 : 第一种用来访问被子类的成员隐藏的父类成员;第二种就是可以调用父类的构造器;
1 使用super调用父类成员
super.<成员变量名>;
super.<成员方法名> ( [实参列表]);
2 使用super调用父类构造器
super ( 调用参数列表 ) ; super 调用直接父类构造器;
9 多态性
Java多态定义 : 不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用不同的行为方式;
Java实现多态的三个必要条件 : 继承父类,重写父类方法,向上转型;
只有子类重写父类方法才可能出现多态,子类覆盖父类的成员变量则不具备多态的特征;
9.2 引用变量的强制类型转换
成员变量不具备多态性,即使父类变量指向了子类对象,但是调用的永远都是编译时类型中的变量,同样,引用类型的变量也只能调用它编译时中具有的方法,而不能调用它运行时类型中具有但编译时类型不具有的方法;
如果要让引用变量调用它运行时类型新增的方法,则需要对该变量进行强制类型转换;
强制类型转换 的格式 : (Target Type ) variable;
强制类型转换需要注意两点:
(1) 基本类型之间的转换只能在数值之间进行,数值类型和布尔类型不能进行类型转换;
(2) 引用类型之间的转换只能在具有继承关系的两个类型之间转换;将父类强制转换成子类对象时,父类变量所指向的对象必须是子类对象;
系统默认支持将表数范围较大的类型转换成表数范围小的类型;
系统默认支持子类类型转换成父类类型;
9.3 instanceof 关键字
表达式 : VariableName instanceof TypeName ; 返回值类型为Boolean;
Type Name 为类名或接口名;
用来判断VariableName 是否为Type Name 类对象或子类对象,或接口的实现类的对象;
VariableName 变量在编译时的类型要么与TypeName类名相同,要么为TypeName类的子类,要么为TypeName接口实现的类;