把一头大象装进冰箱
面向过程
1.打开冰箱门
2.把大象装进冰箱
3.关闭冰箱门
把解决问题的步骤封装成若干个方法,然后依次调用这些方法
面向对象
1.生产一头大象
2.生产一台冰箱 具有功能:把大象装进冰箱
大象 冰箱
世界万物皆对象
类: 是描述一类事物的特征 泛指 抽象的概念
对象: 是类实例化和具体化的结果 特指 具体的事物
10几个对象
学生类的对象
人类的对象
男人类的对象 /女人类的对象
怎么描述一类事物的行为特征
属性:变量
行为:方法
用变量来记录事物的特征,用方法来描述事物的行为
人
属性:身高 体重 性别 年龄 ...
行为:吃饭 睡觉 学习 谈恋爱
写一圆类
属性: 半径
行为: 求面积 求周长
创建两个圆,分别求面积和周长
定义类:
位置: 在.java文件中定义类
修饰词 class 类名{
//属性
类型 标识符;
//方法 成员方法
修饰词 返回值类型 方法名(参数列表){
//方法体
}
}
实例化对象 创建对象:
new 类名();
声明引用变量 让这个引用变量 引用对象
Circle c; //创建一个引用变量
c = new Circle(); //实例化对象 c引用变量引用这个对象
基本数据类型: 值直接存储在变量里面
引用数据类型: 引用变量存储的是对象的地址信息
数组是引用数据类型
new int[3];
new Random()
new Scanner(System.in);
通过引用变量可以操作对象
引用变量.属性名
引用变量.方法名(参数列表);
实例化对象时 成员属性默认初始化
byte short int long 0
boolean false
char '\u0000' 空格
float double 0.0
引用变量 null
构造方法
以什么样的方式来构造对象 给属性赋初始值
构造方法名和类名相同 构造方法没有返回值类型 也不能为void
如果程序员没有给类实现构造方法,则编译器会自动生成一个无参的构造方法
如果程序员自己实现了构造方法,则编译器将不会再自动生成构造方法
class 类名{
构造方法
类名(参数列表){
}
}
方法重载:
在同一个作用域里,方法名相同,参数列表不同即构成重载
前提条件是同一个作用域
方法名相同
参数列表不同: 参数个数不一样 或者 参数类型不同
与返回值类型无关
在函数调用过程中,编译器会根据传递的实参的类型和个数来决定调用重载方法中的哪一个方法
重载方法 求最大值 max
参数情况:
2个int
3个int
2个double
int数组
double数组
实例化对象的过程 其实就是调用构造方法的过程
打
打车
打人
打篮球
打工
支付
现金
支付宝
微信
刷卡
学生类
属性有:
学号 姓名 年龄 成绩
按照不同的方式来构造学生(重载构造方法)
提供 显示信息的 方法
引用类型 引用变量 = 对象;
引用变量 = null; 表示没有引用具体的对象,这个时候如果通过该引用变量去访问属性和方法,都将导致java.lang.NullPointerException
this:
类的每一个成员方法里面都有一个this引用变量
构造方法里面,this引用的是正在构造的对象
普通成员方法里面 this引用正在调用该方法的对象
this可以区分成员属性 和 局部变量(形参)
写一个平面点类
属性有:x,y坐标值
构造方法
方法:距离原点的长度 Math.sqrt(x*x+y*y)
方法:一个点与另外一个点的距离
写一个平面圆类 (不要和之前的Circle同名)
属性: 中心点
半径
构造方法
方法:判断一个圆与另外一个圆是否相交
方法:判断一个圆是否在另外一个圆内部
面向对象思想
记录一个学生的信息
学号
姓名
年龄
...
//一组变量来描述学生信息 这三个变量没有任何关联 相互独立 不是一个整体
int id = 110;
String name = "张三";
int age = 18;
类: 用于描述一类事物的特征和行为
定义类的语法:
class Stu{
//声明属性
int id;
String name;
int age;
}
Stu s = new Stu();//s就是一个学生
s.id
s.name
s.age
Stu s1 = new Stu();
定义类的语法:
class 类名{
//定义变量 成员属性
//构造方法
方法名 和 类名相同 并且没有返回值类型 也不是void
如果自己不实现构造方法编译器将自动生成一个无参构造方法
一旦提供 编译器将不再自动生成
}
类可以实例化对象 new
类名 标识符 = new 类名(); 创建\实例化对象
int a = 10;
Stu s = new Stu();
实例化对象本质是上调用构造方法 初始化成员属性
java两种数据类型
基本数据类型: 变量存储的是值
引用数据类型: 变量存储的地址信息
写个员工类
员工号
姓名
工资
提供方法:
构造方法
给员工加工资的方法
显示员工的信息
创建两个员工
显示这两个员工的信息
给第一个员工加100
给第二个员工加500
再显示员工信息
图书类
属性
平面点类
class Point{}
平面直线段 类
class Line{}
属性:
开始点 Point p1;
结束点 Point p2;
构造方法
得到该线段的长度
判断两个直线段(延长)的是否相交
平面点类 平面圆类 点+半径
平面点类 平面线段类 两个点
酒店管理系统
类:
旅客类
属性: 姓名
房间类
属性: 房间号
旅客 guest null 表示无人入住
入住 guest = new Guest(name);
退房 guest = null;
class Room{
int id;
Guest guest; //null表示无人入住
}
酒店类
属性:
酒店名字
很多房间 几层 每层多少间 二维数组
1. 查看入住情况
2. 办理入住手续
3. 办理退房手续
4. 退出系统
基本数据类型变量 存储 值本身
引用数据类型变量 存储 的对象的地址信息
局部变量:
1.定义位置: 在方法里面
2.存储位置: 栈内存
3.生命周期: 当方法调用执行时该局部变量分配内存,当方法返回时,该局部变量会销毁
成员变量:
1.定义位置: 在类里面,方法外
2.存储位置: 堆内存
3.生命周期: 当对象实例化时分配内存,当该对象没有引用变量引用时会被回收
JVM对程序进行内存划分,分为三个区域:
方法区、栈区、堆区
方法区:存储 代码 (方法、类编译之后)
栈区: 存储局部变量 参数
堆区: 存储对象的成员变量
new: 在堆内存中分配空间,调用构造方法进行构造对象
new分配内存 什么时候释放?
JVM的内存回收机制(垃圾回收机制):
当一个对象如果没有引用变量再引用这个对象时,那么该对象将无法再被访问到(该对象的内存可以回收了)
JVM有一个独立的线程,会把没有引用变量引用的对象的内存进行回收
所以当一个对象不需要再使用时,记得把它的引用变量全部置空,这个时候内存将会被回收
如果一个对象的引用永远不置null,那么该对象的空间将永远无法被回收,就造成了内存泄露
System.gc() 调用该方法,显示地告诉JVM可以进行内存回收了