面向对象是 Java 最重要的特性。Java 是彻底的、纯粹的面向对象语言,在 Java 中“一切都是对象”。本章将介绍面向对象基础知识。
面向对象
面向对象的开发过程: 其实就是不断的创建对象,使用对象,指挥对象做事情。 面向对象的设计过程: 其实就是在管理和维护对象之间的关系。
面向对象的特征:
Java中用类 Class 来描述事物.是具体事物的抽象,概念上的定义。
类定义包括类声明和类体两部分,类定义的语法格式如下:
[public][abstract|final] class className [extends superclassName] [implements interfaceNameList] {类体}
创建对象及访问对象成员
type objectName;
声明对象并不为对象分配内存空间,而只是未存储对象的地址分配内存空间new 类的构造方法();
修饰符 1 修饰符2... 返回值类型 方法名(形参表) [ throws 异常列表 ] { }
其中返回值是方法在操作完成后返还调用它的环境的数据,形式有2种:
方法的特点: 将功能代码进行封装,便于对该功能进行调用。只有被调用才被执行,提高了代码的复用性. (注意不能在函数的内部定义方法) 。
mybatis 的 SQL 操作方法签名不支持重载。
不允许子类方法的访问修饰符比父类有更多的限制。例如:子类不能将父类的 public 方法定义为 protected 方法。但可以将父类的 private 方法在子类中重新定义为 public 方法.通常将子类方法访问修饰符与父类保持一致.
作用: 给对象进行初始化
一个类默认有一个空参数的构造函数,这个构造函数的权限与所属类一致. 如果类被 public 修饰,则默认的构造函数也被 public 修饰.总之默认构造函数的权限是随着类而变化.
在创建对象时,要给对象的属性成员分配内存空间,同时进行初始化。
声明类体中成员变量语法格式如下:
[public | protected | private ] [static] [final] type variableName; //成员变量
[public | protected | private ] [static] [final | abstract] [native] [synchronized] type methodName([paramList]) [throws exceptionList] { //方法体 }
用 static 修饰的属性是属于类的静态属性, 相应的成员变量为类变量
用 static 修饰的方法称为静态方法,也叫类方法. 在 static 方法中只能处理类变量,也可访问其它 static 方法,但不能访问任何归属对象空间的变量或方法. 而非静态成员变量和方法却可以访问静态资源.
tip: 创建某个工具类, 可只提供相应的静态方法, 进一步为了让某个类不能创建对象, 可以私有化构造函数.
出现在类的实例方法或构造方法中,this 代表所在函数所属对象的引用。用 this 作前缀可访问当前对象的实例变量或成员方法.
super关键字则和 this 差不多,都是一个引用指向自身和上一级父类罢了.
this()构造的此类用法, 可以减少构造的一些重复代码
public Msg() {
this(0, null, -1);
}
public Msg(int no) {
this(no, null);
}
public Msg(int no, String str) {
this(no, str);
}
所以加载顺序中: 属性显示初始化 早于
构造代码块初始化 早于
构造函数初始化
与之类似, 静态属性显示初始化 早于
静态构造代码块初始化
在 Java 中为了防止类、接口、枚举和注释等命名冲突引用了包(package)概念,包本质上命名空间(namespace)。在包中可以定义一组相关的类型(类、接口、枚举和注释),并为它们提供访问保护和命名空间管理。
package 语句定义包,package 语句应该放在源文件的第一行,在每个源文件中只能有一个包定义语句,并且 package 语句适用于所有类型(类、接口、枚举和注释)的文件。定义包语法格式如下:package pkg1[.pkg2[.pkg3…]];
Java API简介: Java 中按包来组织类.包的组织采用分层结构,与文件系统中的目录的组织对应一致.通常将逻辑相关的类放在同一个包中。 包将类的命名空间进行有效划分,同一包中不能有两个同名的类. Java 系统提供的类库也成为Java API, 是系统提供的已实现的标准类的集合。
创建包就是在指定目录路径下创建一个子文件夹,这个包中所有类的字节码文件将存放在该文件夹下。
方法1: 创建一个 test 子目录,将源程序文件存放到该目录,在该目录下利用javac编译源代码,或者在别处编译完程序后将字节码文件拷贝到该目录即可。
方法2: 采用带路径指示的编译命令: 格式:javac –d destpath Point.java
编译器将自动在 destpath 指定的目录下建一个test子目录,并将产生的字节码文件保存到该子目录下 。典型用法是源程序放在当前目录下, 用如下命令编译 javac –d . Point.java
。编译后将在当前目录自动创建 test 子目录
同一个包下的类之间互相引用是不需要包名的,可以直接使用。但如果类不在同一个包内,则必须要知道其所在的包。
*
号代替类名位置。 它将加载包中的所有的类。例:import java.util.*;
import static java.util.Arrays.*;
。但是注意静态导入不应过度使用,否则难以区分访问的是哪个类的代码。Java 面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有
Java类成员的访问控制
提示 访问类成员时,在能满足使用的前提下,应尽量限制类中成员的可见性,访问级别顺序是:私有级别→默认级别→保护级别→公有级别。
为方便使用第三方代码,也为了方便我们写的代码给其他人使用,各种程序语言大多有打包的概念,打包的一般不是源代码,而是编译后的代码。打包将多个编译后的文件打包为一个文件,方便其他程序调用。
在Java中,编译后的一个或多个包的Java class文件可以打包为一个文件,Java中打包命令为jar,打包后的文件扩展名为.jar,一般称之为jar包。
可以使用如下方式打包,首先到编译后的java class文件根目录,然后运行如下命令:
jar -cvf hello.jar <最上层包名>
从Java 源代码到运行的程序,有编译和链接两个步骤。编译是将源代码文件变成扩展名是.class的一种字节码,这个工作一般是由 javac 命令完成的。链接是在运行时动态执行的,.class 文件不能直接运行,运行的是Java虚拟机,虚拟机听起来比较抽象,执行的就是 Java 命令,这个命令解析 .class文件,转换为机器能识别的二进制代码,然后运行。所谓链接就是根据引用到的类加载相应的字节码并执行。
Java编译和运行时,都需要以参数指定一个classpath,即类路径。类路径可以有多个,对于直接的class文件,路径是class文件的根目录;对于jar包,路径是jar包的完整名称(包括路径和jar包名)。
总结来说,import 是编译时概念,用于确定完全限定名,在运行时,只根据完全限定名寻找并加载类,编译和运行时都依赖类路径,类路径中的 jar 文件会被解压缩用于寻找和加载类。
对象不再使用时应该销毁。C++ 语言对象是通过 delete 语句手动释放,Java语言对象是由垃圾回收器(Garbage Collection)收集然后释放,程序员不用关心释放的细节。自动内存管理是现代计算机语言发展趋势,例如:C# 语言的垃圾回收,Objective-C 和 Swift 语言的 ARC(内存自动引用计数管理)。
垃圾回收器(Garbage Collection)的工作原理是:当一个对象的引用不存在时,认为该对象不再需要,垃圾回收器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。