面向对象
-
编程思想
- 面向过程:在解决一个问题时,按照步骤:第一步,第二步。。。直到将问题解决为止
- 解决小问题相对简单,但是解决复杂问题时相对繁琐、麻烦
- 面向对象:抽取应用中使用的对象,利用对象与对象之间的关系将问题解决
- 面向过程:在解决一个问题时,按照步骤:第一步,第二步。。。直到将问题解决为止
-
对象:复杂的客观事物在Java程序中的一种表现形式。----->万物皆对象
- 组成:
- 对象的属性:代表对象有什么特征、特点;对应对象的静态数据部分
- 对象的方法:代表对象有什么功能、能做什么;对应对象的动态功能
- 组成:
-
计算机中使用类,来对一类对象进行描述,描述该类对象具有哪些属性和方法。
-
类和对象的关系:
- 类是对象的模版
- 对象是类的实例(基于一个类可以创建多个对象)
类的组成
- 属性:即成员变量。---->定义在类以内,方法(函数)以外的地方。---->区分于局部变量
- 语法:数据类型 变量名;—>可以赋予默认值,但是属性初始化必须和声明一起进行
- 成员变量具有默认值,默认值同数组 char—>\u0000(空字符)
- 作用范围:至少在本类中有效—>成员变量和成员方法位置先后没有要求–>区分局部变量
- 命名:在一个类中不能有重名属性(成员变量);当局部变量和成员变量命名冲突时,在定义局部变量的方法内部访问此变量时,局部变量被优先使用,但在外部调用时局部变量无效。
局部变量 | 成员变量(属性) | |
---|---|---|
位置 | 定义在方法内部的变量 | 定义在类以内,方法以外 |
默认值 | 不赋值无法使用,没有默认值 | 有默认值,等同数组默认值 |
作用范围 | 从定义开始到代码块结束 | 至少在本类中有效 |
命名冲突 | 在重合的范围内不允许重名 | 一个类中不允许有重名的成员变量,允许和局部变量命名相同。命名冲突时,局部变量被优先使用。但在类以外,局部变量无效。 |
- 方法:定义在类以内,其他方法/函数以外的地方,不需要static。—>也称为成员方法
-
对比函数:定义在类以内,其他函数以外的地方
-
定义分为方法声明和方法实现
-
方法声明:代表对象能干什么
修饰符 返回值类型 方法名(形参列表)异常—> 一个方法的修饰符可以有零个到N个,而且没有位置先后要求。
-
方法实现:代表对象具体如何实现对应的功能
-
-
方法的重载(overload)
-
在一个类中定义了多个同名的方法,但是参数列表不同
-
要求:
- 方法名相同
- 形参列表不同(数据类型、形参个数、顺序)---->有一个不同即为不同
- 修饰符、返回值、异常没有要求
-
编译器会根据调用者传递的实际参数匹配对应的形参方法
-
编译器根据实参类型先精确匹配对应的形参方法,没有的话就近向上匹配(int–>long->double),再次失败的话则编译报错。
- 避免出现调用混淆---->(1,1)----->(double a, int b)和(int a, double b)—>编译报错
-
overload有点—>屏蔽了因形参不同而导致的功能不同,无需定义大量方法名
构造方法(构造器)
- 是一种特殊的方法,定义在类以内,方法以外。
- 构造方法的方法名必须和类名一致,且没有返回值
- public 类名() { }
- 构造方法允许Overload。
- 构造方法不能手动调用(不能使用对象名.构造方法名() )
- 在创建对象时,JVM根据给定的实参匹配对象的形参构造方法,完成对象的创建
- 一个对象只有在创建的时候使用一次构造方法;但是一个构造方法可以被多个对象使用
- 作用:
- 用于创建对象,并且通常利用有参数的构造方法为属性复制
对象的创建
-
语法:类名 对象名 = new 类名();
-
类名 对象名 = new 类名(); 分为三个过程: 应用层:
- 分配空间:为所有的属性赋默认值---->int 0,引用行 null,char 空’\u0000’等
- 初始化属性:为属性提供第二次赋值的机会---->看定义属性的时候有没有给默认值
- 执行构造方法中的内容:为属性提供第三次赋值的机会
-
底层执行三个过程原理:类名 对象名 = new 类名();
- new关键字会触发分配空间,同时为所有的属性赋予默认值
- 执行构造方法—>类名()----->将属性的初始化语句移交给每一个构造方法,而且在构造方法的第一行语句
- 属性初始化的语句
- 执行构造方法中原有的语句
底层在编译时,就是把初始化属性放在每一个构造方法的第一行语句,编译器会为每一个初始化语句做一个构造方法。同时应用层的构造方法语句会将属性的初始化语句移交给每一个构造方法。 //反编译可以看到这一过程 class Student{ String name; int age = 70; public Student(){ //是在底层编译器生成的构造方法,不是在应用层写的 age = 70; } public Student(String n,int a){ age = 70; //底层自动生成的,不是应用层写的 name = n; age = a; } }
-
this的使用—>Day07.UpClass3.java
- this 代表当前对象,类似于我
- this. 应用在本类中的成员方法或是构造方法中,代表调用当前对象的属性和成员方法
- this.属性名 : 代表访问当前对象属性
- this.成员方法(实参): 代表调用当前对象的成员方法
- this. 通常可以省略 可以用来区分成员变量和局部变量—>如命名冲突时 只有成员变量才能用this.
- this() ----->应用在本类的构造方法中,并且调用本类其他的构造方法
- 对this() 的调用,必须放在构造方法的第一行且一个构造方法中只能有一个this()
- 不能所有的构造方法都有this()—>会出现构造器递归调用报错
- 通常用在形参多的调用形参少的,可以减少代码量
-
JVM内存:
栈空间:方法调用—>局部变量—>对于引用而言是存储首地址
堆空间:放置对象---->即new 出来的东西
引用
- 对象类型的变量称为引用----->类名 引用名 = new 类名(实参)---->引用的类型 = 对象类型—>Java是强类型语言
-
引用存储对象在堆空间中的首地址
-
对象与对象之间相互独立,每一个对象在堆空间中都有独立的空间即具有一个新的地址
-
可以单独声明引用---->类名 引用名;
-
引用之间可以相互赋值---->赋值传递的是对象在堆空间中的首地址—>引用必须为同类型
-
null代表空地址,如果一个引用中存储null,则代表不指向堆空间中任何对象—>通常利用null作为引用的默认值和初始值。
-
当引用中存储了null,并且用此引用中访问该类型的属性或者方法,则编译通过,但是运行报错
—>java.lang.NullPointerException(空指针异常)
-
应用在形式参数上:
- 对应类型的对象或是引用可以作为实际参数
- 引用之间传递的是对象在堆空间的首地址;基本数据类型的变量传递的是数值
-
引用应用在返回值上:
- 对应类型的对象和引用都可以作为返回值进行返回。
-
引用应用在数组上:
- 对应类型的对象可以作为元素进行存储
-