面向对象和面向过程本身就是针对需解决问题的两种不同的思考习惯(思想)
面向过程:只要针对过程(步骤)去解决问题的方法
亲力亲为:面向过程中的最核心思想
例如:晚上吃饭
三种选择:外卖 自己做 下馆子
1.买菜
2.洗菜
3.切菜
4.做菜
5.吃饭
研发
1.自身研发 亲力亲为
2.三方组件 面向对象
Spring全家桶(最优秀的框架)
面向对象:主要让解决对象(别人)去解决问题
找别人做:面向对象的最核心的思想
让别人去处理 1.自己不能处理的问题
2.自己能处理 但是嫌麻烦
省时省力(不确定具体的底层实现问题) 拿别人的代码过来直接用 但是不知道具体的实现细节
B->Unix->C->Linux(全球最大的初始开元系统)->Android
面向对象与面向过程是否是互斥的?
事情无论是自己做 还是要别人做 最终都要被处理
面向过程是最基本的思想,面向对象是面向过程之上的一种优化方式
面试时抽象的问题尽量不要再用抽象的回答去回答,要用具体的例子来贯穿思想。
2.对象与类
对象:真实存在的事物都叫做对象
new Scanner();
new Random();
new String();
new int[];
关键字+类名 但凡看到new,就是要创建对象(在堆内存中开辟空间,并给其分配随机地址,并对其中的成员变量进行默认初始化)
类:具有相同特征和行为的事物的统称
对象和类的关系:
对象是类所描述出来的具体的事物
如何去定义一个类:
主要定义其特征和行为
特征:变量
行为:函数(一系列的动作)
先有对象,然后具有一系列相同的特征和行为的对象,再由人定义为一个类
定义方式:new 类名();
//按照类所描述的内容创建一个具体发的对象出来
class 人{
//直接定义在类中的变量 成员变量
姓名 String name;
性别 String sex;
年龄 int age;
身高 double length;
体重 double weigth;
肤色 String color;
//成员函数(非static函数)
吃 public void eat(){...return;}
睡 public void sleep(){...return;}
}
//上面是对人的一个描述
new 人(); //下面是根据上面的描述来创建一个人的对象出来
java中的封装机制(将相似的代码封装起来,避免代码冗余):
for循环 代码重复
函数 功能的重复
类 将具有相同属性和行为的对象结合封装起来
java推荐读物(代码优化参考书)
Effective Java 、编程珠玑
主函数是不需要创建对象的,可以直接调用(由JVM调用)
main 程序主要程序唯一的入口
一般而言把主函数所在的类称为主类
类的分类(主要根据类的不同功能划分)
主类:主要负责程序的运行 不需要负责描述具体的事物
实体类:主要负责描述事物(成员变量和成员方法)
工具类:一般不会创建对象 直接通过类调用函数(静态函数)即可
java调用准则
静态不能直接调用非静态(变量和方法)
非静态可以调用静态(变量和方法)
3.对象的创建流程一
类描述
属性 成员变量
行为 成员函数
一个.java文件中只能有一个public类,要是再有其他的public 认为是错误的
//全局变量-面向过程中 成员函数可以直接调用成员变量
1.主函数先进栈
2执行new Person();
在堆内存中开辟空间,并分配随机的地址
3.在对象空间中创建成员变量空间再对成员变量进行默认初始化
基本数据类型 整数 0 小数 0.0 字符 0 布尔 false
引用数据类型 null
成员函数(方法区中)并不在对象空间中
4.在函数栈中创建局部变量,存放的是该对象在内存中的地址
//成员函数调用变量时,如果局部变量和成员变量重名,优先调用成员函数内部局部变量,若无局部变量,则在类中寻找同名的成员变量去调用(就近原则)
5.private 私有化关键字(防止随意修改与访问,但是也可通过相应公开的成员函数(访问器和修改器)实现访问和修改)
权限对于内部类没有任何意义,权限主要是针对外部类而言的
成员变量是否一定需要全部向外界访问?
如果需要向外界访问 则public
如不需要向外界访问 则private
但是一般而言 都会将成员变量进行私有化
给成员变量+private是彻底不想给外界? 是不想随意给外界
主要防范外界随意修改值,但是private修饰的话,也禁止了外界的访问。
getter 成员变量访问器
setter 成员变量修改器
this默认字段 表示当前这个对象的引用,那个对象调用表示哪个对象
5.this关键字
this:表示当前对象的引用
成员变量的个数和对象的个数有关
成员函数的个数和对象的个数无关(始终一个)
如何做区分 区分哪个对象调用的函数 this默认字段(指向当前引用它的对象的地址)
6.成员变量的初始化-构造函数的作用
对象在堆中创建 其成员变量具有默认初始化
初始化步骤:
默认初始化-显式初始化-针对性初始化
显式初始化是在对象创建的过程(构造函数进栈之时)中执行的(从无(大家都没有)到有的一个过程)
针对性初始化是在构造函数执行完之后才生效的(对显式初始化的结果(大家都一样的结果)再一次进行针对性修改(大家百花齐放))
对象在针对性初始化的作用下,各有异同的成员变量,后期避免再次用setter构造器修改的麻烦
7.构造函数 构造器(主要解决针对性初始化的问题,让对象完成百花齐放,根据用户需求创建针对对象)
如果一个类里面没有定义任何构造函数,则会有一个隐藏的默认无参构造函数,如果在类中定义了有参的构造函数,默认的无参构造函数必须显式创建出来
构造函数构造方法
权限修饰符 类名(参数列表){
return;
(没有返回值不代表没有return) return不需要返回任何值,只代表函数执行完的弹栈操作,任何无具体return操作的方法,都有默认return;
}
因为构造函数可以传参,所以该函数就可以进行重载操作,仅仅没有返回值
对象的创建靠流程二
1.在堆内存中开辟空间,分配地址
2.对成员变量进行默认初始化
3.相应的构造函数进栈,此时先进行显式初始化
4.接着在执行构造函数中的内容 进行针对性初始化
5.构造函数执行完毕弹栈
6.将对象的地址传给相应的变量
默认无参的针对性初始化也在构造函数进栈时运行了,不过针对性初始化的时候啥也没执行,之前的值就是显式初始化的值。
构造函数和成员函数有什么区别?
外界调用角度
构造函数只能在创建对象时调用,对象创建完毕之后就不能再被已创建的对象调用了(将构造函数比喻为母亲孕育过程,此过程不可逆,一旦创建对象时调用完毕,则无法继续使用该函数)成员函数在构造函数中时,只算在创建对象之时的一段代码,此函数不算是对象的一个特有行为去看待
成员函数只能在对象创建之后调用,可以重复的
返回值
构造函数不需要返回值
成员函数的返回值可需,可不需
权限修饰符
构造函数可以用任意权限修饰符
成员函数也可以用任意权限修饰符
内部调用角度
构造函数能否调用成员函数?(成员函数一般为对象的一个功能,一般得等对象创建完毕之后在调用,对象未创建完毕就调用成员函数,道理不通)
可以,但是这个成员函数一般不会当做对象的行为去看待
构造函数能否调用构造函数?(构造函数只有在创建对象的时候才可以去调用,不能把它当做成员函数去看待并且随意调用)
可以,this(参数列表)调用当前类中的其他构造函数,构造函数之间不能相互调用(胡乱调用,容易造成递归调用情况)否则会产生无限递归 而且对this(...)的调用只能在构造函数的第一句,
对this的调用只能在构造器中的第一句(非最终构造器的第一句,否则会形成无线递归情况)
针对性初始化,已经是最终的为成员变量进行初始化的步骤,如果构造函数中还能再调用其他构造函数的话,则会造成成员变量覆盖,所以这样的调用方式是错误的,所以this(...)只能放在其他非最终构造器的第一句!!!防止成员变量值的覆盖;
成员函数能否调用成员函数?
可以
成员函数能否调用构造函数?
不能,构造函数只能在创建对象时进行调用(简而言之,你妈生你的过程中) 但是可以new (构造函数可以和成员函数重名,但是一般构造函数的函数名为大写,成员函数的的函数名为小写)(构造函数可以和成员函数重名!)
如果一个类中没有任何构造函数,则会有一个隐藏的默认无参的构造函数,如果一旦定义出其他的构造函数 则默认的无参构造函数不存在,必须需要自己进行显式定义。所以建议一般无参构造函数都写出来
UML(Unified Modeling Language) 统一建模语言(非写代码,非伪代码,就是画图的)
8.成员变量和局部变量的区别
成员变量:对象的特有属性(只有对象存在,对象中的成员属性才存在)
局部变量:函数中所创建的变量
1.存储位置
成员变量:存在于堆内存中对象的所属空间里
局部变量:存在于栈内存中函数的所属空间里
2.生命周期
成员变量:随着对象的创建而存在,随着对象的销毁(不在调用)而消失
局部变量:随着函数的进栈而存在,随着函数的弹栈而消失
3.初始化
成员变量:有默认初始化-显式初始化-针对性初始化(在创建对象的时候对成员变量进行改写)
局部变量:必须初始化才能被调用(否则会出现编译报错,"可能尚未初始化变量")
4.作用域
成员变量:全局可用
局部变量:在其最近的一对{}里面