面向对象思想

思想 : 想法,思维方式 -> 思想决定行为
编程思想 : 决定了编写代码的方式
面向 : 更侧重什么
面向对象编程思想 : 更侧重对象使用的一种编写代码的方式!!

面向过程编程思想 : 最早期的编程思想(最基础,最根本) -> 凡事必躬亲 -> 代表语言 : C
面向对象编程思想 : 基于面向过程编程思想的提升 -> 自己的事情别人做 -> 代表语言 : C++,Java

举例:
	洗衣服
		面向过程: 泡一泡 -> 揉一揉 -> 搓一搓 -> 甩一甩 -> 晾一晾
		面向对象: 买一台洗衣机 -> 衣服搞里头 / 妈!  -> 洗衣机,妈 --> 对象
	买电脑
		面向过程 : 打车去广埠屯 -> 选电脑 -> 和老板还价 -> 打包 -> 打车回宿舍
		面向对象 : 打开APP -> 选电脑 -> 下单 -> APP -> 对象
		
面向对象思想的三大特点:
	1. 更符合我们平时的思维习惯
	2. 把复杂的事情简单化
	3. 把我们从执行者变成指挥者
	
面向对象思想的三大特性:
	封装,继承,多态
	
服务员点单	
万物皆对象 -> <Thinking in Java> -> <Java编程思想>

面试套路: 不喊停不要听
	是什么 -> 在哪用 -> 用的时候有什么问题 -> 如何解决这个问题 -> 此场景还可以用什么完成
		是什么 -> 在哪用 -> 用的时候有什么问题 -> 如何解决这个问题 -> 此场景还可以用什么完成
			是什么 -> 在哪用 -> 用的时候有什么问题 -> 如何解决这个问题 -> 此场景还可以用什么完成
				....

面试环节面向对象问题的回答:
	面向对象思想更符合我们平时的思维习惯,把复杂的事情简单化,把我们从执行者变成指挥者.在一本 <Thinking in Java>这本书中对面向对象思想 有五个字的概括 : 万物皆对象; 例如面试官您面试我这件事就涉及到了狠毒关于面向对象思想的应用;面试官您面试肯定是因为公司项目上有了新的需求,以您实力完全可以一个人胜任,但是您有更重要的工作需要去完成;所以老板使用您面试的功能来招聘 "一些具备开发功能的人", "例如我" 帮助您完成任务;

类和对象的关系

如何让生活中的事物(对象)到代码中去 : 先定义类,再创建此类的对象

类 : 事物的抽象 -> class -> 类型,种类 代表一类事物 -> 范围 -> 对事物的概括和描述
对象 : 此类的实例 -> 我们使用的是具体的对象

现有类还是现有对象? 先有类才有对象

如何定义类

格式:
    public class 类名{

    }
	//以前定义的类 都是测试类
	//现在定义的类 是用来描述一类事物的 -> 描述事物的类不写main方法

使用什么来描述事物?
    属性: 事物的描述信息
    行为: 事物的功能,事物的能力
    
//成员: 位置关系 -> 类中方法外就叫成员位置
//局部: 位置关系 -> 方法内和方法形参上的位置
属性如何编写: 成员变量
	成员变量 : 定义在类中方法外的变量!
    格式:  数据类型 变量名;
		//成员变量在定义时不要赋值,因为类中是描述一类事物的 -> 属性是属于每个对象的,每个对象都有自己的一份属性

行为如何编写 : 成员方法 //所有的方法都是成员方法
	格式:
		//描述事物行为的方法 不要加static关键字
		//main方法所在类中方法需要加static关键字
        public 返回值类型 方法名(形参列表){
            方法体;
            //return...
        }

如何创建对象

如何使用刚才定义的类呢 ? 创建此类的对象

格式:
	类名 对象名 = new 类名();
	//Student stu = new Student(); -> 具体的学生对象

使用对象: 对象调属性/对象调方法 -> 调: 调用 -> .
    对象调属性 : 对象名.属性名
    对象调方法 : 对象名.方法名(实际参数)
        
每new一次就是创建一个全新的对象,对象们各自有各自的一套属性,但是对象们的行为是共享的!!

对象调用方法的执行流程图

java编程思想在线 java编程思想在线看_java编程思想在线

对象的内存图

java编程思想在线 java编程思想在线看_构造方法_02

成员变量和局部变量的区别

1. 在类中的位置不同:
	局部变量: 方法内,方法的形参
	成员变量: 类中方法外
2. 初始化值不同:
	局部变量: 没有初始化不能使用
	成员变量: 根据类有默认值
3. 作用域不同:
	局部变量: 方法内有效
	成员变量: 在整个类中都有效
4. 在内存中的位置不同:
	局部变量: 栈中
	成员变量: 堆中
5. 生命周期不同:
	局部变量: 随着方法的调用执行产生,随着方法的执行完毕而死亡
	成员变量: 随着对象的产生而产生,随着对象的死亡而死亡(gc回收)
        
因为在类中位置不同,导致作用域不同和在内存中的位置不同;
因为在内存中的位置不同,导致初始化值不同和生命周期不同;

6. IDEA展示的颜色不同 (重要)
    没有使用过: 灰色
    使用过:
		成员变量: 紫色
		局部变量: 黑色

private

private : 访问权限修饰符 -> 私有的 -> 最小的权限修饰符
不写 :
protected :
public : 访问权限修饰符 -> 公开的 -> 最大的权限修饰符


private : 私有的权限修饰符
	作用: 用来修饰成员(成员变量和成员方法),被修饰的成员只能在本类中使用

java编程思想在线 java编程思想在线看_java_03

getter and setter 方法

局部变量和成员变量可以同名,原因是他俩差别特别大,JVM可以分辨

        变量访问的就近原则: 有近的优先访问近的
            近 ---->  远
            局部位置 < 本类成员位置 < 本类父类成员位置

        如何打破变量访问的就近原则呢?
            this.变量名 : 强制访问本类成本位置上的变量
            this.方法名(): 强制访问本类成员位置上的方法 -> 这句代码没必要
                方法名()
                
    可以自动生成getter and setter方法 alt + insert / alt + fn + insert

this 关键字

重要:      如何打破变量访问的就近原则呢?
            this.变量名 : 强制访问本类成本位置上的变量
            this.方法名(): 强制访问本类成员位置上的方法 -> 这句代码没必要
                方法名()
                
 this 概念: 本类对象的引用
 	本类 : 当前类 (this在哪个类中this就代表哪个类的某个对象)
    对象 : new 出来的东西
    的 
    引用 : 等号左边的变量都可以叫引用 Student stu(引用) = new Student();

this 其实就是一个接收本类对象的 "变量"
    哪个对象调用含有this关键字的方法,此时这个this就代表调用方法的那个对象!!//谁调方法this就是谁

构造方法

构造方法 :
	方法 : 封装了特定功能的代码块
	构造 : 构建 创造
	构造方法 : 用来构建和创造"对象"的方法叫构造方法
	
格式:
    public 类名(形参列表){
		方法体;
        //return;
    }

调用格式:
	new 关键字启动构造 :  new 构造方法名称(实际参数);

new 关键字:
	1. 在堆内存中开辟了空间
	2. 创建对象
	3. 调用了相应的构造方法

注意事项:
	1. 构造方法没有返回值类型 这个板块 -> 原因: 因为构造方法的作用是用来生成对象的!!
    2. 构造方法的方法名和类名要完全一致 ! (大小写也要一致!)
    3. 构造方法内可以写return,这个return只能用于提前结束方法.不可以在return后面接值!!
    4. 如果一个类中没有写任何构造方法,默认赠送一个无参构造
    5. 构造方法是通过关键字 new 来调用的
    6. 构造方法也可以重载
    7. 构造方法可以在调用的时候给要创建的对象属性赋值
    8. 如果你写了任意一种其他构造,默认赠送的无参构造就不送了

封装性

封装 : 包起来

1. 把重复代码封装到 循环中 -> 提高了代码的复用性
2. 把重复的功能封到 方法中 -> 提高了代码的复用性
3. private : 私有的 私有修饰之让其在本类中使用-> 提高代码的安全性
4. 描述生活中的事物(定义事物描述类) -> 提高了代码的多样性

如何定义事物描述类和使用事物描述类

如何定义事物描述类 : 八步
	1. 私有所有的属性
	//自动生成: alt + insert
	2. 自动生成无参构造
	3. 自动生成全参构造
	4. 自动生成getter and setter 方法
	//如果有需求,再写行为!!
	
如何使用事物描述类:	
	1. 在测试类的地方, 创建对象 -> 永远是第一步
	2. 对象调方法!!