面向对象
1面向对象思想引入
前面,我们需要实现某种需求时,往往会定义方法,然而方法会越来多,这时候就会考虑封装这些方法,我们知道类可以存放方法,故可以用类封装这些方法,需要时,我们便调用这些类中的方法.这就是面向对象的编程方法.
2. 面向过程
假设有一个需求:求数组中的最大值;
定义一个数组,静态初始化---->定义一个参照物---->遍历....
给一个需求,对需求分析,然后一步一步进行操作,最终得到某一个结果,整个过程都是自己在完成....
3.面向对象思想概述
面向对象是基于面向过程的编程思想
面向对象特征:
1) 面向对象让我们从执行者变成指挥者
2) 面向对象事情变得更简单
3) 面向对象更符合我们的生活习惯
举例:
面向过程 :付款 付钱 --->商家确认钞票真伪--->找零---->把钱放入钱包
面向对象 : 支付宝 ---->扫码付款
4.面向对象开发,设计,特征
面向对象开发
就是不断的创建对象,使用对象,指挥对象做事情。
面向对象设计
其实就是在管理和维护对象之间的关系。
面向对象特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
5.类与对象的关系
我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。
比如:去超市买东西的计费系统,去银行办业务的系统。
我们如何表示一个现实世界事物呢:
属性 就是该事物的描述信息
行为 就是该事物能够做什么
举例:学生事物
我们学习的Java语言最基本单位是类,所以,我们就应该把事物用一个类来体现。
6.类的定义
现实世界的事物
属性 人的身高,体重等
行为 人可以学习,吃饭等
Java中用class描述事物也是如此
成员变量 就是事物的属性
成员方法 就是事物的行为
定义类其实就是定义类的成员(成员变量和成员方法)
7.类与对象案例
如何定义
按照事物到类的过程一步步分析
如何使用
创建对象:
类名 对象名 = new 类名();
对象名.成员变量
对象名.成员方法
代码如下
首先创建一个舍友类
然后创建一个学生测试类,在这里面调用舍友类的成员变量和成员方法
输出结果
8. 对象内存
定义一个phone类
一个对象的调用内存图解(内含代码)
//创建对象的过程
1) 先通过测试类李曼的main主程序进行加载Phone类
2) Phone p 先在栈内存开辟内存空间,创建一个phone对象,需要在队内存申请堆内存空间
3) 通过无参构造方法给Phone类对象进行默认初始化
4) 通过给成员变量赋值的形式,给对象进行显示初始化
5) 显示初始化完毕,整个对象创建完毕折后,给对象进行内存空间的地址值分配
6) 通过地址值找到对应对象.
两个对象的调用内存图解(内含代码)
和一个对象调用不同的是 再堆内存中又创建了一个 new Phone()
三对象的调用内存图解(内含代码)
这里面第三个对象调用的是第一个对象中的堆内存
当第三个对象进行赋值时不会创建一个新的new Phone,而是会在 第一个对象的堆中进行读写操作,相当于多个引用指向同一个内存
无论是调用p.price或是p3.price 两者输出结果是一样的 从p3.price中的赋值会在堆内存中替换原有的值 ,类似于这样的成员变量或者方法在被多个对象引用时也是一样的..
9.成员变量和局部变量的区别
成员变量和局部变量的区别
1)在类中位置不同
成员变量:类中,方法外
局部变量:方法声明上,或者再方法定义中
2)在内存中的位置不同:
成员变量:堆内存
局部变量:栈内存
3)生命周期不同:
成员变量:成员变量是随着类的加载而加载,随着类的消失而消失
局部变量:随着方法的调用而存在,随着方法调用完毕而消失
4)初始化值不同
成员变量:初始化由系统默认初始化,
对于成员变量,可以不给初始化值,由系统给,然后显示初始化;
局部变量:定义一个局部变量,必须进行初始化,如果不初始化,无法使用(在使用之前进行初始化)
注意:在一个定义中 不能随意定义为一个成员变量,尽量定义为一个局部变量,为了从内存角度考虑(如果该变量是该类的属性则要定义为成员变量)
10.匿名对象
匿名对象:就是创建时没有名字的对象
例如: Student s = new Student();
Student s 相当于给 new Student()取了名字;
匿名对象在用的时候直接 new Student(); 不取名字.
在开发中经常会使用匿名对象
匿名对象在使用过程中一般使用一次, 因为每使用一次匿名对象,相当于在堆中又创建了一个 new Student();会造成内存溢出现象
11.形式参数
(针对值有效)
形式参数的问题:
1)如果是基本数据类型,形参的改变对实际值几乎没有影响
public int sum(int a,int b) { //形式参数是基本类型 :
return a+b ;
}
}
//在上面的形参改变对最后的输出结果没有任何影响
2)如果是引用数据类型,形参的改变会影响结果
代码如下:
12.private关键字
private关键字
1) 是一个权限修饰符
2) 可以修饰成员(成员变量或者成员方法)
3) 被private修饰的成员只有在本类中才能被访问
private:体现的也是一种封装思想
封装:
标准类的写法,将成员变量全部私有化,被private修饰的成员变量只能在本类中访问,可以通过公共的访问方法去访问成员变量
13.this关键字
this:代表所在类的对象引用
重点:方法被哪个对象调用时.this就代表那个对象
代码如下
// 若是有对象调用该类 例如 th t = new th(); 则调用th.setName方法时,其中的
This.name = t.name (,其实意思上是这个意思.但这个t.name是私有变量,无法正常调用)
所以this name 意义上是(成员变量中的name).
什么时候使用this呢?
局部变量隐藏成员变量的时候;
14. 构造方法
构造方法的作用:
就是给对象进行初始化.
构造方法也属于一类的组成
构造方法和普通方法的区别:
1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的.
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用.
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般方法不存在这一特点
构造方法和创建对象的区别:
对象可以说是一个类的实例化,类你可以一个模板,而构造方法就是这个模板提供的入口,你通过这个入口能new一个 对象举个例子:
例如:Test是一个类,那么 Test t = new Test();这个语句叫做类的实例化,即t是Test类的一个实例,这个t就是一个Test类型的对象,在这个实例化过程中,也就是new Test();系统会自动调用Test类中的构造方法,如果你在定义Test类的时候写了无参构造方法Test(),那么就调用这个方法,如果你没写构造方法系统会默认有一个无参构造方法,如果你写了有参构造,那么new Test();会报错,必须写成:new Test(参数);构造方法的作用就是规定在创建这个实例的时候想做的事,比如你可以在这里给Test类的私有变量赋值
构造方法:
1. 方法名和类名相同
2. 构造方法.连void都没有
注意事项
1. 若是没有写无参构造,系统会默认提供无参构造
2. 如果我们写了无参构造或者有参构造,系统不会再提供无参构造,定义一个类时,永远给出一个无参构造.
3. 构造方法是可以重载的.(可以通过定义不同类型 或者不同参数个数的方法)
给成员变量有两种方式:
1)set()get()公共的访问方法
2)可以通过有参构造进行赋值
15. 成员方法的分类
成员方法的分类
1. 按返回值划分,
void形式:没有具体返回值.
非void形式:无具体返回值
2. 参数分类;
1)空参
2)无参
代码如下
16.static关键字
定义一个人类
成员变量:姓名 年龄 国籍
创建了三个Person对象,每一个对象的国籍都是中国,值是重复的,这样的话在堆内存中比
浪费内存空间,不好
针对这种情况,多个对象对同一个变量进行共享,这个时候Java提供了一个关键字---static: 静态的(共享的)
在方法区中:开辟一个静态区域: 都是静态标记
关于static关键字:
1)静态随着类的加载而加载
2)static优先于对象存在
回想:main public static void main(..){...}
3)static共享数据,可以被多个对象进行共享
举例:饮水机(staticd的:共享的)
水杯(不能共享的...)
4)如果数据被静态修饰的,它可以被类名直接调用
被静态修饰的方法:类名.方法名()被静态修饰的变量:类名.变量名;
一个类中可有静态变量,也可以有非静态
可以有静态成员方法,也可以非静态的成员方法
静态的方法只能访问静态变量,或者是静态的方
非静态的方法,既可以访问静态变量也可以非静态的变量...
17. 如何制作文档说明书
如何制作一个文档说明书
1)创建一个数组,静态初始化
2)创建一个工具类,ArrayTool(你可以做一个其他功能的工具类),提供一些静态功能
遍历,最值,查找
3)ArrayTool,每类,方法加上文档注释
4)打开dos控制台:
找到当前路径:
javadoc -d(目录名我这里写了bbc) -author -version ArrayTool(文件名名).java
最后生成结果如下
点开bbc文件夹
打开index.html文件 是一个简单的文档说明