Java核心技术读书笔记4-2 类与对象
2.类
2.1 类:
类是构造对象的蓝图或模板,由类构造对象的过程称为创建类的实例。一个Java源文件中只能有一个公有类,但可以有任意数目的非公有类。如果一个类中包含其他的类,在编译该类时会自动寻找引用类的class文件,若没有则会自动进行编译。
2.2 对象:
对象在类中的全局变量称为实例域,操纵数据的过程称为方法,每个类的实例对象都有一组特定的实例域值,这些值的集合称为这个对象当前的状态。每个对象还具有唯一的标识。
所有Java对象都存储在堆中
2.3 封装:
隐藏对象数据的实现方式,只对外界提供定义好的使用数据的方法以允许操作类中的实例域。(域定义为private,提供getter和setter方法)
封装的一些优点:
·如果需求变更需要对域的设置做修改,那么只需修改getter方法而不用在代码中修改所有该域出现的地方。
·便于维护,getter方法中可以控制对域的赋值检查而不用在流程代码中进行控制。
·域值出错时方便定位,不用检查是哪里的代码对域值改动造成的。
2.4 继承:
继承即扩展一个类来建立一个新的类,新类具有被扩展类的全部公共和保护属性和方法。
2.5 识别类的关系:
依赖("uses-a"):类A中的方法操纵了类B的对象:类A依赖类B。应尽量减少类的依赖
聚合("has-a"):类A中的域含有类B对象:类A包含类B。
继承("is-a"):类A扩展了类B:类A继承类B。

3.使用预定义类
3.1 对象变量和对象引用:分清楚变量和引用
Date deadline = new Date(); //deadline为一个变量,new Date()为一个新对象,通过"=",使这个变量引用了新对象。
deadline = null; // 意为该变量没有引用任何一个对象。
4.创建自定义类
4.1 this关键字
在调用方法时,调用者为隐式参数。方法内参数为显式参数。
如:a.getConn(fileName); //a为隐式参数,fileName为显示参数。
可以在方法内部用this关键字获得隐式参数。(静态方法没有this参数)
4.2 final实例域:被final关键字修饰的域在初始化后便不可更改。
4.3 方法参数与调用
对于程序设计语言有一些将参数传递给方法的术语:
按值调用:参数将变量的值传递到方法内部,即在方法内部的接收变量是创建的一个相同变量,然后将参数的值赋给他。
按引用调用:参数传递地址到方法内部,接收变量与参数变量地址相同。
4.4 Java程序设计语言总是按值调用,详见https://www.cnblogs.com/zjq-blog/p/15370908.html
5.对象构造
5.1 构造器:仅当类没有任何构造器时,系统才会提供一个无参构造器。
5.2 初始化块:在类中表示为两个大括号内的内容,在调用任何一种构造器之前执行。
5.3 静态块:在类第一次加载到虚拟机时执行。
class Employee{
private static tag;
private String name = "";
static{
tag = "雇员类";
}
{
name = "default name";
}
public Employee(){
this.name = "初始化成功";
}
}
在类被加载到虚拟机时(即使用Class.forName("Employee");加载类或者有使用到该类时):
0.执行静态块内代码 tag = "雇员类";
在调用new Employee();构造对象时,程序的执行顺序为:
1.构造域 name
2.执行初始化语句 name = "";
3.执行初始化块内代码 name = "default name";
4.执行构造器内部代码
5.4 对象析构与finalize方法:finalize()方法继承自Object,在该对象被垃圾回收前调用。但是他不是C/C++的析构函数,因为在调用他时,其内部代码并不能保证回收前一定执行完,即有太大的不确定性。所以应该谨慎使用,更不应该把资源关闭的代码写在这里面。
6.包
6.1 所有Java类默认导入java.lang.\,同一个包中的所有文件与类可以直接使用,不同包只能导入public类*
6.2 使用通配符*导入所有本级包:如 import java.util.* 不会对代码的大小产生影响。但需要注意,*号只能作用于该包结构的最后一层上。
6.3 无论怎么引入包,JVM加载包时都会使用完整的字节码。
6.4 Java编译器可以查看别的类内部,即可使用完整的类名使用类而不需要引入包。 但在C++中,只能通过#include引入外部特性声明。与C++中的namespace和using类似的是package和import机制。
6.5 import后接static可以导入一个类的静态方法和静态域。
import static java.lang.System.*
...
out.println("直接使用静态域out");
6.6 使用命令行编译和运行含有包名的Java Java源文件含有包名:package com.package1...packagen
进入到com文件夹所在的目录下
1.编译:javac com/package1/..packagen/MyProgram.java
2.运行:java com.package..packagen.MyProgram
编译时使用"/"分隔目录层级与文件名,运行时使用"."代表包
注意:运行时,字节码文件必须在相应包的目录下。
7.类路径
7.1 类的存储
类存储在文件系统的子目录中且类的路径必须与包名匹配。
类文件也可以存储在JAR(Java归档)文件中,在一个JAR文件中,可以包含多个压缩形式的类文件和子目录。jar文件作为class目录时代表一个最高一级的根目录。如
E:\MyClassPath\ProjectFloder
E:\MyJARFilePath\sample.jar
如果想要设置java命令能够自动加载字节码,可以设置classpath系统变量

其中对于rt.jar和在jre/lib及jre/lib/ext下的一些其他JAR文件会自动加载,不需要设置。
JVM加载类文件的过程如下:
1.搜索jre/lib和jre/lib/ext下的归档文件(jar)和系统文件
2.查找classpath(系统变量或命令中-classpath/-cp指定: java -classpath E:/Test)中配置的路径
编译器(tools.jar)定位文件的过程如下:
1.若使用的类包含了全包名,那么在指定包目录下寻找文件
2.若未指定包名,则依次寻找import的包路径下的所有源文件,由于只能使用import引入外部包内源文件的public类,所以对于不同包的路径只去匹配public类就可以,同一包就需要依次遍历源文件来寻找。
3.若引用类文件比源文件旧,则需要重新编译。
浙公网安备 33010602011771号