01 什么是面向对象编程(oop)
答:就是只关心对象之间的交互,而并不关心任务是怎样具体完成的。例如把一个大象放进冰箱需要几步?如果是面向对象编程只会思考冰箱和大象之间的交互,那么给出的答案就是:把冰箱门打开,把大象放进冰箱,把冰箱门关闭。如果是面向过程编程则会思考,如果把大象一整个放进冰箱是不可能的,只能把它剁了才可能装进去,那么先剁哪个部位呢等一些过程问题。
02 面向对象编程(oop)的好处
答:在祖师爷看来一切实体皆对象。在现实生活中我们要干什么事时其实都是让一个个对象去完成的,例如,你想去哪里可以利用汽车这个对象通过它的载人功能来实现、你想和你的朋友通话可以利用手机这个对象通过它的通话功能来实现。在面向对象编程中也是如此,计算机是用来处理数据的,如果我们想要处理学生的数据可以利用学生这个对象来处理,如果我们想要处理汽车的数据可以利用汽车这个对象来处理。总之凡是使用面向对象编程的套路,更符合人类的思维习惯,也会使得编程更加简单,直观。
03 什么是类,什么是对象
答:Java中一切实体皆对象,类使用来描述对象的。可以简单理解为类是一个模板,而对象是模板的具体表现。C语言中描述一个复杂的对象用的是结构体,而Java和C++中用的是类。
04 类和对象的区别
答:① 类使用来描述对象的,一个类可以实例化无数个对象 ② 类不占用具体的内存空间,对象占用具体的内存空间
05 怎样面向对象编程(oop)
答:例如我们要处理汽车的数据时,① 首先先通过class关键字创建出汽车类,即描述汽车的模板 ② 通过new关键字实例化出具体的汽车对象 ③ 对对象的数据进行封装 ④ 调用类中的方法对对象的数据进行处理 (哪个对象调用的方法,处理的就是哪个对象的数据)。总之,在处理一个具体的业务时我们的编程思路是:① 找对象,即确认我们要处理哪些对象的数据 ② 创建对象的模板,即创建类 ③ 实例化对象 ⑤ 调用相关方法对对象的数据进行处理。
06 怎样定义一个类
【1】语法格式:
【2】注意事项:
① 一个Java文件中定义几个类的问题:一个Java文件中可以定义多个类,但只能有一个被public修饰的主类,且主类类名必须与所在的Java文件名保持一致。不过我们在开发时通常只会在一个Java文件中写一个类,使用idea创建Java文件时,idea会自动为我们在Java文件里面创建一个被public修饰且类名与所在Java文件名一致的主类。
② 类的修饰符问题:类只能被public修饰或不被修饰,其他的修饰符是不能修饰类的。被public修饰的类可以在任意包下被访问到(不同包下要导包),不被修饰的类只能在同一个包下被访问到。
③ 如何修改类名:不要轻易修改public修饰的主类类名,如果非要修改可以通过开发工具进行修改,且通过开发工具修改类名有一个前提:这个类所在的java文件只能有一个类存在(这个类就是我们想去修改类名的主类)。具体修改步骤如下:右键单机该类所在的java文件 -- 》选择refactor --》选择rename --》修改即可。
④ 类名命名格式:Java文件名和类名采用的都是大驼峰的方式命名。
⑤ 类中包含的内容:一个类中可以包含五大板块的内容,我们可以根据实际的需求定义这些板块,并不需要都写上。
⑥ 成员变量本身存在默认值,在定义成员变量时一般不需要进行初始化赋值(没有意义)。
07 怎样实例化对象
【1】语法格式:new + 构造器;
【2】实例化举例:
① 实例化数组时,int[] array = new int[]{1,2,3,4,5}; 或int[] array = new int[10];
② 使用从键盘读入操作之前,会实例化一个Scanner类的对象,Scanner scan = new Scanner();
③ WashMachine washMachine = new WashMachine();
【3】注意事项:
① 实例化出的对象在内存中的存储位置:使用new关键字实例化的对象都存储在虚拟机的堆区,我们可以通过实例化多个对象,但也要注意堆区的内存是有限的。
② 实例化代码可以写在哪里:写在自己或其他类的成员变量的位置,用于就地初始化引用类型的成员变量;自己或其他类的成员方法,代码块,内部类中也可以写。
③ 对象和对象之间的数据是不会相互影响的,但如果有多个引用指向同一个对象则会相互影响。
④ 如果某个对象没有一个对象引用它,则这个对象会被系统认为是垃圾对象,且Java中存在垃圾回收机制,会自动清理掉垃圾对象,我们并不需要关心它。
【4】匿名对象:例如:
OuterClass out = new OuterClass() 和 new OuterClass(),后者是匿名对象只能被使用一次。
08 计算机如何执行面向对象的程序
【1】前置知识:计算机是通过虚拟机中的栈区,堆区,方法区配合来执行面向对象程序的。
【2】实例分析:
① 将调用main方法的Test类加载到方法区中。
② 在栈区为main方法开辟栈帧空间。
③ 执行main方法的第一行代码:检测到会用到Student类于是会先将Student类加载到方法区中。接着在main方法的栈帧中为局部变量s1开辟空间。然后在堆区开辟一块内存空间存放new出来的学生对象。这个学生对象的地址存放在局部变量s1中 (我们可以通过s1里面的地址找到地址所指向的学生对象) 学生对象内部会依据学生类的格式为实例变量开辟内存空间,这些空间用于存储这个对象自己的数据,且这些实例变量都会有默认值(null/0)。学生对象的内部同时存放着对应类的地址。
④ 执行main方法的第二、三行:通过s1中的地址找到对应的学生对象,然后把这个学生对象里面相关变量的值进行更新;
⑤ 指向main方法的第三、四行:通过s1中的地址找到对应的学生对象,然后通过学生对象中的存储的类的地址,找到对应的类,最后通过方法名定位到要调用的方法进行调用,且哪个对象调用的方法,方法中处理的数据就是哪个对象的数据(注意:方法并不占用存储空间)
09 什么是引用
答:引用类型的变量简称引用,里面存储着对象的地址。
10 this关键字
【1】含义:this引用是所有实例方法的一个隐藏参数,哪个对象调用这个实例方法,this引用就指向哪个对象。
【2】用处:解决变量名冲突问题:当实例方法的局部变量名和成员变量名(类变量和实例变量)相同时,在前面加this.的代表的是成员变量,前面没有this.的则为局部变量。
11 构造器(构造方法)
【1】语法格式:修饰符 类名 参数列表 {}
【2】注意事项:
① 构造器的修饰符一般是public,如果使用private修饰则会使得该类无法实例化对象。
② 构造器是特殊的方法,它和普通方法相比它并没有返回类型,且方法名必须与所在类名一致。
③ 构造器可以发生重载。
④ 构造器什么时候被调用:关于new 构造器;的理解。其一:实例化某对象,其二:调用带有几个参数的构造器。即,构造器不需要我们自己调用,在实例化对象的时会根据我们传的参数调用对应的构造器。因此构造器的常见应用场景:完成对实例变量的初始化赋值(类变量也可以,不过类变量的初始化一般会写在静态代码块中),如此我们就可以不用再利用点号去一个个赋值啦。
⑤ 构造器并不负责给对象开辟内存空间。
⑥ 在创建类时如果不写构造器,Java会自动生成一个不带参数的构造器(通过反汇编可以看到)
⑦ 一旦定义了带参数的构造器,Java就不再提供不带参数的构造器,此时我们想使用不带参数的构造器就得自己手写了。
⑧ 在构造器的第一行可以通过this(...)调用其他的构造器,但是注意不能成环。
⑨ 构造方法在每一个对象的生命周期中只会调用一次。
12 封装
【1】介绍:封装是面向对象编程的三大特征之一。概念:用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
【2】封装的设计规范:合理隐藏,合理暴露。我们在设计对象的成员时,将对象的成员变量都隐藏起来,并暴露合适的get 和 set 方法供外界访问(get和set方法里面我们可以通过逻辑控制语句对取值和赋值进行限制);在设计对象的成员方法时暴露必须暴露的就行了。
【3】代码层面控制公开和隐藏的关键字是:public 和 private。
【4】进一步解释:如果将一个成员变量完全暴露,那么使用者就可以任意修改该成员变量的值, 如果更改成一些不合理的值显然是不行,所以我们可以将成员变量使用private关键字封装起来,当使用者想要对被封装的成员变量进行重新赋值和获取时,我们可以设计合适的get和set方法提供用户使用(get和set方法里面我们可以通过逻辑控制语句,控制用户的赋值和取值,例如下图代码)。
13 实体类(JavaBean)
【1】形式:第一点:这个类中的成员变量必须定义成私有的,且要对外提供相应的get 和 set方法,第二点:这个类中必须有一个公共的无参数构造方法,其他的构造方法可写可不写。
【2】意义:实体类只负责数据的存储,而对于数据的处理交给其他类来完成,以实现对数据和数据业务相分离的效果 (这时现阶段软件开发里比较流开发模式)。
【3】使用示例:判断某学生的成绩是否及格:
14 成员变量和局部变量的区别
15 案例:模仿电影信息系统
代码位置:模仿电影信息系统.txt