一、什么是类
1. 创建一个新类型Student,新类型我们称为 Student类
2. 根据新类型申请一个空间,这个空间可以完整存储一个同学的信息,我们称为一个 Student对象
3. 通过一个引用型变量记录这个空间的起始地址
4. 通过地址找到对应的空间
1、类的定义
类就是类型,是数据类型的复合类型,是一个同时带有特征和行为的数据类型,是创建对象的模板。类 是Java语言的最基本单位
类修饰符 class 类名 {
//类体
}
1. 类修饰符:
访问控制符:public或者不写(包访问权限)
其他修饰符:abstract、final
2、 类名:合法的标识符,首字母大写
3. 类体:
成员变量,如:int score;
静态成员变量,如:static int num;
普通方法:void printSelf(){ }
静态方法:static void printNum(){ }
构造方法:public Student(){}
初始化块:{}
静态初始化方法:static{}
内部类
注意:
1.一个Java文件中可以写多个类,但是编译后还是会生成多个.class文件
2.一个Java文件中最多只能有一个被public修饰的类,这个类的类名必须和Java源文件名保持 一致
3.一个Java文件中如果只有一个类,并且这个类不用public修饰的话,类名和文件名可以不一 样,但习惯上,我们都会写上public
示例:
class Student {
String name;
int score;
public String toString() {
return "name=" + name + ";score=" + score;
}
}
4.成员变量的定义
成员变量:作为类的 成员 存在的变量,也被称为属性。分为静态(static)成员变量和非静态成员变量, 在静态方法中只能访问静态成员变量,在非静态方法中可以访问非静态成员变量和静态成员变量
成员变量修饰符:
访问控制符:public、protected、包(默认)、private
其他修饰符:static、final
final:如果成员变量的修饰符中有final,表示该成员变量只可以被赋值一次,可以在变量声明处 或者构造函数中初始化。
成员变量与局部变量的区别:
1. 定义的位置不同
成员变量:定义于类中,作用于整个类
局部变量:定义于方法或者语句块中,作用于该方法或者该语句。
2.内存中出现的时间和位置不同
成员变量:当对象被创建时,出现在堆内存当中。
局部变量:所属的区间被运算时,出现在栈内存当中。
3.生命周期不同
成员变量:随着对象的出现而出现,随着对象的消失而消失。
局部变量:随着所属区间运算结束,它就被释放。
4. 初始化值不同
成员变量:成员变量因为在堆内存当中,所以他有默认的初始值
局部变量:没有默认的初始值
5. 成员变量和局部变量名字相同,局部变量优先级高。就近原则。
成员变量与静态成员变量的区别:
1. 内存中出现的时间和位置不同
成员变量:当对象被创建时,出现在堆内存当中。
静态成员变量:类被加载时静态变量出现在方法区。
2.生命周期不同
成员变量:随着对象的出现而出现,随着对象的消失而消失。
静态成员变量:类信息被回收时,静态成员变量消失。
5.类中方法的定义
方法必须作为类的成员出现。分为静态方法和非静态方法,在静态方法中只能调用静态方法,在非静 态方法中可以调用非静态方法和静态方法
1.静态能访问静态的,不能直接访问非静态的,如果要访问,必须要创建对象
2.非静态的能直接访问非静态的和静态的。
3. 如果要访问另外一个类中的静态成员变量和静态方法: 类名.静态成员变量 类名.静态方法名
示例:
二、对象的创建以及内存分析
类是对象的抽象(模板),对象是类的具体体现(实例)
1、对象的创建
对象的创建过程也被称为对象的实例化过程。
new Student();
2、类引用型变量
通过一个变量记录对象的地址,从而多次使用这个对象。
类名 变量名; //声明
类名 变量名 = new 类名(); //声明、初始化
注意:引用型变量作为方法参数和返回值,规则同数组作为方法参数和返回值
3、JVM内存布局
程序运行时,JVM会按区域来使用内存,主要的内存空间:
1. 栈空间:在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在 Java 方法栈中生成一个栈 帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机 不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回, Java 虚拟机均会弹出当前栈帧,并将之舍弃。栈空间时线程私有的。
2. 堆空间 Java堆在虚拟机启动的时候建立,它是JVM管理的最主要也是最大的内存工作区域。几乎所有的 Java对象实例都存放在Java堆中。GC主要关注的就是这块空间的回收。
3. 方法区 用于存储已被虚拟机加载的类信息、即时编译的代码等数据
4、JVM内存分配
1. 执行解析1
第一次使用到类时,会将类的信息加载到方法区
Student s1;在栈空间中创建一个引用型变量,可以存储指向对象的引用
new Student();在堆空间分配一个空间,其中成员变量的值为默认值
2. 执行解析2
通过s1找到堆空间的name空间,然后赋值
通过s2找到堆空间的name空间,然后赋值
3. 执行解析3
类中如果有static修饰的成员变量,则创建的对象不包括该成员变量,静态成员变量属于类, 只有一份
注意:字符串常量池、静态成员变量、符号引用在JDK1.7以后已经移动到了堆中。途中为了 便于理解。
s1.num、s2.num使用的都是类中的同一个num,该num位于方法区
4. 执行解析4
对象数组,其实是一个引用数组
5.执行解析5
对象数组的元素可以指向对应的对象
6.执行解析6
多个引用型变量可以指向一个对象。当不需要某个对象时可以将所有执行该对象的引用型变 量赋值为null。当一个对象没有引用型变量指向的时候,GC会在适当的时候回收这个对象。
总结:
1.静态成员变量的使用 静态成员变量和方法都隶属于类,可以通过引用型变量访问,但是最好使用 类名.属性 的语 法来使用。
2.静态方法的使用
3.只要类被加载到方法区,静态方法就可以被调用( 类名.方法名() ),但是在静态方法中不能直接 使用非静态的东西。
三、构造方法的定义
构造方法也叫构造器,是指当实例化一个对象(创建一个对象)的时候,由JVM自动调用的方法。主要 完成对象的初始化。
1. 构造方法没有返回值类型,构造方法是在实例化对象的过程中自动调用的。
2. 如果不写构造方法,系统会默认为我们提供一个无参的构造方法,如果添加了任意一个构造 方法,系统不再提供默认的构造方法。
1、构造方法的调用
自动调用无参的构造方法
示例:
Student student1= new Student();
2、构造方法与普通方法的区别
1、构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用
2、 构造方法没有返回值类型,普通方法的返回值类型要么是确定的类型,要么为void
3、系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加
4、构造方法的方法名称必须和对应的类名保持一致
5、构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只 有在需要使用的时候才被执行,并且一个对象可以调用多次
3、构造方法重载
构造方法可以没有参数,无参的构造方法称为默认构造方法。构造方法也可以有参数,如果一个类总有 多个构造方法,则构造方法形成了重载。
示例:
4、匿名代码块
成员变量可以在声明的位置或者构造方法中初始化,静态成员变量也可以在声明的位置初始化,但是 如果初始化逻辑比较复杂,则可以通过静态初始化块实现。
局部代码块:声明在方法中的代码块,执行时机与声明位置相关, 提前释放变量。(了解)
动态代码块:又称构造代码块或实例代码块,声明在类体中的代码块,创建对象时自动执行一 次,每创建一个对象就执行一次动态代码块。初始化工作。(了解)
静态代码块:使用static关键字修饰的动态代码块,在类加载时自动执行,并只执行一次。(记 住)
示例:
四、面向对象
1、什么是面向对象
面向对象是指一种程序设计的方式。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界 中的关系抽象成类、继承,更利于用人理解的方式对复杂系统进行分析、设计与编程
面向对象优势:
1.模块化:可以独立于其他对象的源代码编写和维护对象的源代码。一旦创建,对象就可以轻 松地在系统内部传递。
2.信息隐藏:通过仅与对象的方法交互,其内部实现的细节仍然隐藏。
3.代码重用:如果对象已存在,则可以在程序中使用该对象。这允许专家实现/测试/调试复杂 的,特定于任务的对象,然后您可以信任这些对象在您自己的代码中运行。
4.可插拔性和调试简便性:如果某个特定对象有问题,只需将其从应用程序中删除,然后插入 另一个对象作为替代对象。这类似于解决现实世界中的机械问题。如果螺栓断裂,则更换 它,而不是整个机器。
2、什么是面向过程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。面向过程求解问题的基本策略是 从功能的角度审视问题域。它将应用程序看成实现某些特定任务的功能模块,其中子过程是实现某项具 体操作的底层功能模块。在每个功能模块中,用数据结构描述待处理数据的组织形式,用算法描述具体 的操作过程。
3、面向对象与面向过程思想的比较
1. 面向过程(c)
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依 次调用就可以了。
2、面向对象(c++,java)
是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事 物在整个解决问题的步骤中的行为。
注意:
面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可 以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求 精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会 体现出一定优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。面对日趋复 杂的应用系统,这种开发思路在就有很大局限性了。对比面向过程,面向对象的方法主要是把事 物给对象化,对象包括属性与行为。程序由各种独立而又互相调用的对象的构成。
4、this关键字
this:表示当前对象的引用。主要用于区分重名的变量(参数和成员变量)和方法(父子类),以及在构造 方法中调用其它构造方法
注意:this调用构造方法只能是构造方法的第一条语句,this调用在同一个构造方法中只能出现一 次
示例:
1、根据要求描述对象
写出厨房里面至少三个类,并创建对象运行。
写出教室里至少三个类,并创建对象运行。
写出动物园里至少三个动物类,并创建对象运行。
2、利用面向对象的思想描述下面的场景
小美在朝阳公园溜旺财【注:旺财是狗】
小明穿着白色的特步运动鞋在奥林匹克公园跑步
赵老师在讲台上讲课,小刚认真的听课做笔记
张阿姨和李阿姨在物美超市买红富士。
五、关键知识点默写
1、类就是类型,是数据类型的复合类型,是一个同时带有特征和行为的数据类型,是创建对象的模板
2、类的定义:
类就是类型,是数据类型的复合类型,是一个同时带有特征和行为的数据类型,是创建对象的模板。类 是Java语言的最基本单位
类修饰符 class 类名 {
//类体
}
3、对象的创建
new 构造方法([参数列表]);
4、引用型变量,通过一个变量记录对象的地址,从而多次使用这个对象。
类名 变量名; //声明
类名 变量名 = new 类名(); //声明、初始化
5、JVM的基本内存布局及分配过程
栈: 方法运行过程中的局部变量
堆:对象
方法区:类信息
6、this关键字 :表示当前对象的引用
this.属性
this.方法
this();//调用其他的构造方法