一. 什么是抽象
从特定的角度出发,从已经存在的一些事物中抽取所关注的特性,行为,从而形成一个新的事物的
思维过程,是一种从复杂到简洁的思维方式。
二. 对象和类的关系
-
对象有两方面的定义:状态和行为。
对象可以定义为包含状态和行为的一个实体,对象(Object)也称为实体(instance); -
实体:存在于客观世界中并且可以与其他物体区分开的物体,实际存在的个体。
-
对象:人们要进行研究的事物,任何事物都可以认为是对象。
-
对象具有状态和行为。
-
对象可以抽象成类。
-
-
类:
具有相同特征(状态)和功能(行为)的对象的抽象就是类。
对象的抽象就是类,类的具体化就是对象。- 类具有的特性:对象的状态,用成员变量来描述。
- 类具有的功能:对象的行为,用方法来描述。
-
类是对象的类型/模板。创建一个对象,就是使用一个类作为构建该对象的基础。
描述类少不了对象,描述对象也少不了类。
对象是类的实例,类是对象的模板。
三. 类的定义
[修饰符] class 类名{
0-N个成员变量(字段/Field); 这不是属性
0-N个方法
}
![image][definition]
- 定义类注意:
- 如果类使用了public修饰符,必须保证当前文件名称和当前类名相同。
- 类名使用名称表示,类表示某一类事物,首字母大写,驼峰表示法
- 专门为描述对象提供一个类,该类不需要main方法。
四.对象的基本操作
- 根据类来创建对象的语法
类名 变量 = new 类名();
- 给字段设置值
对象变量.字段名 = 该类型的值;
- 获取字段的值
该字段类型 变量 = 对象变量.字段值;
- 通过对象调用方法
对象变量.方法(实参);
//菲佣类型,描述了菲佣对象,包括菲佣的状态和行为
class Servant
{
String name;//姓名
int age;//年龄
void shopping(){
System.out.println("买菜....");
}
void cook(){
System.out.println("做饭....");
}
void wash(){
System.out.println("洗碗....");
}
}
//程序员
class Coder
{
void coding()
{
System.out.println("疯狂地写代码!!");
}
}
//Servant的测试类
class ServantDemo
{
public static void main(String[] args)
{
//创建一个菲佣对象
Servant s1 = new Servant();
s1.name = "小红";
s1.age = 19;
//打印姓名和年龄
System.out.println(s1.name + " " + s1.age);
s1.shopping();
s1.wash();
s1.cook();
//创建程序员对象
Coder c = new Coder();
c.coding();
}
}
五.内存分析-对象的实例化过程
![image][initial]
六.对象的打印和比较
- 对象打印:
- System.out.println(s1);
Servant@21e8bf76 - 打印的是 :类的名称@十六进制的hashCode
- 打印数据,应该使用Object的toString方法
- System.out.println(s1);
- 对象比较操作:
- ==号:对于基本数据类型来说比较的是值。
对于引用对象来说比较的是内存中的地址值。
每次使用new关键字,都表示在堆中新开辟一块内存空间。不同空间,地址不同。 - 比较数据,应该使用Object的equals方法
- ==号:对于基本数据类型来说比较的是值。
- 对象的生命周期:
- 使用new关键字会在内存中开辟新的空间,此时对象开始存在。
- 当堆中的对象没有被任何变量引用时,该对象就会成为垃圾,就等值GC回收。
- 当GC回收对象时,对象销毁。
- 匿名对象:
- 没有名称的对象,创建对象之后没有赋值给某一个变量。
- new Servant();//匿名变量,在堆中开辟新的内存空间,没有把该空间赋值给变量
因为没有名称,匿名对象只能使用一次,一般把匿名对象作为方法的实参传递。
七. 学生缴费案例
学生类(Student)有两个字段:名字(name)和是否缴费的状态(isFee),有一个缴费方法
(fees)。每一个学生都是通过Student类new出来的一个对象,现在创建一个数组存放多个学生对象,再判断数组中的学生是否已经缴费,如果没有,则调用的缴费方法。
新建StudentDemo.java
//描述学生对象
class Student
{
String name;//姓名,默认为null
boolean isFee;//缴费状态,成员变量的boolean默认值为false
void fees(){
isFee = true;//设置为已经缴费
}
}
class StudentDemo
{
public static void main(String[] args)
{
//创建学生对象
Student s1 = new Student();
s1.name = "装三";
s1.isFee = true;//已经缴费
Student s2 = new Student();
s2.name = "里斯";
Student s3 = new Student();
s3.name = "李四";
Student s4 = new Student();
s4.name = "无聊";
//创建一个数组,用于储存所有的学生对象
Student[] arr = new Student[]{s1,s2,s3,s4};
//使用循环迭代数组中的每一个元素
for (Student std : arr )
{
System.out.println("姓名:" + std.name + " 状态:" + std.isFee);
if (!std.isFee)
{
std.fees();
}
}
System.out.println("-----------");
//使用循环迭代数组中的每一个元素
for (Student std : arr )
{
System.out.println("姓名:" + std.name + " 状态:" + std.isFee);
}
}
}