面向对象初识
1. 面向对象
1.1 面向对象的思想
- 面向对象基于面向过程的变成思想
- 面向过程:强调的是每一个功能的步骤
- 面向对象:强调的是对象,然后由对象去调用功能
1.2 面向对象的思想特点
举例:
买电脑:
面向过程:我的先了解电脑---了解我自己的的需求----找对应的参数信息---去西二旗买电脑---讲讲价----买回电脑
面向对象:我知道我自己要买电脑----吕吕去给我买电脑----吕吕就买回来了。
吃饭:
面向过程:去超市买菜---洗菜---切菜---炒菜---菜撑起来---吃
面向对象:上饭店吃,我----服务员(点菜)---厨师(做菜)---服务员(端菜)---吃
去饭店吃饭不太划算,所以,需要找个对象。
1.将大象装进冰箱
面向过程:
动作有哪些
1.打开冰箱门
2.装进大象
3.关闭冰箱门
面向对象
1.有哪些类
2.每个类有哪些东西
3.类与类直接的关系又是什么呢?
把大象装进冰箱的分析?
1.有哪些类
大象
冰箱
Demo
2.每个类有哪些东西
大象:
进去
冰箱:
开门
关门
Demo:
main方法
3.类与类直接的关系又是什么呢?
Demo中使用大象和冰箱类的功能
1.3 开发、设计、特征
面向对象开发
就是不断的创建对象,使用对象,指挥对象做事情
面向对象设计
其实就是在管理和维护对象之间的关系。
面向对象的特征
封装
继承
多态
【抽象】
学生
特征:姓名、年龄、性别,.....
行为:学习、吃饭、睡觉.....
属性:该事物的描述信息
行为:该事物能够做什么
Java中最基本的单位是:类。
现实世界事务和类的对应关系
事务: 类:
属性 成员变量
行为 成员方法
2. 类
类就是一组相关的属性和行为的集合。
对象:是该类事物的具体表现形式。具体存在的个体。
举例:
学生:类
班长:对象
类的定义格式
class 类名{
类体;
}
例如:
class Person{
}
注意:当类名有多个单词组成的时候,要求每个单词的首字母都要大写。
成员变量的语法格式
class 类名{
数据类型 成员变量名 = 初始值; - 其中=初始值可以省略,分号不可以省略
}
例如:
class Person{
String name;
int age;
}
注意:
当成员变量名字由多个字母组成的时候,要求从第二个单词开始每一个单词的首字母都要求大写
补充:
局部变量:主要指声明在方法体内的变量,作用域从声明开始一直到方法体结束。
成员变量:主要指声明在方法体外类体内部的变量,作用域从声明开始到类体结束
3. 对象
是该类事物的具体表现形式,具体存在的个体
当一个类定义存在后,可以使用new运算创建我们该类的对象。对象创建的过程一般称为类的实例化。
3.1 对象的创建
语法格式
new 类名();
例如:
new Person(); - 匿名对象
使用方式
对象传火箭的形式叫做类的实例化,而创建对象的本质其实就是在内存空间中的
堆区申请一块空间,用于记录该对象所拥有的成员变量的信息。
3.2 引用的使用
使用引用数据类型声明的变量叫做引用类型变量,简称为“引用”。
语法格式
类名 引用名称;
Person p;
使用方式
引用变量通常用于记录创建对象在堆区中的内存地址信息,从而可以方便的使用该对象以及该对象中的成员变量信息,使用方式:
引用名.成员变量名;
例如:
Person p = new Person();
p.name = "lisi";
p.age = 18;
3.3 成员方法(行为)
类中可以定义成员变量和成员方法
语法格式
class 类名{
返回值类型 成员方法名(形参列表){
成员方法体;
}
}
例如:
class Person{
String name;
int age;
//自定义成员方法来打印一句话
void show(){
System.out.println("面向对象学完,我就要去找对象。");
}
}
注意:
当成员方法名由多个单词组成的时候,要求从第二个单词开始首字母大写。
-
成员方法详解
返回值类型 返回值类型只要指从方法体中向方法体外返回的数据类型。 返回值主要返回的类型由: 当需要返回内容 66 时候, 则返回值写int类型即可。 当需要返回3.14的时候,则返回值写double类型即可。 当需要返回"你好"的时候,则返回值写String类型即可。 在方法体中使用return关键字来返回数据并且结束方法,例如:return 66; 当方法体中不需要返回任何数据的时候,则返回类型写void即可。 形参列表 形式参数主要指从方法体外向方法体内传入数据内容,通过使用变量的声明来传入。 形式参数的语法格式: 数据类型 形参变量名 当需要传入数据内容是 66 时候, 则形式参数写为:int i; 当需要传入数据内容是3.14的时候,则形式参数写为:double b。 当需要传入数据内容是"你好"的时候,则形式参数为:String s。 形式参数列表的语法格式:数据类型 形参名1,数据类型 形参名2,....... 当需要传入数据内容为 66和3.14的时候,则形式参数写为: int i,double b 当需要传入数据内容为 66 和"你好"的时候,则形式参数写为:int i,String s 当不需要传入任何数据的时候,则形参列表位置啥也不写即可。 成员方法体 成员方法体通过用于编写描述改方法功能的语句块,也就是对多条语句的打包/包装。 当该方法的功能就用于计算1+1的和并返回的时候,,则方法体中,return 1+1;即可
-
成员方法的调用
语法格式 引用/对象.成员方法名(实际参数列表); 例如: p.show(); 使用方法 实际参数列表主要用于给形式参数列表进行初始化工作。因此参数的个数、类型、顺序等都必须要保持一致 实际参数可以传递 直接量,变量,表达式以及方法的调用等.......
4. JVM内存解析
手机:
特征:
名字、价格、颜色
行为:
打电话
发送消息
打游戏
Java的JVM的内存可以分为3个区:堆区、栈区、方法区
4.1 堆区
1.存储的全部是对象,每个对象都包含一个与之对应的class信息。(class的目的是得到操作指令)
2.jvm只有一个堆区被所有线程共享,堆中不存放基本数据类型和对象引用,之存放对象本身。
4.2 栈区
1.栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈区中的数据(原始类型和对象引用)都是私有,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区
4.3 方法区
1.方法区又叫做静态区,和堆一样,被所有线程共享,方法区包含所有的class和static变量。
2.方法区包含的都是在整个过程中永远唯一的元素,如:class,static变量
5. 构造方法(重点)
构造方法作用就是对类进行初始化。如果你没有定义任何构造方法,程序会为一创建一个不带任何参数的构造函数,那么你产生类的对象时候只能用不带参数的方法,如 class Phone{} 没有任何构造。
构造方法就是与类同名的那个方法,作用初始化
语法格式
class 类名(){
类名(形参列表){
构造方法体;
}
}
例如:
class Person{
Person(){
}
}
注意事项
构造方法的名称与类名称完全相同,大小写一致
构造方法没有返回值类型,连void都不允许有
当创建一个新的对象的时候,会自动调用构造方法来进行对象中成员变量的初始化工作。
默认构造
当自定义类中没有声明任何形式的构造方法时,则编译器会自动添加一个无参构造,空的构造方法,叫做默认/缺省构造方法:比如 Person(){}
但是类中只要定义了构造方法,则编译器不再提供任何形式的构造方法
6. 方法的重载(重点)
基本概述
在同一个类中,方法名相同参数列表不同的方法之间构成重载关系(Overload);
方法重载的表现形式
方法重载的主要体现在:参数的个数不同、参数的类型不同、参数的顺序不同
方法名称要相同,
形参变量名与返回值类型无关,但是建议返回值类型最好相同。
判断方法重载的核心:判断调用方法是否能加一区分。
参考:java.io.PrintStream类中print()和println()
作用
方法重载的意义在于:调用者只需要记住一个方法名就可以调用各种不同的版本,从而可以实现多种类型数据的处理。
7. this关键字(难点)
对于构造方法来说,this关键字就代表当前正在构造的对象;
对于成员方法来说,this关键字就代表当前正在调用的对象;
原理:
由于不同的对象调用同一个方法时,在方法体的内部使用this进行记录,因此this代表的对象也就不同,当访问成员变量时候默认解析为:this.成员变量名,其中this.相当于汉语中“我的”,因此this的不同导致结果的不同
使用场合:
当形参变量名和成员变量名相同的时候,在方法体的内部会优先选择变量使用,此时就需要使用this.的方式明确使用的成员变量而不是形参变量(重中之重)。
在构造方法的第一行使用this(实参)的方式可以调用本类重其他构造方法(了解)。
常见异常:
java.lang.NullPointerException ------- 空指针异常
java.lang.ArrayIndexOfBoundsException ------- 数组下标越界异常
Java.lang.ArithmeticException ------- 算数异常
8. 访问控制
8.1 常见的访问控制
public - 公开的
protected - 保护的
default - 默认的
private - 私有的
8.2 访问控制符的比较
访问控制符 访问权限 本类 本包中的其他类 子类 其他包中的其他类
----------------------------------------------------------------------------
public 公开的 1 1 1 1
protected 保护的 1 1 1
default 默认的 1 1
private 私有的 1
要求大家掌握:
a.通常情况下,所以的成员变量都用private修饰,所有的成员方法都用public修饰。
b.public修饰的内容表示可以在任意位置进行访问;
c.private修饰的内容只能在本类的内部进行访问。
8.3 包的定义
package 包名; - 表示创建单层包
package 包名1.包名2.....包名n - 表示创建多层包,也就是多层目录;
为了管理文件方便,避免文件同名引起的冲突。
9. 封装(重点)
9.1 基本概念
通常情况下在测试类中可以给成员变量赋值一些合法但不合理的数值,而程序的执行过程无法检测和提示,和我们的现实有点不太符合。
为了避免上述情况的发生,就需要对成员变量的赋值操作进行合理性的判断和提示,该方式就叫做封装,通俗的来说,封装就是一种保证我们成员变量值合理的机制。
9.2 封装流程
(1)私有化成员变量,使用private关键字修饰;
(2)提供共有的get成员变量和set成员变量的方法,在方法体中进行合理的判断。
(3)在构造方法体中调用set成员变量进行合理值得判断
9.3 练习
自定义Person类实现该类的封装,特征有:姓名、年龄以及国籍,提供一个打印特征的方法。
自定义TestPerson类型,在main()方法中创建Person类的对象并打印特性。
10. static关键字
10.1 基本概念
通过情况下成员变量都隶属于对象层级,每个对象都拥有独立的内存空间来记录自己独有的成员变量,
当所有的对象的成员变量值都完全一样的时候,若每个对象单独记录则会造成内存空间的浪费,此时
应该将该成员变量有对象层级提升到类层级,在内存空间中只保留一份而且被所有的对象所共享,为
了实现该效果使用static关键字来进行修饰,表示静态的含义。
static关键字可以修饰成员变量和成员方法表示隶属于类层级,推荐使用类名.的方式访问
10.2 使用方式
对于非静态的成员方法来说,既可以访问非静态的成员同时也可以访问静态的成员;(成员:成员变量+成员方法)
对于静态的成员方法来说,只能访问静态的成员不能访问非静态的成员;
(执行静态方法时候可以还没有创建对象,非静态成员隶属于对象层级)
只有被所有对象共享的内容才能加static。static不能随便加。
10.3 练习
自定义Singleton类,实现该类的封装
自定义TestSingleton类,在main方法中有且只能得到Singleton类中的一个对象。
11. 继承
人类:
特性:姓名、年龄
行为:吃饭、娱乐
学生类
特征:学号
行为:学生
教师类
特征:薪水
行为:讲课
..........
11.1 基本概念
当多个类之间有相同的特征和行为的时候,就可以将相同的内容提取出来组成一个新类,让原来的这些继承自新类就可以了,从而实现原来的这些类吸收新类中的成员的效果,此时在原来这些类中只需要编写自己独有的成员即可。
换一句话来说,继承就是一种用于提高代码复用性、可维护性以及可扩展性的机制。
在Java语言中使用extends关键字来代表继承的关系。
比如:
class Student extends Person{ } --- 表示Student类继承自Person
其中Person 类叫做超类/父类/基类
其中Student类叫做 子类/孩子类/派生类
11.2 注意事项
1.子类可以继承父类中的成员变量,包括私有的成员变量,但不能直接访问;
子类不可以继承父类中的构造方法以及私有的成员方法。
2.构造子类对象时候会自动调用父类中的无参构造方法,用于初始化从父类中继承下来的
成员变量信息,相当于在子类构造方法中的第一行增加代码:super();
3.在java语言中只支持单继承,也就是一个子类只能有一个父类,但一个父类可以有多个子类;
4.只有满足:子类 is a 父类的逻辑关系才能用继承,不能滥用继承;
12. final关键字(重点)
final本意为"最终的",无法更改的。可以修饰类、成员方法以及成员变量
final修饰类 最终类 表示该类不能被继承
final修饰方法 最终方法 表示该方法不能被重写
final修饰变量 最终变量
12.1 使用方式
final关键字修饰类表示该类不能被继承,比如说:java.lang.System/String类等;
- 通常用于防止滥用继承。
final关键字修饰成员方法表示该方法不能被重写;
-如:java.text.SimpleDateFormat类中的format()方法
- 通常用于防止不经意间造成的重写。
final关键字修饰成员变量表示必须指定初始化而且不能更改。
- 如:java.lang.Thread类中的MAX_PRORITY
- 通常用于描述常量的数据。
补充:
在Java语言中很少单独使用static关键字还有final关键字,通常使用 public static final 共同修饰成员变量来表示常量的概念,常量的命名规则是:所有字母都是大写,不同的单词之间使用下划线连接。
例如:
public static final double PI = 3.14;
13. 创建对象的过程
13.1 单个对象创建过程
1.将xxx.class文件中相关类信息读取到内存空间的方法区,这个过程叫做类的加载。
2.当程序开始运行时找main()方法去执行方法体中的语句,使用new来创建对象。
3.若没有执行初始值采用默认初始化,否则采用执行的数值来作为初始化。
4.可以通过构造块来更改成员变量的数值。
5.执行构造方法体中的语句可以再次修改成员变量的数值。
6.此时对象创建完毕,继续执行后续的语句。
13.2 子类对象创建过程
1.先加载父类再去加载子类,先执行父类的静态语句块,在执行子类的静态语句块;
2.执行父类的构造块,在执行父类的构造方法体,此时父类部分构造完毕。
3.执行子类的构造块,在执行子类的构造方法体,此时子类对象构造完毕;