面向对象概念
1 课程介绍
-
1.了解什么是面向对象(了解)
-
2.理解什么是类与对象(掌握)
-
3.类的设计(掌握)
-
4.对象的创建与赋值(掌握) instance (实例)对象
-
- 构造方法(构造器-构造函数 )(掌握)
-
- static 修饰符
-
- 包(理解概念和作用)
2 初识面向对象
我们所说的面向对象是一种编程思想,什么是编程思想呢?让你如何去设计程序,同时也能看懂别人的代码
对象,常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方等含义。
我国学者唐震在《接受与选择》一书中把对象看成是围绕着人的、被人用来接受或选择的特定事物。他提出了对象序列说。
编程思想份为很多种
面向对象 oop(Oriented object Programming): 就是一种编程思想(了解) java
面向过程 pop(procedure oriented programming):也是一种编程思想(了解) c
重点: 熟悉(熟练)面向对象中的基本语法,了解面向对象的思想!
3 类与对象
3.1 类和对象理解
*****什么是类?
类是指描述一类事物,或者看成是一个分类, 例如人类Humanity、车类Car
class、Animal,动物类,等
3.2 设计类
设计类:
> 语法:
> class 类名{
> 成员变量 (字段)
> 方法 (具体的一个功能行为)
> }
类规范书写:
①类名首字符大写;
②类名必须具有意义;
③必须写注释;
示例 : 设计一个学生类(模板))
> 参考
> 设计一个学生类代码:
> class Student{
> String name; // 姓名
> int age; // 年龄
> 。。。。
> void eat(){}
> void sleep(){}
> }
*****什么是对象?
对象是指具体的独有个体(也叫实例-instance),
例如马云、王健林、老王、马云的迈巴赫、王石的切诺基、老王的五菱神车、地球、火星等等。类和对象的关系请看下面的图例:
3.3什么是对象
类:人类
对象:撒贝林,马云,王健林,等等
类:车类
对象:出租车,王石的切诺基,五菱宏光
设计一个学生类?
参考:
、
Java类结构中,就三个东西 字段 方法 构造函数 99%
New 出来的,就是对象
4 对象的创建
4.1如何创建对象
暂时 : new 类名(); --------->相当于学籍卡模板复印件(没有具体的学生资料)
4.2给对象字段赋值
如何操作:
想到数组操作:
定义一个变量存储数组的对象的地址,然后使用变量等同于使用对象
①使用int 可以接收Student对象吗?
②使用String来接收Student对象可以嘛?
根据错误提示,需要Student来接收;
Student是类型吗?
以前学习的类型 :基本类型/引用类型,其中引用类型里面包含类,接口 数组,
所有说 类是一种类型,这里的Student也一种类型,它是引用类型;
如何给 学生对象 赋值 和取值?
堆栈内存图分析代码(重点):
下面使用堆栈内存图来解释一下上面代码的流程和存储。从下图中可以看到:
①
每创建一个对象都会在堆内存中开辟一块空间,并且这块空间中具有和类(模板)中一样的成员。
②
每一个对象都被栈中的一个变量所指向,所以操作栈中的变量(s)就如同操作堆中的对象。
③ s.name =
“小明”;其实是把字符串值赋值给s变量指向的堆中的name字段上的,而不是设置给类的,所以我们在分析代码的时候,看到new
Student()对象应该立马想到在堆中有一个对象。
5 构造方法(Constructor)
5.1 构造方法引入
new Student(); 创建一个学生类的对象 (暂时记忆成 new 类名() )
上面代码本质是调用Student中的无参数的构造方法,一个类有一个默认的隐式无参构造方法!
5.2 什么是构造方法
- 啥是构造方法?
构造方法就是一个东西(就是一个结构 和 字段(成员变量)
方法一样都是一个类中的成员之一)
构造方法的结构和普通方法类似,但是和普通方法完全不同两个物种;
① 构造方法的名字和类名一致(包括大小写完全一致)
② 没有返回值类型
③ 构造方法内部不需要返回任何的数据
④ 其他的和普通方法类型 ,可以有修饰(public),可以有形参列表,可以有方法体
注意:new Student()
这个整体既是一个Student对象,又是调用的Student的无参数构造方法
5.3 构造方法特点
- 类中构造方法特点:
① 每一个类中都至少有一个构造方法;
② 如果没有看到(显示的),那么存在一个隐式的无参数的构造方法;
③ 如果一个类中有显示的构造方法,那么隐式的就不存在了;
- 验证new Student()就是在调用构造方法?
① 把隐式的构造方法显示写出来
② 在这个构造方法里面随便写点打印代码
③ 执行new Student(),。。。。
有显示的构造方法,隐含的无参的构造方法就不存在;
5.4 构造方法的作用
① 通过调用构造方法可以创建对象
② 在创建对象的同时给对象的字段赋值
在创建对象的同时给对象的字段赋值–》通过构造方法来完成
5.4 构造方法注意事项
明确:
构造方法(Constructor)和普通方法(Method)是不一样的东西,只是结构有些类似而已;
注意: 1 普通方法可以名字和类名一致,但是不推荐这样,容易混淆;
注意: 2 构造方法的调用方式和普通方法不一样
到目前为止,构造方法的调用方式 : new 构造方法();
编译是否会报错? 不会
现在有返回值类型 void
此方法就是普通方法,只是方法名和类名一样,容易误导人,千万不要这样写!!!
注意:把构造方法 Student 写成小写了 student; 如下图:
原因 : 1 如果是构造方法那么首字母应该大写; 2 如果是普通方法应该有返回值类型
注意:
普通方法和构造方法是不同的两种结构
调用方法不一样
普通方法的调用 : 3种 (类名.方法名())
(对象.方法名)
(直接方法名)–同一个类里面 都要static修饰 或 都没有static
—》 不适用于构造方法
构造方法的调用 : 1(目前) new Xxx(…);
5.5 构造方法小结
方法(Method) 构造方法(Constructor)
① 方法和构造方法是两个不同的东西;
② 方法的调用方式:
> 类名.方法名(...);
> 对象名.方法名(...); // 被调用的方法所在的类的对象.方法名(。。。);
> 方法名(...);
③ 构造方法的调用方式:
目前为止 : new Xxx(…);
不能够使用方法的调用方式来调用构造方法
④ 目前为止,一个类中可以有的成员:
成员变量(字段)
普通方法
构造方法
⑤ 构造方法作用:
创建一个对象
给对象里面字段赋值
目前内容:
①创建类
class 类名{
字段
方法
构造方法
}
②创建对象(new Student())
③ 给对象内容赋值(①构造方法②直接给对象 赋值 s.name = “小王”)
6 匿名对象以及对象的生命周期
6.1 匿名对象引入
上面的代码 为什么打印null呢?
因为上面new了两次;在堆空间了创建了两个对象,值赋值给第一个对象;
这里的对象(new Student()) 其实就是匿名对象;
6.2 什么是匿名对象
- 匿名对象,就是没有名字的对象(创建了一个对象而没有使用变量接收)
6.3 匿名对象使用场景
匿名对象的使用场景: 只是使用一次(调用一次普通的方法)
与静态方法使用类似
6.4 对象的生命周期(了解)
什么是对象的什么周期:
和人类似,就是从开始到结束,对象的什么周期,就是从对象的开始到结束;
人生命周期开启:从妈的肚子里出来;
人生命周期结束:有几种说法,①心脏停止跳动②脑死亡(意外)③或者世界上最后一个记住你的忘记您了,④失联(空难等)
(什么时候开始,什么时候结束)
开始 : new Student() ,new的时候就开始了;
结束(说法1,常见的说法)
:当对象失去所有的引用(没有变量再指向它了(没有变量在存储它的地址)-
相当于失联了,我们无法再使用它了)-- 就是死亡了;(垃圾回收器
并不是立刻进行回收)
结束(说法2) :
对象真正的被销毁(对象会在堆里面占用内存,当把对象的内存空间回收了),Java有自动垃圾回收机制;
7 static关键字 (静态)
7.1 static引入
这是从第一次写hellojava的时候,主方法就见过;static
是Java的一个关键字,也是一个修饰符;
(1)可以修饰什么和不可以修饰什么?(下面有很多术语,记住就好)
可以修饰 方法,字段(不包括局部变量)
不可以修饰 类(外部类),局部变量;
-----》 写代码验证上面的说法
修饰的效果是什么?
7.2 修饰字段
① 有static修饰的字段应该是字段所在 类名.字段名 进行访问
② 没有static 修饰的字段: 字段所在的类的对象来访问
错误的访问方式
7.3 修饰方法
① 有static修饰的方法: 方法所在的 类名.方法名(…);
② 没有static修饰的方法 : 方法所在的类的对象名.方法名(…);
错误的访问方式
7.4 字段:什么时候使用static修饰呢?
我们在写一个字段的时候,是否应该加static —》 根据实际情况
实际情况:
设计一个学生类,其中有name-姓名 字段,是否应该加static 呢? —》
加与不加的效果
结果: Student中的name这样的字段不应该使用static 修饰
因为: static修饰的字段会被所有的对象共享,只有一份
思考 : Student(学生类)中哪些字段是应该使用static修饰呢?
班级? 学校?班主任?名族?国籍?性别?教室。。。 ----> X
哪些字段应该是static的(实际开发为准)π(Math.PI)
例如 : int的位数 32 —》 可以写一个类,里面写一个static修饰的字段 表示位数
Integer.SIZE
> class Test{
> public static final int SIZE = 32;
> }
数学上的π —》 Math.PI
一般static所修饰的字段,都不能更改
一般都是全局常量( public static final 修饰的变量 )使用居多
全局常量: 简单理解 就是public static final修饰的字段
7.5 方法:何时使用static修饰方法?
目的: 使用static修饰的方法调用方便
常见的地方: 一般就是工具方法(关注方法本身的功能),例如:
Arrays中全部都是工具方法(static)
最近我们一般写的方法都写成非静态,除非非得使用static
7.6 static 小结:
① 现在我们写的类(有一定业务意义的类,例如Student)中的成员 都不加static
② 理解上面提到的Java中加static修饰的地方就可以(全局常量)
掌握内容:
①static 可以修饰字段 方法;
②static 修饰字段 或者 方法怎么调用;
③static 修饰字段 表示 共享的内容,明确哪些地方应该使用static进行修饰字段;
设计类的时候,独立去思考一下,该不该加static
7.7 变量分类的详解(下面的术语请背住! 听写)
变量分类的解释方式:(不是难点,知道这些属于什么意思)
变量分类有哪些?
成员变量(也叫字段) : 静态的(类变量)和非静态的(实例变量)
局部变量:不能使用static修饰
分类详解:
--------
位置 是否有static 生命周期(开始) 生命周期(结束)
类变量 类中 √ 类被加载的时候 类被卸载的时候
实例变量 类中 创建对象的时候 对象被销毁
局部变量 方法内部(形参,代码块) 方法被调用的时候 方法调用完毕
理解:
类被加载的时候 : 把类的字节码文件 加载到 JVM中;
局部变量的作用 : 一般都是方法中,为了辅助方法完成功能而临时定义的变量;
类变量 : 有static修饰的成员变量(字段);
实例变量: 没有static修饰的成员变量(字段);
// 以下的说法尽量少用
类 成员 : 静态的 字段和方法
实例 成员:非静态的字段和方法
-------------------------------------
了解:
static修饰的成员(字段和方法)应该使用 类名.成员名访问
也可以使用对象名.成员名,但是不推荐!!!(编译完毕之后也是类名来访问)
8 包(可以学习之前看成是一个文件夹)
8.1 包引入
示例:生活中例子,有很多资源 片
片
国产
欧美
日韩
动作
爱情
恐怖
。。。
怎么管理这些片?
示例2:我怎么管理他们的类型?
8.2什么是包
- 什么是包? 暂时看成是文件夹,用于方便管理文件的一种方式
8.3包作用
① 可以结构化的管理代码
500W项目(1000个文件) 不好查找
② 可以避免类名冲突的问题
一个项目中有可能多个类名一样
8.4如何使用包
①创建包②引用包
如何定义包
- 包命名规范:
hqyj.cn cn.hqyj
一般是公司域名反过来写+项目名+模块名字+子模块名
例如 : hqyj.cn 域名
package cn.hqyj.erp.oa.domain;
注意:不要写错nc.
上班之后 不要写错cn.自己的公司名字 按照公司规范写
规范:①自己一定需要有规范命名的意识,具体怎么写以公司标准为准;
②包名中应该全部都是英文,并且是小写的
--------------------》下面是动手写代码的流程
② 在java源文件中写,写在所有声明类的前面(一个java文件中可以有多个类)
注意:这几天
一旦editplus里面写了包的申明,不要使用editplus里面的编译和运行,使用原生cmd的命令行;
③ 编译(请在命令提示符窗口中进行)
语法 : javac -d . 源文件名.java // 编译的时候不需要包的!
实例 : javac -d . PackageDemo1.java
④ 运行(请在命令提示符窗口中进行)
语法 : java 包名.子包名.类名
实例 : java cn.itsource.test.PackageDemo1
类的完全限定名 : 包名.子包名.类名
- 包的导入(其实本质是导入包中的类)
① 在一个类中需要使用到其它的包中的类,可以先导入在便捷的使用
② 导入的语法 : import 包名.子包名.类名;
③ 注意: 导入包的代码应该在声明包的后面,声明类的前面
④ import java.util.*; 表示导入本类中会使用到的,util包中的类;
只会导入util下面直接的类型,不包括util包的子包中的类型
为什么String类 是Java提供的,它为什么不导入包呢?
⑤ java.lang这是核心包,下面的直接的类型是会自动导入的;
lang包的子包中的类型不会自动导入,需要手动导入
⑥ 特例:在一个类中会用到util中的Date 和sql包中的Date
不能够直接导入两个(不能区分)
怎么办?
导入一个,另外使用完全限定名
建议都使用类完全限定名(java.util.Date或者java.sql.Date)更直接一些
类的完全限定名:包名.类名
Util,sql它都有getTime方法返回毫秒数,自然就可以直接构建
8.5了解Java已有包的分类
java/ javax(java增强包)
java.lang (java的核心包–基本包)
java.util(java的工具包 --集合框架ArrayList LinkedList)
java.io(java IO包 读写文件)
java.net(网络编程)
java.awt/javax.swing(java的图形化界面)
9.课后练习
① 什么是类,什么是对象,举例说明,并使用代码 定义一个类 和对象出来;
万物皆对象,类是事物的抽象,对象是类的实例
public class Cat {
String name;
int age;
public Cat() {
}
\@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat);
}
}
②
定义一个长方形的类Rectangle,里面定义
求面积的方法int getArea(int width,int height)
在定义两个字段,一个长(height)和一个宽(width);并写测试类进行测试;
public class Rectangle {
int height;
int width;
public int getArea(int width,int height) {
return width *height;
}
public static void main(String[] args) {
Rectangle r = new Rectangle();
System.out.println(r.getArea(5, 8));
}
}
④ static 可以修饰什么?有static修饰的字段和方法,应该怎样访问?
没有static修饰字段和方法,又应该怎样访问?
可以修饰方法,字段;类名.字段或方法名;创建一个对象,对象.字段或方法名
⑤ public static void 可以写成 static public void 这样?
可以