Java中类和对象的详细介绍
一、面向对象
1.什么是面向对象
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式.论文介绍了面向对象程序设计的一些关键技术及面向对象程序设计的方法,阐明了这些技术中的关键问题及解决办法.问题的提出和解决对了解和把握软件开发的发展方向具有一定的指导意义。1
相对于专业的语言,通俗的例子更容易理解
1.租房
自己租房(面向过程):需要确定需求 → 找房 → 谈价格 → 成交
中介租房(面向对象):告诉中介需求 → 成交
我们借助中介,省掉了找房谈价格的环节,这里的中介就是"对象"。帮助我们省掉了中间的两个环节。
2.吃饭
自己做饭:吃什么 → 买菜 → 洗菜 → 切菜 → 炒菜 → 吃饭
去饭馆:吃什么 → 吃饭
借助饭馆又省掉了中间很多步骤,饭馆就是对象。
面向对象的思想来源于实际生活,借助其它已经实现该功能的事物帮助你完成任务,这就是面向对象的核心思想。
2.面向过程和面向对象的区别
面向过程:实现一个功能的时候,
每一个步骤
都需要编写代码独立实现
面向对象:实现一个功能的时候,只需要找到已经实现该功能的代码
,帮助完成
代码案例
定义一个数组int[] array = {11,22,33,44,55};
分别使用面向对象和面向过程
打印规定格式的数组[11,22,33,44,55]
public class PrintArray {
public static void main(String[] args) {
int[] array = {
11,22,33,44,55};
//使用面向过程实现
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1){
System.out.print(array[i] + "]");
} else {
System.out.print(array[i] + ",");
}
}
System.out.println("=======================");
//使用面向对象实现
System.out.println(Arrays.toString(array));
//在JDK中有很多已经帮助我们写好的类,在使用的时候只需拿过来用即可
//在这里把Array类中的toString方法拿过来,就可以打印出规定的数组格式
}
}
二、类与对象的关系
1.类
1.定义
类是对现实生活中一类具有共同特征的事物的抽象。
类的实例称为对象。
2.定义格式
一个类的组成
应有两部分:属性(成员变量
)、行为(成员方法
)
定义一个学生类
public class Student{
//成员变量
String name;//姓名
String sex;//性别
int age;//年龄
//成员方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void study(){
System.out.println("学习");
}
}
2.对象的创建与使用
一个类通常情况下不可以直接使用,需要根据类创建一个对象才能使用
创建对象的过程
1.导入包(在同一包下创建对象这个步骤可以省略)
格式:import 包名.类名;
2.创建
格式:类名称 对象名 = new 类名称();
3.使用
使用成员变量:对象名.成员变量
使用成员方法:对象名.成员方法()
新建一个StudentTest类,并根据Student类创建对象
public class StudentTest {
public static void main(String[] args) {
//创建对象
Demo02Student stu = new Demo02Student();
//给成员变量赋值
stu.name = "张三";
stu.sex = "男";
stu.age = 18;
//使用成员变量
System.out.println("姓名:"+stu.name+",性别:"+stu.sex+",年龄:"+stu.age+"岁。");
//使用成员方法
stu.eat();
stu.sleep();
stu.study();
}
}
程序运行结果
三、对象与内存
1.使用对象过程的内存图
1.方法区首先加载两个类的信息
2.main方法进入栈内存
3.创建对象,在堆内存中开辟一块内存空间,用于存放成员变量和成员方法的地址值
4.通过对象的地址值找到对应的成员变量进行赋值
5.通过对象的地址值找到堆内存中的成员方法的地址值
6.再通过成员方法的地址值在方法区中找到对应的方法
7.将方法加载到栈内存中运行
当运行完一个成员方法后,其在栈内存中的相关数据会清空,才会运行下一个成员方法
2.两个对象的内存图
在程序中创建两个对象运行时,会按照顺序结构执行方式,先创建第一个对象,第二个对象的内存使用过程与上述3~7步类似。
3.两个引用指向同一个对象的内存
Student stuOne = new Student();
shtOne.name = "张三";
stuOne.sleep();
Student stuTwo = stuOne;
shtTwo.name = "李四";
stuTwo.sleep();
通过以上代码可以看出将stuOne对象赋值给了stuTwo对象,就是把stuOne的内存地址值交给了stuTwo,两个对象只是名称不一样
,其实质的内存地址
是完全一样
的。
两个对象对成员变量和成员方法的操作会产生相互影响。
四、对象类型的使用
1.对象作为方法参数
格式:
... 方法名(类名称 对象名);
public class StudentParam {
public static void main(String[] args) {
//创建对象
Student stu = new Student();
//对变量赋值
stu.name = "张三";
stu.sex = "男";
stu.age = 18;
//调用方法
method(stu);
}
//创建一个以对象为参数的方法
public static void method(Student stuParam){
//参数类型直接写上 类名称 对象名 即可。
System.out.println("姓名:"+stuParam.name+",性别:"+stuParam.sex+",年龄:"+stuParam.age+"岁。");
stuParam.eat();
stuParam.sleep();
stuParam.study();
}
}
程序运行结果
2.对象作为方法返回值
格式:
返回值类型的位置上写上类名称
return 后写上对象名
public class StudentReturn {
public static void main(String[] args) {
//首先创建一个对象,接收方法的返回值
Student stuTest = getStu();
//打印返回值包含的内容
System.out.println("姓名是:"+stuTest.name);
}
public static Student getStu(){
//返回值的位置需要填写类名称
Student stu = new Student();
stu.name = "李四";
return stu;
//返回值需要填写对象名
//对象名的实质是一个地址值
}
}
程序运行结果