第四章 类与对象
4.1 编程语言几个发展阶段
4.1.1 面向机器语言
- 就是01010这样由0和1构成的语言。由于不同型号的机器电路不同所以,同样的格式表达的意思可能不同。
4.1.2 面向过程语言
- 特别的针对过程(可以简单的理解为算法),将要完成的任务划分成一个个步骤,然后通过算法去执行。
4.1.3 面向对象的语言
- 将要完成的任务划分成一个一个的对象,划分之后可以实现一些简便的的操作。
- 对象:可以是生活中的某个东西。(也可以简单理解为一个一句话的主语,eg:汽车刹车了。)
- 面向对象的三大特征
- 封装性(抽象性)
- 将同类事物的行为和状态提取(抽象)出来。
- 类:上述中的同类事物。
- 变量:上述中的状态。
- 方法:上述中的行为。
- 将同类事物的行为和状态提取(抽象)出来。
- 继承
- 举例:子类可以继承父类的内容(第五章详细讲)
- 多态
- 现在也学不懂,以后第五章会学习
- 封装性(抽象性)
4.2 类
4.2.0 类、类体、变量、方法的图示
4.2.1 类声明
- 类是封装数据和算法用的。
- 类声明的例子
class People{ //class前边还可以加public等修饰语,含义以后再说 …… } class 植物{ …… }
- 给类命名的规则
- 如果类名是拉丁文要大写首字母
- 如果有多个单词符合而成要把每个单词首字母大写(驼峰)
4.2.2 类体
-
类体内容(类体内只有两个部分“成员变量”“方法”)
- 变量的声明:存储属性的值。
- 方法的定义:方法可以对类中声明的变量进行操作,即给出算法。
-
例子
- 求梯形的例子(这个不能输出结果只是展示一下变量和方法的是什么)
class Ladder{ float above; //梯形的上底(声明变量) float bottom; //梯形的下底(变量声明) float height; float area; //梯形的面积(变量声明) float computerArea(){ //定义方法computerArea area = (above+bottom)*height/2.0f; return area; } void setHeight(float h){ height = h; } }
-
杂
- 在一个类内方法和变量的位置可以互换
4.2.3 成员变量
- 成员变量:变量声明的部分是类的成员变量。
- 变量的类型:成员变量的类型可以使Java中的任何一种数据类型。
- 琐碎知识
- 成员变量在整个类内的所有方法里都有效,其有效性与它在类体中书写的先后位置无关。但是如果声明成员变量a时,指定的初始值和其他成员变量的的值有关,那么声明这些成员变量的位置要在声明成员变量a的前边。(简单来说就是都按顺序肯定没毛病)
- 成员变量一定会有初始值,即使没有初始化。
- 注意:不能在方法外进行赋值,因为方法外只能声明变量进行初始化。
class A{ float height = 1; height = 11; //这里就是错误要进行赋值只能在方法中赋值,因为赋值是过程。 }
- 一般不提倡把变量分散在方法之间写
- 编程风格
- 一行只声明一个变量
- 变量的第二个单词的首字母大写
- 不要把m、n、l、1放在一起写,尽量见名思意,都用英文名字写。
4.2.4 方法
- 理解:方法和变量都是等价的。变量需要用int声明,方法也需要用int声明
- 方法的组成:方法头,方法体
- 方法头
- 方法头由类型(例如:int等)、名称和名称之后的一对小括号以及其中的参数列表构成
int speak(){ //方法头 return 23; //方法体 }
- 方法的类型:方法返回的数据类型可以使java中的任何一种数据类型,当一个方法是void类型是,该方法就不需要返回数据。
- 方法体
- 方法体的内容:局部变量的声明和java语句,即在方法体内可以对成员变量和方法体中的局部变量进行操作。
int gerSum(int n){ //参数用int声明一个方法,参数变量n是局部变量 int sum=0; //声明局部变量sum for(int i=1;i<n;i++){ //for 循环语句 sum=sum+1; } return sum; //return 语句 }
- 局部变量之在方法内有效,并且与位置有关。
- 局部变量没有初始值
- 区分成员变量和局部变量
- 如果成员变量和局部变量名字相同时,那么成员变量被隐藏,即该成员变量在这个方法内暂时失效。
- 如果成员变量被隐藏但是还想要用就是用关键字
this
。
class Tom{ int x = 10; int y; void f(){ int x = 5; y = x+this.x; //y得到的值是10 } }
4.3 构造方法与对象的创建
- 对象:用类定义的变量。
- 理解:可以用int定义变量理解,这个使用类定义的变量
4.3.1 构造方法与对象的创建
- 构造方法:使用类创造对象的时候就必须使用构造方法。
- 构造方法格式要求
- 构造方法的名字必须要与类型相同,第一个字母必须大写
- 一个类中,不能有两个完全相同的构造方法(不同的地方就是参数)
- 如果类中没有构造方法,编译的时候会默认只有一个构造方法,并且没有参数
4.3.1.1 默认构造方法和自定义构造方法
- 如果类中定义了一个或者多个构造方法那么java不提供默认构造方法
没有自定义构造方法例子
class A{ int x,y; }
等价于
class A{ int x,y; A (){ } }
4.3.1.2 构造方法没有类型
class Point{
int x,y;
Point(){ //是构造方法
x = 1;
y = 2;
}
int Point(){ //不是构造方法,有类型“int”
x = 1;
y = 2;
}
void Point(){ //不是构造方法,有类型“void”
x = 1;
y = 2;
}
}
4.3.2 创建对象
- 创建一个对象包括两个步骤:对象的声明和为声明的对象分配变量
- 对象的声明
类的名字 对象的名字 Ladder ladder //等价于int a[];
- 为声明的对象分配变量
- 格式
对象的名字 = new 构造方法的名字 XiyoujiRenwu zhubajie; zhubajie = new XiyoujiRenwu();
- 对象的内存模型
- 声明时的内存模型(
XiyoujiRenwu zhubajie
之后)
- 为对象分配变量后的内存模型(
zhubajie = new XiyoujiRenwu()
之后)- 将西游记类中的成员变量分配空间,然后执行构造方法的语句,并初始化成员变量
new
运算符再为变量分配内存后,计算(是一个计算)一个称作引用的值(改值代表着这些成员变量的内存位置及相关信息的重要信息),即表达式new XiyoujiRenwu()
是一个值- 图示
- 当用类创建两个不同的对象的时候,两个对象的栈内的地址不同,因为是重新分配空间的
- 声明时的内存模型(
4.3.3 使用对象
- 使用对象的格式
调用变量:对象名.变量 调用方法:对象名.方法
4.3.4 对象的引用和实体
- 重要结论:一个类声明了两个对象,如果两个对象具有相同的引用,那么这两个对象具有两个相同的变量(实体)。
- 图示
- 两个对象与实体的关系
- 对象进行相互赋值之后的关系(原因是因为赋值的不是变量是引用)
- 两个对象与实体的关系
4.4 类与程序的基本结构
- 知识点
- 一个Java
程序
称作一个工程,是由若干个类构成。 - 提倡一个源文件中只放一个类
- 一个类中可以调用其他符合条件的类
- 一个Java
4.5 参数的传值
4.5.1 传值机制
- 方法中参数变量的值是调用者的值的拷贝。习惯上称方法中的参数是形参,向其传值的变量是实参。传值结束之后改变形参或者实参的值的改变相互不影响。
4.5.2 基本数据类型参数传值
- 就是位数高类型不能给位数低的类型传值。
4.5.3 引用类型参数传值
- 复习:对象中存放的是引用,
new
过的对象有一个空间放实体。
- 当参数是引用类型时,参数传值传递的是引用。所以改变参数中的实体会改变原来的引用类型参数中的实体。但是改变参数中的引用,不改变原来的引用。
4.5.4 可变参数
- 使用方法:
int ...a
代表创建一个为止长度的数组,同理第一个数字是a[0]。 - 使用范围:只能在方法的形参中使用。
4.6 对象的组合
- 对象的组合:在某个类(B)中把其他类(A)的对象作为成员变量,在用这个类(B)创建对象时,就对组合其他类(A)的方法。
4.6.1 组合与复用
- A组合B之后A就可以调用B的方法和变量。
4.6.2 类的关联关系和依赖关系的UML图
略
4.7 实例成员与成员类
- 类中的内容重新认识
- 成员变量的声明规则
- 类变量
static 变量名
(不能用static声明局部变量) - 实例变量
变量名
- 类变量
- 类变量的使用:可以通过类名直接访问或者用对象访问。
- 成员变量内存分配空间问题:实例变量在创建对象之后才分配空间,类变量在写完类之后就开辟了空间。
4.8 方法重载
- 方法重载的意思:方法名字相同,但方法中的形参不通。(一般用于方法都是做同一样的事情,但是其中的变量不同)
- 方法重载需要满足的条件
- 参数个数不同
- 单数个数相同,但是单数类型相同
4.9 this关键字
- 不能出现在类方法中,this也不能出现在静态方法中,以为不用创建对象就可以调用静态方法。(在类方法中代替this的是对象名称)
- 自己理解:this是在未出现对象时,用于指代类中的变量或者方法。
4.10 包
- 作用:区分类名相同的源文件,储存分类源文件。
- 命名规则:合法表示符加点构成,例子:
std.dgt.df.d
- 如果省略了包默认为“无名包”中
- 在命令行窗口中的编译方法
包的目录+包名
(在一些软件中都不用这些)
4.11 import语句
- 语法:
import 包名.包中的类名
(引入具体的类)或import 包名.*
(引入包中的全部的类) - 两种引入的区别:第二种可能会增加编译时间,但是不增加运行时间。
- 注意:当使用import的源文件中有和引用的包相同的类名时,建议根据自己的需求改变二者任意一个包名。
- 如果是自定义包的引用:路径报名左对齐(到时候再查)
4.12 访问权限
范围 | private | default(友好类) | protected | pulice |
---|---|---|---|---|
同包同类 | √ | √ | √ | √ |
同包不同类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包的非子类 | √ |
- 四种访问,三个关键字
- 访问权限可以控制变量和方法
- 访问权限是控制的是类体之外的对象是否可以访问。
- 类的访问权限只有:有好的和public两种。
- 私有变量和私有方法
- 关键字
private
- 功能:只有在类体中可以访问,类体之外不可以访问。
- 存在的意义:在同一个类体中可以同时存在私有和公共的,在调用公共的方法时,可以间接访问私有的变量或者方法。(在编程时不推荐这么使用)
- 关键字
- 公有变量和方法
- 关键字
public
- 功能:谁都可以访问。
- 关键字
- 受保护变量和方法
- 关键字:
protected
- 功能:超出包的范围不可以访问。(和友好的区别是在继承上的区别)
- 关键字:
- 有好的变量和方法
- 关键字:没有关键字
- 功能:超出包的范围不可以访问。
4.13 基本类型的封装
- 老师教的是构造一个类单独放一个数据,但是不了解具体的作用
- 基本类型封装的关键字:
Byte
,Short
,Character
,Integer
,Long
,Float
和Double
(这里调用的包是byteValue()
,shortValue()
,charValue()
,intValue()
,longValue()
,floatValue()
,doubleValue()
) - 使用基本类型封装的语法
关键字 变量名=数据 Integer number1=0;
- 注意
- 基本类型必须要和要封装的基本类型对象一样。
Double number=new double()
不建议用这种方法封装基本类型
4.14 var声明局部变量
- 不建议用,阅读不方便。
- 适用范围:在Java SE10开始增加了“局部类型判断这一新功能”。
- 功能:不用自己写代码是判断变量是什么类型,用
var
就可以自动判断。 - 使用方法
- 只能在方法中使用,不能定义成员变量。
- 定义时必须初始化,不能后来输入自己定义变量类型,不是动态变量。
4.15 对象数组
- 和创建普通数组差不多。
- 创建语法
Student []a=new Student[10];//创建一个数组用于存放变量。但是还没有创造对象。 a[0]= new Student(); //创建一个对象
4.16 IRE 扩展与jar文件(不重要,以后要用现学习)
4.16.1 文档性质的jar文件
- jar文件的作用:将多个有包的类压缩成一个jar文件,可以方便用import导入其中的类。
- 压缩成操作步骤
- 先编译通过
- 写清单文件