面向对象
- 面向对象:是Java语言编程使用的一种编程思路,编程套路
- 面向过程和面向对象区别:
面向过程:注重解决问题的步骤,过程;比如:想要解决一个问题,要考虑这个问题解 决的每一步怎么去完成。
面向对象:注重解决问题的主体;比如:想要解决一个问题,只需要考虑找一个主体帮 我们去完成。 - 举例:
洗衣服:
面向过程解决:找个盆 放衣服 放水 放洗衣液 泡一泡 洗一洗 晾一晾
面向对象解决:找一个全自动洗衣机 - 面向过程和面向对象的关系:
面向过程是面向对象的基础,面向对象基于面向过程 - 面向对象的特征:
封装,继承,多态
类和对象
- 类:类型
对一些相同的相似的事物,一种统称。是一个概念 - 对象:
是类型的一个具体的体现,是一个实例
类的定义
- 概述:想要去描述一个类型,就两点
属性:对类型的信息的描述
在Java语言中,一般是通过变量来定义属性
在类中方法外定义
行为:对类型的功能的描述
在Java语言中,一般是通过方法来定义行为
方法的修饰符:public - 定义一个人类:
class 人类{
属性:
姓名、年龄、爱好
行为:
吃饭、睡觉、打豆豆
}
- 只要是一个类型,想要使用这个类型,都会先编译为一个.class文件
如果一个类型中定义了主方法:这个类型一般称为测试类
如果一个类中没有定义主方法:一般称之为自定义类
对象的定义和使用
- 创建的格式:
类型 对象名 = new 类型(); - 说明:
类型:要创建哪一个类型的实例,类型就写对应的类名
对象名:给对象起一个名字,用来保存对象的地址值
=:赋值符号
new:在堆内存中开辟空间
类型:跟前面的保持一致
():构造方法 - 使用对象属性的方式:
属性赋值操作:
对象名.属性名 = 值;
访问属性值:
对象名.属性名
注意:如果对象的属性没有赋值,就访问,不会报错
因为对象的属性会有一个默认值
默认值:整数:0 小数:0.0 String:null 字符:’ ’ 布尔:false - 访问对象的方法
对象名.方法名();
代码
package demo01;
public class Person {
//属性:姓名 年龄 爱好
String name;
int age;
String hobby;
double height;
//行为:吃饭 睡觉
public void eat(){
System.out.println("人类会吃饭");
}
public void sleep(){
System.out.println("人类会睡觉");
}
}
package demo01;
public class Demo01 {
public static void main(String[] args) {
//创建Person类的一个对象
Person per = new Person();
//给对象的属性赋值
per.name = "张三";
per.age = 23;
per.hobby = "抽烟";
//访问对象的属性值
System.out.println(per.name);
System.out.println(per.age);
System.out.println(per.hobby);
System.out.println(per.height);
//调用对象所有的功能
per.eat();
per.sleep();
}
}
一个对象的内存图
- 先加载测试类Demo01
- 有JVM默认执行主方法,主方法main进栈
- 加载Person类型
- 在main方法中创建一个Person类的变量,用来存储对象的地址
- 在堆内存中创建一个对象,并为该对象的属性初始化
- 将对象的地址值赋值给main方法中的变量保存
- 使用main方法中的变量,访问对象,并且给对象中的属性赋值
- 使用main方法中的变量,获取对象中的属性值
- 使用main方法中的变量,调用对象的方法执行
两个对象的内存图
总结:
(1)多个对象都属于同一个类型,都有相同的属性
但是在不同的对象中,保存的属性值都可能不一样
(2)如果要使用某一个类型,需要先加载该类。如果加载之后,后续继续使用这个类 型,不需要重复加载,加载一次即可。
两个引用指向同一个对象
- 如果两个变量中,保存的是同一个对象的地址值
- 其中一个变量,将对象中的属性进行修改,另外一个变量访问对象中的属性值,访问的 是修改之后的结果。
成员变量和局部变量
- 局部变量:在方法中定义的变量
- 成员变量:在类中方法外定义的变量
- 区别:
(1)定义的位置不同
(2)存储的空间不同:
局部变量:在栈内存中存储
成员变量:在堆内存中存储
(3)生命周期不同:
局部变量:随着方法的调用而存在,随着方法的调用结束而消失
成员变量:随着对象的创建而存在,随着对象的空间回收而消失
(4)默认值不同:
局部变量:没有默认值,不赋值不能使用
成员变量:有默认值
匿名对象
- 概念:在创建一个对象之后,不使用变量接收对象的地址值
- 格式:
new 类名(); - 使用场景:
(1)当只需要调用某一个对象的方法一次
不需要在方法中创建一个空间存储对象的地址,节约内存空间
(2)当传递一个对象的时候,可以使用匿名对象来当做实参传递
不需要多创建一个变量来存储地址,节约内存空间
(3)当某个方法需要返回一个对象,可以返回一个匿名对象
不需要多创建一个变量来存储地址,节约内存空间