面向对象基本概念
- 面向对象三大特征:继承,封装,多态
- 类就是设计图纸 对象就是根据图纸造出来的实物
- 类:对象共同特征的描述。一般一个代码文件里只写一个类
- 对象:真实存在的具体实例 类名 对象名=new 类名()
- 创建对象时: 类名 对象名=new 类名()
- 等号左边是在给对象起名字、是在存对象的内存地址
- 等号右边才是真正的创建了这个对象
- 直接写等号右边的内容也可以创建对象 只不过这时的对象叫做匿名对象
- 类中包含:
成员变量(属性)
成员方法(行为)
构造器
代码块
内部类
- 同一类中的成员方法可以直接调用类中定义的成员变量
- 有了类以后就要创建对象 通常会在测试类中(自己重新写的类)写main方法然后创建类的对象
- 使用对象:
访问属性:对象名.成员变量名
访问行为:对象名.方法名
- 定义类时:一个代码文件可以有很多不同的类 实际开发中一个代码文件只定义一个类 但只能有一个被public修饰 且被public修饰的类名必须与代码文件名保持一致
java内存介绍
- 方法区:字节码文件加载时进入的内存
- 栈:方法运行时所进入的内存
- 堆:new出来的东西在这里开辟空间并产生地址
对象内存图
- 对象存在堆内存中
- 每个对象都有不同的name price 所以成员变量存在于每个具体的对象中 对象又在堆内 所以成员变量就在堆内
OopDemo01 car=new OopDemo01();
//car是变量名所以存在于栈内存中 car中的存的是对象在堆中的内存地址
复杂内存图
- 什么叫两个变量同时指向一个对象:
- OopDemo01 car=new OopDemo01();
- OopDemo01 car2=car//car2和car这两个变量就指向了同一个对象
- 其实就是给变量起了个别名 通过car2改了数据以后可以通过car访问改后的数据
构造器
- 没学构造器之前定义对象理解为通过类直接定义对象,学了构造器以后:对象是通过构造器定义的,只是在之前没有传入参数
- 用于初始化一个类的对象并返回对象的地址
- 定义格式:修饰符 类名(参数列表){ }
无参构造器:类中默认就有的
有参构造器:初始化对象的时候可以为对象赋值
- 严格来说对象是通过构造器得到的
- 用构造器得到对象:类名 变量名 = new 构造器(构造器名=类名)
- 在类中定义构造器,在方法中使用构造器(main)
- 每个类中都有一个默认的无参构造器 所以类中只有无参构造器是可以不写
- 但是当我们在类中写了一个有参构造器时 此时默认的无参构造器就会直接消失,如果想再次使用无参构造器就需要单独定义了
- 使用构造器传参数时严格意义上传进去是不能叫做参数的 传进去的只不过是对象的初始值
- 对象名**.方法名(参数):**这里的参数才是严格意义上的参数
this关键字
- this出现在成员方法,构造器中代表当前对象的地址,用于访问当前对象的成员变量,成员方法
- 谁调用这个方法/构造器this就代表谁
封装
- 针对成员变量来说的,合理隐藏,合理暴露。
- 封装的实现步骤
- 使用private关键字修饰(修饰后该成员变量就只能在当前类中访问)进行隐藏
- 提供public公开的getter sette方法暴露其取值和赋值
- 即使成员变量被封装了,我们使用有参构造器时给对象赋初值时也是直接传入参数
- 封装加强了程序的安全性
- 适当的封装可以3提升开发效率,同时可以让程序更容易理解和维护
- 一般我们不在getter和setter中写任何限定性的东西,那这并不能说封装没有任何意义,这是一种代码风格,也就是Java的特点
JavaBean
- 可以理解为实体类,其对象可以用于在程序中封装数据
- 标准JavaBean满足以下要求、
- 成员变量使用private修饰
- 提供每个成员变量对应的getter setter方法
- 必须有一个无参构造器
成员变量VS局部变量
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 方法中,构造器内 |
初始值不同 | 有默认初始值 | 无默认值,使用前需赋值 |
在内存中位置不同 | 堆内存 | 栈内存 |
生命周期 | 与对象同生共死随着对象的创建而存在,随着对象的消失而消失 | 与方法同生共死随着方法的调用而存在,随着方法结束而消失 |
作用域 | 只要有对象,在任何地方都可以访问成员变量,在同一类在成员方法可以直接访问成员变量 | 在其所属大括号内 |