面向对象编程思维

88 阅读6分钟

面向对象编程思维

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). 生命周期不同: 成员变量(与对象同生共死)、局部变量(方法调用而生,方法结束而亡)