1、类和对象
类(class)和对象(object)是面向对象方法的核心概念。
类是对一类事物描述,是抽象的、概念上的定义;
对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
- 面向对象开发(OOA)就是不断的创建对象,使用对象,指挥对象做事情。
- 面向对象设计(OOD)其实就是在管理和维护对象之间的关系。
- 面向对象特征:封装(encapsulation)、继承(inheritance)、多态(polymorphis)
- 面向对象程序设计的重点是类的设计;
类的设计,其实就是类的成员的设计
2、类
常见的类的成员有:
- 属 性:对应类中的成员变量
(1)语法格式:
修饰符 数据类型 属性名 = 初始化值 ;
(2) 修饰符
常用的权限修饰符有:private、缺省、protected、public
其他修饰符:static、final
(3)数据类型 :任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
(4)属性名:属于标识符,符合命名规则和规范即可。
(5)变量的分类:成员变量(方法体外)与局部变量(方法体内)
- 行 为:对应类中的成员方法(详见13)
类的定义:
修饰词 class 类名{
属性声明;
方法声明;
}
创建Java自定义类步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
3、对象
创建对象语法:
类名 对象名 = new 类名();
访问对象成员(包括属性和方法)的方式:
对象名.对象成员
说明:
- 一个类可以创建N 个对象,成员变量只属于当前的对象(只属于对象,不属于类),只有通过对象才可以访问成员变量,通过类不能直接访问成员变量;
- 如果创建了一个类的 多个对象,对于类中 定义的属性,每个对 象都拥有各自的一套 副本,且互不干扰。
- 对象的属性存储在堆内存,栈内存内存储对象在堆内的地址。当遇到创建对象就去方法区的class区查找所需要的对象的class文件,如果找到了 就直接使用,否则就通知类加载器去硬盘将所使用的class文件加载进来。如果累加器在硬盘也没有找,那就报错。
- 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。
匿名对象:
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这 样的对象叫做匿名对象。 如:
new Person().shout();
使用情况 :如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。
4、类的访问机制
(1)在当前类访问
- 在当前类中访问成员属性/方法(没有使用static修饰的属性或方法),直接访问
(2)在其他类中访问
- 在其他类中访问该类的成员,是不能直接访问的
- 访问方式:
① 创建该类对象 new 类名()
② 使用该对象来访问该类的成员 对象名.属性名/方法名
如果成员方法中有参数,需要在调用的使用传入对应类型的实参
5、有关的内存使用
- 堆(Heap),此内存区域的唯一目的 就是存放对象实例,几乎所有的对象 实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。
- 栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。 局部变量表存放了编译期可知长度的 各种基本数据类型(boolean、byte、 char 、 short 、 int 、 float 、 long 、 double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释放。
- 方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6、例子
public static void main(String[] args) {
Person obj = new Person(); //对象
obj.age = 5;
System.out.println("修改之前age = " + obj.age);// 5
// x是实参
change(obj);
System.out.println("修改之后age = " + obj.age);// 3
}
public static void change(Person obj) {
System.out.println("change:修改之前age = " + obj.age);
obj.age = 3;
System.out.println("change:修改之后age = " + obj.age);
}
//Person类定义为:
class Person{
int age;
}