)
本节目标1.面向对象的初步认识1.1什么是面向对象java是一门纯面向对象的语言Object Oriented Program,简称OOP)在面像对象的世界里一切皆为对象。面向对象是解决问题的一种思想主要依靠对象之间的交互完成一件事情。接下来我将用一个简单的图来演示什么是对象什么是类1.2面向对象和面向过程1.传统洗衣服的过程每一个步骤都是参与的——关注的是过程2.现代洗衣服过程对象与对象之间协作完成——关注的是对象此时我们的思路不在是之前c的那种思路而是需要转变成对象的思路一般分为三步1.找对象2.创建对象3.使用对象2.类定义和使用面向对象程序设计关注的是对象而对象是生活中的实体比如洗衣机。但是洗衣机计算机并不认识需要开发人员告诉计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述该过程称为对洗衣机对象实体进行抽象对一个复杂事务的重新认知但是这些简化的抽象结果计算机也不能识别开发人员可以采用某种面向对象的编程语言进行描述比如java语言2.1简单认识类类是用来对一个实体对象来进行描述的主要描述该实体对象具有哪些属性外观尺寸等哪些功能用来干啥描述完成后计算机就可以识别了。2.2类的定义格式在java中定义泪时需要用到class关键字具体语法如下class为定义类的关键字ClassName为类的名字{}中为类的主体演示描述一个洗衣机注意平时我们的书写的基本格式也是一个类main是成员方法但是它没有成员变量所以我们也可以直接在我们的类中使用main方法此时我们想运行程序的话只需要点击左侧的绿色箭头就可以执行我们想执行的main方法演示类我们也可以把它看作一个类型自定义类型和我们基本数据类型一样int long....)我们可以用它来创建对象。演示注意事项1.类名注意采用大驼峰定义(例如Dog2.成员前写法统一为public后面会详细解释3.此处写的方法不带static关键字后面会详细解释2.3课堂练习2.3.1定义一个狗类演示注意事项1.在书写类的时候我们建议一个java文件一个类!!!2.main方法所在的类一般要使用public修饰注意Eclipse默认会在public修饰的类中找main方法3.public修饰的类必须要和文件名相同演示类Test3名和文件名TestDome不相同时可以点击右键类选择Refactor——Rename我们就可以修改类的名字了如果一个类中有很多自定义类的时候是不能修改类的名字只能修改文件的名字ReName File4.不要轻易去修改public修饰类的名称如果要改通过开发工具修改抛出问题现在我们知道了如何定义一个类的语法以及知道了什么是类现在想问这个东西如果去用应该怎么使用即如何初始化呢——对象的实例化3.类的实例化3.1什么是实例化定义了一个类就相当于在计算机中定义了一种新的类型与int、double类似只不过int和double是java语言中自带的内置类型而类是用户自定义了一个新的类型比如上述的Dog类。它们都是类一种新定义的类型有了这些自定义的类型之后就可以使用这些类来定义实例或者称为对象用类类型创建对象的过程称为类的实例化在java中采用new关键字配合类名来实例化对象。演示在我们创建好对象之后接下来就是使用对象了使用对象前首先要知道对象里面有什么以我们创建的Dog这个类来演示它有名字name和年龄age代码演示画图演示访问name和age的方法是dog加点号来使用成员变量对象的引用演示我们可以使用sout去输出name和age演示此时我们发现我们并没有对name和age赋值但却可以直接输出这与我们之前学过的不一样之前对于局部变量如果没有进行初始化的话输出是会报错的演示我们要注意在main方法里面的才叫局部变量name和age是定义在类当中方法的外面叫做成员变量而成员变量是有一个默认值的它有一个规则所以我们刚刚name和age打印出来的结果应该是namenull、age0此时我们知道访问成员的方法那我们就可以给成员变量赋值演示同理可得访问对象的成员方法也是使用名称加点号的方法演示结论通过对象的引用可以去访问对象的成员变量同时也可以访问对象的成员方法如果我们还想给另外一只小狗使用我们这个Dog类的话只需要重新使用一次new给它创建一个对象演示画图演示结论可以通过关键字new实例化多个对象总结3.2类和对象的说明画图演示4.this引用4.1为什么要有this引用先看一个日期类的例子画图演示变式1.假如多设置几个对象我们提出问题这么多对象都调用了同一个setDate方法在这个方法内是怎么区分是哪个对象调用了setDate方法中的year、month、day2.假如成员变量和形参名字一样现象根本没有被进行赋值原因此时在方法中year、month、day都是局部变量局部变量会优先使用。所以在方法中相当于是形参自己给自己赋值并没有修改到对象当中的year、month、day。而且在后面的printDate方法也是打印成员变量的值此时的成员变量并没有值解决方案加this新问题this到底代表什么 答——this代表当前对象的引用又提出一个新问题什么是当前对象怎么判断当前对象4.2什么是this引用this引用指向当前对象成员方法运行时调用该成员方法的对象在成员方法中所有成员变量的操作都是通过该引用去访问。只不过所有的操作对用户都是透明的即用户不需要来传递编译器自动完成。答———哪个对象的引用调用这个方法谁就是this可以打断点进行调试观察提问this是怎么传递的方法中的第一个参数实际上是Date this代表是谁调用了这个方法在java中是隐藏的了我们也可以给printDate方法加上this所以是可加可不加的this但是我们建议加上this养成一种习惯总结只要是访问自己的成员变量的时候都加上this4.3this引用的特性1.this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型2.this只能在“成员方法”中使用3.在成员方法中this只能引用当前对象不能再引用其他对象4.this是“成员方法”第一个隐藏的参数编译器会自动传递再成员方法执行时编译期会负责将调用成员方法对象的引用传递给该成员方法this负责来接收重点this的三种用法1. 可以通过this访问当前对象的成员变量2.可以通过this访问当前对象的非静态的成员方法static3.可以通过this访问当前对象的其他构造方法this的形式——问题什么是构造方法5.对象的构造及初始化5.1如何初始化对象通过前面知识点的学习知道在java方法内部定义一个局部变量时必须要初始化否则会编译失败要让上述代码通过非常简单只需在正式使用a之前给a设置一个初始化即可。如果是对象需要调用之前写好的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题1.每次对象创建好后调用SetDate方法设置具体日期比较麻烦那对象该如何初始化2.局部变量必须要初始化才能使用为什么字段成员变量声明之后没有给值依然可以使用5.2默认初始化为什么局部变量在使用时必须要初始化而成员变量可以不用呢要搞清楚这个过程就需要知道new关键字背后所发生的的一些事情在程序层面只是简单的一条语句在JVM层面需要做好多事情下面简单介绍1.检测对象对应的类是否加载了如果没有加载则加载2.为对象分配内存空间3.处理并发安全问题——比如多个线程同时申请对象JVM要保证给对象分配的空间不冲突4.初始化所分配的空间——即对象空间被申请好之后对象中包含的成员已近设置好了初始值比如5.设置对象头信息关于对象模型后面会介绍6.调用构造方法给对象中各个成员赋值5.3就地初始化在声明成员变量时就直接给出了初始值5.4构造方法构造方法也是一种方法只要是方法就有固定形式但构造方法有一点不一样而且当我们new了一个对象后构造方法是会被执行的小节一个对象的生成至少有两步很重要1.为对象分配内存2.调用合适的构造方法说明构造方法不止一个——可以发生重载演示构造方法的重载总结构造方法的特点1.构造方法不止一个;2.构造方法的作用就是用来初始化对象成员中的成员解答之前的this如何调用构造方法——this的形式演示注意构造方法的调用不能构成环注意到我们之前没有写构造方法的时候new一个对象之后代码也不会报错这是什么原因原因当你没有写任何构造方法的时候Java会帮你提供一个默认的不带参数的构造方法但是一旦你有其他的构造方法Java就不会再给你提供不带参数的构造方法了补充借助IDEA生成构造方法鼠标右键按住ctrl左键选择5.4.1概念构造方法也称为构造器是一个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用一次5.4.2特性1.名字必须与类名相同2.没有返回值类型设置成void也不行3.创建对象时由编译器自动调用并且在对象的生命周期内只调用一次相当于人的出生每个人只能出生一次4.构造方法可以重载用户根据自己的需求提供不同参数的构造方法5.如果用户没有显示定义编译器会生成一份默认的构造方法生成的默认构造方法一定的无参的注意一旦用户定义编译器则不在生成6.构造方法当中可以通过this调用其他构造方法来简化代码注意1.this必须是构造方法中第一条语句2.不能形成环7.绝大多数情况下使用public来修饰特殊场景下会被private修饰后序讲单列模式时会遇到总结类和对象第一块小知识点1.定义类得清楚2.实例化对象得清楚3.通过对象的引用访问对象的属性得清楚4.理解this5.理解构造方法6.封装6.1封装的概念面向对象程序三大特征:封装、继承、多态。而类和对象阶段主要研究的就是封装特性。何为封装呢简单来说就是套壳屏蔽细节。对于计算机使用者而言不用关心内部核心部件比如主板上线路是如何布局的CPU内部是如何设计的等用户只需要知道怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时在外部套上壳子将内部细节隐藏起来仅仅对外提供开关机、鼠标及键盘插孔等让用户可以与计算机进行交互即可。封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互总结补充java中书写get和set的快捷键——ctrlinsert右键——generate6.2访问限定符java中主要通过类和访问权限来实现封装类可以将数据以及封装数据的方法结合在一起更符合人类对事物的认知而访问权限用来控制方法或者字段能否直接在类外使用。java提供了四种访问限定符6.3封装扩展之包6.3.1包的概念在面向对象体系中提出了一个软件包的概念即为了更好的管理类把多个类收集在一起成为一组称为软件包。有点类似于目录。比如为了更好的管理电脑中的歌曲一种好的方式就是将相同属性的歌曲放在相同文件下也可以对某个文件夹下的音乐进行更详细的分类。在java种也引用了包包是对类、接口等的封装机制的体现是一种对类或者接口等的很好的组织方式比如一个包中的类不想被其他包中的类使用。包还有一个重要的作用在同一个工程中允许存在相同名称的类只要处在不同的包中即可。6.3.2导入包中的类以之前的数组中Arrays的类举例Arrays是util包中的一个方法在我们输入Arrays后会在首行自动导入util这个包import后面写包的路径为了告诉java在哪里去找Arrays这个方法import语句是用来导入包的或者如果不在首行导入包的话我们可以在方法前面加上包的路径也是可以的但是我们不建议这样使用因为如果有其他方法也在这个包中你还是需要在首行导入包或者在方法前写上路径当我们两个类的路径都是在用一个包中我们可以使用通配符*但是我们更建议显示的指定要导入类名否则还是容易出现冲突的情况。假如我们在都是用通配符的情况下我们想同时使用util和sql包中的Date时就会报错因为都是并不知道是用哪个路径的Date所以当两个包中有相同的类时其中一个包的类必须在其前面书写路径最后我们还有一种导入包的方法静态导入在import后加上static演示注意事项:import和C的#include差别很大。C必须include来引入其他文件内容但是java不需要。import只是为了写代码的时候更方便。import更类似于C的namespa和using6.3.3自定义包基本规则1.在文件名的最上方加上一个package语句指定该代码在哪个包中。2.包名需要尽量指定成唯一的名字通常会用公司的域名的颠倒形式例如com.bit.demo1)3.包名和代码路径相匹配例如创建com.bit.demo1的包那么会存在一个对应的路径com/bit/demo1来存储演示:第一步创建包第二步给包命名第三步如果创建完包后不是上述图示那么可以按下列方法修正情形方法按小齿轮第四步可以在包中书写内容注意包后面必须写具体的类或者*补充6.3.4包的访问权限控制举例演示为什么在test中不能访问在package.com.bite.www中的a?默认权限——当前a只能在同一个包中访问6.3.5常见的包7.static成员7.1再谈学生类使用前文中介绍的学生类实例化三个对象s1、s2、s3每个对象都有自己特有的名字、性别、年龄学分绩点等成员信息这些信息就是对不同学生来进行描述的如下图所示假设这两个同学是一个班的那么他们是同一个班的那能否给类加上一个成员变量来保存同学们上课时的教室呢答案是不行的。之前在Student类中定义的成员变量每个对象中都会包含一份称之为实例对象因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室这个教室的属性并不需要每个学生对象中都存储一份而是需要让所有的学生来共享。在java中被static修饰的成员称为静态成员也可以称为类成员其不属于某个具体的对象是所有对象所共享的。7.2static修饰成员变量static修饰的成员变量称为静态成员变量静态成员变量最大的特性不属于某个具体的对象是所有对象所共享的静态成员变量特性1.不属于某个具体的对象是类的属性所有对象共享的不存储在某个对象的空间中2.既可以通过对象访问也可以通过类名访问但一般更推荐使用类名访问3.类变量存储在方法区4.生命周期伴随类的一生即随类的加载而创建随类的卸载而销毁注意方法区是另外的一片内存访问静态成员的方法2种总结重点用类名来访问静态成员我们还不需要创建对象都可以访问强化静态成员不需要依赖对象的演示静态的className不依赖对象而name是需要依赖对象的练习试一试计算下列结果答案12画图演示count和你创建了多少个对象没有任何关系都是直接对count进行修改实际上7.3 static修饰成员方法java中被static修饰的成员方法称为静态成员方法是类的方法不是某个对象所特有的。静态成员方法一般是通过静态方法来访问的。static方法的特性1.不属于某个具体的对象是类方法2.可以通过对象调用也可以通过类名.静态方法名...方式调用更推荐使用后者3.不可以在静态方法中访问任何非静态成员变量因为非静态方法有this参数在静态方法中调用时候无法传递this引用关键还是判断好是通过类名调用还是使用对象调用但是注意在非静态方法是可以调用静态方法4.不能再静态方法中使用this关键字总结7.4static成员变量初始化注意静态成员变量一般不会放在构造方法中来初始化构造方法中初始化的是与对象相关的实例属性静态成员变量的初始化分为两种就地初始化和静态代码块初始化1.就地初始化就地初始化值的是在定义时直接给出初始值8 代码块8.1代码块概念以及分类使用{}定义的一段代码称为代码块。根据代码块定义的位置以及关键字又可分为以下四种普通代码块构造代码块静态块同步代码块后续讲解多线程部分再谈8.2 普通代码块普通代码块定义在方法中的代码块8.3 构造代码块构造块定义在类中的代码块不加修饰符。也叫实例代码块。构造代码块一般用于初始化实例成员变量8.4 静态代码块使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量如果出现多个静态代码块和定义的顺序有关className 114className 113总结1.静态代码块不管生成多少个对象其只会执行一次2.静态成员变量是类的属性因此是在JVM加载类时开辟空间并初始化的3.如果一个类中包含多个静态代码块在编译代码时编译器会按照定义的先后顺序依次执行合并4.实例代码块只有在创建对象时才会执行补充静态代码块和实例代码块的执行顺序先静态后实例(与顺序无关如果在加上构造方法的话它的执行顺序是静态、实例最后构造与顺序无关注意1.实例化多个对象的时候静态代码块只会执行一次2.关于是否看先后顺序主要以是不是同理类来判断如果都是静态的就看其先后顺序如果是静态和实例的则无论顺序如何都是静态先执行