前言
本文是结合《Java程序设计》(黄岚、王岩、王康平)的摘要与上课ppt的笔记。
Java类与对象
3.1 面向对象的基本概念
- 封装性
- 继承性
- 多态性
3.2 Java类
3.2.1 类的定义
[public] [abstract|final] class classname{
classbody
}
- public是类的访问权限,表示公有类,要求该类所在的文件名与此类名相同。
- 一个程序文件中最多包含一个公有类,缺省public的类表示普通类。
3.2.2 变量成员与方法成员
- 变量成员的定义和访问
- 变量成员的基本声明格式:
[public|protect|private][static][final][transient][volatile]type variableName
- 对象可以包含另一个对象
- 方法成员的定义和访问
- 方法成员的基本声明格式:
[public|protected|private][static] returnType methodName([paramList]){
//methodBody}
- static成员(静态成员)
- 静态成员变量也称为类变量,类变量由多个对象实例共享一个内存区
- 类变量既可以通过对象实例名访问,也可以通过类名直接访问
- static修饰的成员变量或者成员方法,将不再与具体的类对象相关
- Java在类方法中不能使用this和super
3.2.3 访问控制符
访问权限的大小关系:public>protected>默认(包访问权限)>private
- private控制符修饰的成员只能在它自己的类中被访问
- protected控制符修饰的成员能在它自己的类中和继承它的子类中被访问
- public可以被任何类访问
- 包访问权限指的是同一个包中的所有类可以访问
访问控制权限:
作用范围 | public | protected | 默认 | private |
---|---|---|---|---|
同一类 | yes | yes | yes | yes |
同一包中的类 | yes | yes | yes | |
不同包中的子类 | yes | yes | ||
不同包中的非子类 | yes |
3.2.4 构造方法
- 在Java中,通过提供构造方法,类的设计者可以确保每个对象都会被初始化
- 构造方法与类同名
- 不接收任何参数的构造方法叫做默认构造方法
- 一个类可以不定义构造方法,在这种情况下,类中隐含定一个方法体为空的默认构造方法,当且仅当类中没有明确定义任何构造方法时才会自动提供它
- 构造方法没有返回类型,连void都没有
- 构造方法是在创建一个对象使用new操作符时调用,构造方法的作用时初始化对象
3.2.5 终结处理方法
- 对于非new创建的特殊内存区域,使用finalize()的方法
3.3 Java对象
3.3.1 对象的创建
type objectName = new type([paramList])
- new运算符为其分配内存空间
- 继承时,父类的数据类型等级更高
Java程序运行时的6个存储位置:
- 寄存器:速度最快,由编译器分配,程序员没有控制权
- 栈:通过堆栈指针控制内存的使用释放,需要知道数据相应的生命周期以控制指针;栈用来存放基本类型的数据和对象的引用
eg:windows为一个写好的类
windows w1=new windows();
————w1放在栈中,w1存储的实际是new windows()生成的对象在堆中的地址
————new windows()生成的对象放在堆中
- 堆:不需要知道数据的生命周期,会自动分配与清理相应内存,存放所有的java对象
- 静态域:存放static定义的静态成员
- 常量池:常量值直接存放在代码内部
- 非RAM存储:数据完全存放于程序之外,eg:流对象和持久化对象
3.3.2 对象初始化
基本类型 | 默认值 |
---|---|
boolean | flase |
char | NULL |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
3.3.3 成员初始化次序
- 最先初始化静态(static)成员,静态成员只在第一次访问时初始化一次(static修饰的变量称为类变量,其他的叫做实例变量)
- 变量定义的先后顺序决定了变量之间的初始化的顺序
- 最后再是调用对应的成员方法
3.3.4 垃圾回收机制
Java虚拟机(JVM)的一个系统级线程会自动释放没有对象指向的内存块。
判断依据:
- 引用计数
- 对象引用遍历
3.4 包:库单元
3.4.1 命名空间
- 为了区别于各种平台,java中采用了"."来分割目
3.4.2 package语句
- package语句放在java源程序文件的第一行
- 编写java源代码文件(编译单元)时,最多只有一条package语句
3.4.3 import语句
- 写在package之后
3.5 Java标准类库
3.5.1 Java常用包:java.lang包、java.util包
- java.lang:java程序中最基础的类
- java.util:包括许多具有特定功能的工具类
- java.io:主要包含与输入和输出相关的类
- java.swing:提供了创建图形用户界面元素的类
- java.net:包含与网络操作相关的类
- java.Applet:包含控制HotJava浏览器的类
3.5.2 Object类
- object类是所有java类的基类
- 可以使用类型为Object的变量引用任意类型的对象
3.5.3 System类
- System不能被实例化,所有的方法都可以直接引用
3.5.4 Math类
- Math类包含在java.lang包中,包含完成基本数学函数所需的方法,这些方法是静态的,不用申明具体的实例
- Math类中声明了两个double类型的常量:Math.PI Math.E
3.5.5 String类、StringBuffer类和StringBuilder类
- java中的String类的一大特点是:String类中每一个看起来修改String值得方法,实际上都是创建了一个全新的String对象(包含修改后的字符串内容),并未改动最初的String对象,只是不能再访问最初的对象了
String不提供方法处理字符串内部,并且我们可以从上述语句看到String对于空间和时间的消耗很大,所以StringBuffer类和StringBuilder类进行了改进
- StringBuilder类能够直接在原有的对象后追加新内容,用于字符串缓冲区被单个线程使用的时候,大多数时间下使用这个类,最快。
- StringBuffer类是线程安全的