第2章 类与对象
第2章 类与对象
2.1 面向对象方法的特性
- 面向对象方法的特性:抽象、封装、继承、多态;
抽象:忽略问题中与当前目标无关的方面,只关注与当前目标有关的方面;
封装:利用抽象数据类型将数据和基于数据的操作封装在一起;
继承:基于已有类产生新类的机制;(超类/基类/父类->子类/派生类);
Java语言仅支持单继承;
多态:超类和子类的对象可以响应同名消息而方法不同。
2.2 类声明与对象创建、数据成员、方法成员
- 类是对一类对象的描述,对象是类的具体实例;
定义对象过程:声明引用变量、创建对象;
引用变量可以被赋值空值; - 数据成员声明:
public、protected、private访问控制符;
static静态成员变量(类变量);
final变量的值不能被修改;
transient变量是不需要序列化的;
volatile共享变量。 - 默认的toString()返回:getClass().getName() + “ @” + Integer.toHexString(hashCode())
- 类变量(静态变量):用static修饰,在整个类中只有一个值,类初始化时就被赋值;
- 方法声明:(public/protected/private、static、final同成员)
abstract抽象方法;
native用来集成java代码和其他语言的代码;
synchronized用来控制多个并发线程对共享数据的访问; - 在类体内部,方法和方法之间可直接互相调用,直接用方法名;
实例/类方法调用时参数传递:值传递,引用传递;
类方法(静态方法):可以通过类名/实例名直接调用,不能声明为抽象的;
类方法可用于很多不需构造对象/实例的简单问题; - 可变参数使用省略号表示,其实质是数组 String…s表示String[] s;
可用增强for循环处理;
2.3 包、类的访问权限控制
- 包:一组类的集合,可包含若干个类或若干个包;
包的作用:
相关源代码文件组织在一起;
类名的空间管理;
提供包一级的封装及存取权限; - Java中包名使用小写字母表示;
命名方式建议将机构的Internet域名反序作为包名的前导,不可用、冲突字符等用下划线; - 一个Java源代码文件称为一个编译单元,三部分:
所属包的声明、Import包的声明、类和接口的声明;
一个编译单元中只能有一个public类,该类名与文件名相同;
经过编译每个类都会产生class文件; - 包名就是目录名,目录名不一定是包名;
引入包:import;
Java编译器自动引入java.lang; - 静态引入:单一引入,全体引入;引入后在程序中使用不用带类名。
- 同一包中的类:都可访问;
不同包中的类:public类型可被访问; - 类的成员访问控制:
public:都可;
protected:包内或子类;
默认:包内;
Private:同类; - 常用公有方法:get方法:获取成员值;set方法:设置成员值;
- this关键字:如果方法内的局部变量名与实例变量名相同,方法内访问实例变量时需要this关键字;
2.4 对象初始化、内存回收
- 构造方法:方法名与类名相同,不定义返回类型,通常被声明为公有,任意多个参数,完成对象的初始化工作,不能在程序中显式调用,未声明时会隐含生成;
- 默认构造方法:没有参数(内部类除外),方法体为空;如果类声明中没有给实例变量赋初值,对象的属性值为零或空;
- 构造方法传递初始值进行初始化;
构造方法可以被重载; - 只要显示声明了构造方法,编译器就不再生成默认构造方法;(可以显示声明无参数方法)
- 使用this关键字在一个构造方法中调用另外的构造方法;通常用参数个数少的调用个数多的;
- 常量:final
实例变量在类中定义或构造方法结束前初始化;
类变量必须在声明同时初始化; - 无用对象:离开了作用域的对象;无引用指向对象;
- Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存;
自动调用finalize()方法(可能在任何时机以任何次序执行);
垃圾收集器:自动标记不再使用的对象,作为后台线程运行,通常在系统空闲时异步执行;
2.5 枚举类
- 枚举类enum,隐含继承java.lang.Enum;
- 枚举类构造方法必须是包内私有或私有,不能显式调用(在初始化时即构造);
values()方法返回枚举值数组;
toString()返回枚举值字符串描述;
valueOf将以字符串形式表示的枚举值转化为枚举类型对象;
Ordinal获得对象在枚举类型中的位置索引;
2.6 应用举例、本章小结
- 控制输出格式
java.text.DecimalFormat(“$0.00”).format(balance));
编程练习题
1. Rectangle类
题目
1、定义两个成员变量height和width,表示矩形的长和宽,类型为整型 2、定义一个getArea方法,返回矩形的面积 3、定义一个getPerimeter方法,返回矩形的周长 4、在main函数中,利用输入的2个参数分别作为矩形的长和宽,调用getArea和getPermeter方法,计算并返回矩形的面积和周长
输入:
输入2个正整数,中间用空格隔开,分别作为矩形的长和宽,例如:5 8
输出:
输出2个正整数,中间用空格隔开,分别表示矩形的面积和周长,例如:40 26
思路
按要求编写Rectangle类即可。
代码
import java.util.Scanner;
class Rectangle {
int height, width;
int getArea() {
return height * width;
}
int getPerimeter() {
return 2 * (height + width);
}
}
public class homework2_1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in