面向对象编程思维
1 对象
1.1 对象的含义
对象实质上是一种特殊的数据结构,如一张数据表, 表当中记录什么数据, 对象就处理什么数据
变量只能存储一个数据, 数组可以存储多个类型一样的数据, 对象可以存储任意类型多个数据...
这样的表,就是类(class)类可以理解成对象的设计图, 或者对象的模板, 设计图中规定有哪些数据,对象中就只能有哪些数据
1.2 执行原理
面向对象的代码执行原理和数组的执行原理非常类似.
如:Student s1 = new Student();该命令行可创建一个新的对象, 命名为student.
-
Student s1表示的是在栈内存中, 创建了一个Student类型的变量, 变量名为s1 -
而
new Student()会在堆内存中创建一个对象, 而对象中包含学生的属性名和属性值同时系统会为这个Student对象分配一个地址值0x4f3f5b24
-
接着把对象的地址赋值给栈内存中的变量s1, 通过s1记录的地址就可以找到这个对象
-
当执行
s1.name=“曾二”时, 其实就是通过s1找到对象的地址, 再通过对象找到对象的name属性, 再给对象的name属性赋值为曾二
1.3 类的注意点
1). 一个代码文件中, 可以写多个class类, 但是只能有一个是public修饰, 且public修饰的类必须和文件名相同
2). 对象与对象之间的数据不会相互影响, 但是多个变量指向同一个对象会相互影响
1.4 类的使用
public class Car {
//成员变量
private String name;
private double year;
private String brand;
private double price;
//成员方法
public void printPrice(){
System.out.println(price);
}
}
1.5 对象的使用
创建一个对象:
Car car = new Car{};
调用里面的成员变量:
car.name;
car.year;
car.brand;
car.price;
调用里面的成员方法:
car.printPrice;
1.6 对象在内存里运行
字节码文件先进入方法区==> main方法进入栈, 根据所使用的类在方法区创建一个新类, 并存入堆中对象所在位置==> 在堆内存开辟空间, 新建一个对象并存入新对象的成员变量, 并为方法引用方法区内该类的地址 ==> 方法根据引用路径进栈执行
2 This
2.1 This
This 可以看做一个变量 (不一定准确...) 而且This的值不是程序员附的, 是根据调用的对象而决定的, 简单来说就是谁调用, 谁就为This. 比如君权神授, 那么君为被调用的方法/变量, 而神则为This.
2.2 不同的使用场景
2.2.1 区分局部变量和成员变量
当在类中构造一个函数中, 其形参与一个类的成员变量相同时, 例如都叫: name. 会发生难以区分的情况. 例如:
// 满参构造器
public Phone(String brand){
brand = brand;
}
当用this.方法名, 则可以很好区分 例如:
// 满参构造器
public Phone(String brand,double price,String color){
this.brand = brand;
this.price = price;
this.color = color;
}
PS: Java中找参数符合就近原则. 如果上例brand = brand, 则brand 均为局部变量. (可用Ctrl+左键确定)
2.2.2 调用当前类方法
一个类中当调用方法时, 因为方便的原因, 经常会省略掉this. 然而编译器会自动加上this表示当前类
2.2.3 可以作为参数传递方法
如下,:
class phone{
public void p(){
System.out.println("你在给什么手机发短信??");
}
public void show(){
p(this);
}
public static void main(String args[]){
phone p1 = new phone();
p1.show();
}
}
2.2.4 调用父类方法
用于子父类中可以用this 调用父类的方法或者变量, 例如:
public class Animal {
private String color;
private String breed;
// 构造函数
public Animal() {
}
// get/set
public void setColor(String color) {
this.color = color;
}
public void setBreed(String breed) {
this.breed = breed;
}
public String getColor() {
return color;
}
public String getBreed() {
return breed;
}
}
public class Cat extends Animal {
public void eat() {
System.out.println(this.getColor()+"的"+this.getBreed()+"正在吃鱼.....");
}
public void catchMouse() {
System.out.println(this.getColor()+"的"+this.getBreed()+"正在逮老鼠.....");
}
}
3 构造器
3.1 格式
1) 构造器名称与类名完全相同----建议直接复制粘贴, 否则会打错..爆红
2) 构造器不用void, 因为只是构造, 没有任何返回需求
3,2 作用
构造器在创建对象的时候被调用, 主要主要作用是构造成员变量, 并初始化.
构造器的调用语句:
Cat cat1 = new Cat();
而且构造器可以重载. 例如一个无参构造器和一个满参构造器:
// Constructor
public Phone() {
}
public Phone(String brand, double price, String color) {
this.brand = brand;
this.price = price;
this.color = color;
}
Ps: 构造器赋值与set方法区别:
1) 时机: 构造器在创建对象时给成员变量赋值, set赋值为在对象创建完毕后
2) 次数: 构造器在创建时只能赋值一次, 后面需要调动对象.变量名赋值. 如成员变量为private而且没有set方法情况时,则无法再次赋值. set方法可多次调用多次赋值.
4 封装
4.1 概念
合理隐藏, 合理暴露
4.2 封装方法
1)给成员变量添加private
2) 添加get/set方法
4.3 好处
对成员变量, 或者方法的加强管制控制,使得一, 外界无法触及内部核心代码或者秘密数据. 二, 可以使不同类之间的相互影响减少到极低,进而增强数据的安全性和简化程序的编写工作
5 JavaBean
5.1 定义
JavaBean是一种软件组件模型, 可以使用JavaBean对用Java代码创造的对象进行封装打包. 其他的开发者可以通过其他程序或应用使用这些对象. 或者说JavaBean是一个黑盒子模型, 当不需要暴露子系统内部的系统细节, JavaBean就隐藏于自身内部. 然后需要与其他部分链接的借口, JavaBean暴露其借口得以与外界通讯.
5.2 组成部分
1)属性 Properties
JavaBean的属性不对外暴露, 所以需要void setName(String str)方法写入, 用 String getName()方法读取. JavaBean会实时对修改值做出反应. 个人理解为 == 牵一发而动全身.
源于面向对象而超脱于面向对象.
2)方法 Method
首先JavaBean作为一种特殊类形式, 和普通类一样需要构造器来构造参数. 其次由于内部参数被封装, 所以需要提供set/get方法获取或者写入内部成员参数. 最后Javabean本质是可提供外界共享的接口的组建模型, 所以方法应是public, 则可以将提供的功能反映在程序属性和事件中.
3) 事件 Event
Bean与其他软件组件交流信息的主要方式是发送和接受事件。
6 局部变量与成员变量
1). 类中位置不同:成员变量(类中,方法外)、 局部变量(方法中)
2). 初始化值不同: 成员变量(有默认值, 不需要初始化赋值)、局部变量(没有默认值,使用之前必须完成赋值)
3). 作用域不同: 成员变量(整个对象)、局部变量(在所归属的大括号中)
4). 内存位置不同:成员变量(存在于堆内存)、局部变量(栈内存)
5). 生命周期不同: 成员变量(与对象同生共死)、局部变量(方法调用而生,方法结束而亡)