面向对象程序设计概要
与C++面向对象思想相同。
面向过程与面向对象的区别:
面向对象设计的优点:
面向对象的三大特性:封装性、继承性、多态性
类、对象、消息的概念:
类(对象)之间的关系:
1.Java类与对象基础
- 类是组成Java程序的基本要素,既是组织程序代码的基本单位,也是面向对象程序设计的主体。
- Java运行时系统通过自动垃圾回收机制周期性地清除无用对象,释放内存。
- 其他同C++
2.Java类与对象扩展
2.1 构造方法(有时候又叫“构造器”)
相当于C++的构造函数
完成的是对象初始化的工作
2.2 垃圾回收机制
- 垃圾回收机制GC(Garbage Collection)是Java语言的核心技术之一。
- GC通过确定对象是否被活动对象引用来确定是否收集该对象。
- 垃圾收集的一个潜在的缺点是它的开销影响程序性能。
- 终结处理方法finalize()(Java 9已经弃用)
- 在垃圾收集器将对象从内存中清除出去之前做必要
的清理工作,是在垃圾收集器删除对象之前对这个
对象调用的。 - 不是C++中的析构函数,不能将作为通用的清理方
法。 - finalize与Java垃圾回收器的区别:不仅仅做内存
回收,还有其他处理,如擦去屏幕上的画的图片。
- 在垃圾收集器将对象从内存中清除出去之前做必要
2.3 static关键字
- 用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化。
- 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static中不能访问非static的成员。
- 用static声明的成员变量为类变量,不用static声明的成员变量为实例变量。
- 存储区别:类变量由多个对象实例共享一个内存区,共享同一个值;实例变量各自有各自的内存区,对于不同的对象实例而言,其对应的变量成员有不同的值。
- 访问区别:类变量既可以通过对象实例名访问,也可以通过类名直接访问;实例变量必须在生成对象实例后通过对象实例名来访问。
- 用static声明的方法为类方法,不用static声明的方法成员为实例方法。
- 在类方法不再是针对某个对象的调用,所以不能访问非静态成员。可以不生成类对象而直接通过类名访问类方法。
2.4 成员初始化次序
如下例:
- public类(主类)为StaticInitialization,先初始化其静态成员,即先初始化Table t2
- 到Table中仍然是先初始化静态成员,因此先后初始化1,b2,然后执行Table(),其中又有f(1)
- 然后初始化Cupboard t3,其中又是先初始化其静态成员,Bowl b4,Bowl b5,接着初始化其非静态成员Bowl b3,然后执行Cupboard(),其中又有f(2)
- public类的成员变量都初始化完了,开始执行main里的语句
- Cupboard的静态成员已经初始化过了,此时只需初始化非静态成员Bowl b3,然后执行Cupboard(),f(2)
- 之后同理
3.包:库单元
3.1 命名空间
- Java引入了包(package)的机制,以提供类的多重命名空间,同时也负责类名空间管理。把因不同目的和不同工作而开发的类放在不同的包中,即使在出现相同的类名的时候,也可以很好地管理。包可以有一定的层次,对应着外存上的目录结构。
- 为了区别于各种平台Java中采用了“.”来分隔目录,与域名地址不同的是,Java将主类从左侧写起。
- Java中提供了大量的包(类库),如java.util、java.lang、java.swing,也可以建立自己的包。
3.2 package
- package语句放在Java源程序文件的第一行,指明该文件中定义的类存放到哪个包中,因此显然package语句只能有一条。程序中没有package语句,此时类将存放到默认包中。
- 描述包的字符都用小写,内容要与文件系统中的内容对应。
3.3 import
- import语句的作用是引入所需的类,以供在程序中使用类库中现有的类。
- import语句在程序中放在package语句之后,类定义之前。一个Java源程序中可以有多条import语句。
- 要用java.util中的其他类(可以使用*表示所有的类)import java.util.*
- 可能多个包中有相同的类名,所以要指明,以避免冲突
4.Java标准类库
Java 有一系列功能强大的类库,功能相关的可重用类被组织成包。可重用类的继承层次和包的组织呈树型结构。我们在进行编程时要首先考虑如何充分利用已有可重用类来构造自己的新类。因此,了解和掌握Java可重用类是学习Java 程序设计的重要内容。
常用库:
- java.lang包:提供了Java程序设计中最基础的类。如常用的String 类、Object 类等。
- java.util包:包括许多具有特定功能的类,如Arrays,Date,Calendar 和Stack 等。
- java.io包:主要包含与输入输出相关的类,这些类提供了对不同的输入和输出设备读写数据的支持。
- javax.swing包:提供了创建图形用户界面元素的类。该包中包含定义窗口、对话框、按钮、复选框、列表、菜单、滚动条及文本域的类。
- java.net包:包含与网络操作相关的类,如URL、InetAddress 和Socket 等。
4.1 java.lang包和java.util包
- java.lang 包由解释程序自动加载,不需在程序中显式地使用语句import java.lang.*。
- 提供常用的类、接口、一般异常、系统等编程语言的核心内容
- 提供常用的类、接口、一般异常、系统等编程语言的核心内容
4.2 java.lang.Object类
4.3 java.lang.System类
4.4 java.lang.Math类
4.5 基本数据类型的封装类型
Java中一切都是对象,基本数据类型也被封装成对应的类
(1)Integer类
(2)Float类
(3)Character类
(4)Boolean类
4.6 String类与StringBuilder类、StringBuffer类
(1)String类
(2)StringBuilder类、StringBuffer类
区别如下图:
- String类执行s1=s1+s2实际上是在堆中创建了一块新空间,存放"helloworld",然后s1引用了新空间
- StringBuilder类执行s1.append(s2)是直接改变了原空间存储的内容
- 对于经常修改的字符串,StringBuilder的运算时间远远好于String