类
是构造对象的模板或蓝图,相当于一个项目的一个个小模块
封装
是关于一个对象的一个重要概念,即从形式上来看,他就是将一些数据和行为组合装在一个包内,并对对象的使用者隐藏了数据的实现方式,对象中的数据称为实例域,操纵数据的过称为方法,操纵数据的过程称为方法,一般情况下,数据对外不开放,做到了数据保护,会用一些操纵数据的方法去操作该对象中的数据
对象
Java语言的特征之一就是面向对象,即OOP,对象的三个主要特征:
- 对象的行为 ---可以对对象施加那些操作,或可以对对象施加哪些方法?
- 对象的状态 ---当施加那些方法时,对象如何响应?
- 对象标识 ---如何辨别具有相同行为与状态的不同对象??
类之间的关系
- 依赖
- 聚合
- 继承
依赖:
最明显、最常见的一种关系。如果一个类需要操作另一个类的对象,我们就说这个类依赖于另一个类
聚合:
包含关系,意味着类A的对象包含类B的对象
继承:
父子关系,具有遗传现象,儿子具有父亲的所有特征,并且可以进行变异,也可以拥有自己图特得到特征和方法
对象的使用
1 . 构造对象
(1)使用构造器构造方法
new Date();
new是创建一个对象时需要使用的操作符,
调用类的构造器,类的构造器都是类名加一个括号即Date(),此使成功构造了一个新对象
(2)将创建的对象赋予一个Date型变量,以便于之后的多次使用
Date date = new Date();
此时可以在任何可以使用该date的地方进行使用其方法
2 . 指定其初始状态
可以赋予null表示没有引用任何对象
3 . 使用其对象的方法
date.getFullYear();
类的注意
-
一个类只能有一个公共类,但可以有任意多个非公共类
-
一般一个文件只有一个类,并不习惯于将多个类放在同一个文件中
-
实例域(即一个对象的属性)不推荐使用public进行修饰,应当尽可能使用private修饰,在使用相应的set和get方法进行赋值和取值。
-
构造器不能对一个存在的对象使用构造器来重新设置实例域,构造器的使用必须在对象的初始化,即伴随着new的调用
-
在一个类中,在所有方法不要命名与实例域同名的变量
构造器: - 构造器与类同名 - 每个类可以有一个以上的构造器(类似于方法的重写) - 构造器可以有0、1个或多个参数 - 构造器,没有返回值(即构造器不带类型) - 构造器总是伴随着new操作一起使用,已经存在的对象不能调用构造器,而达到重置实例域的效果
方法的隐式参数和显式参数
public void A(String a){
this.a = a;
}
该方法具有两个参数:
- 第一个参数是隐式参数,输出现在方法名前的该类对象(public void MyClass A)
- 第二个参数是显示参数,位于方法名后面的括号内(String a)
封装性的优点
封装性是Java的三大特性之一,是指利用抽象数据类型将数据和基于数据的操作绑定在一起,使其构成一个不可分割的独立实体,数据被保存在数据类型的内部,尽可能的隐藏其内部的细节,不暴露给外部,对允许外部操作的数据,使用一些方法使外部可以访问进行操作。用户只能使用这些包裹着数据的对外开放的方法进行对这个对象的访问,,用户只需要知道他需要操作的方法即可(当然他也无从得知其中的细节与数据)
封装的好处
- 良好的封装性可以减少耦合(被封装的对象的相互关联性,使对象和数据之间的互相关联性降低,从而不会牵一发而动全身)
- 类内部的结构可以自由修改
- 可以对成员进行更精确的控制,并保证实例域的健康状况
- 隐藏信息,使使用者不知道具体细节
权限的限定
- public 可以在该包下的任何位置使用该方法
- private 只可以在该类中使用该方法,该类之外无法进行访问,实现数据的隐藏
- protected 受保护的,即对其父母子女以及朋友就是开放的,即public;而对其他的使用者就是不可见的,即private
final实例域
被定义为final的实例域,构建对象时必须实例化这样的实例域,并且在之后的操作中,不能对该实例域进行修改。
定义在类上也是不可变的类,并且若使用该类实例化了一个对象,则该final关键字只是表示存储在变量中的对象引用不会在只是其他类的对象。其实该类还可以更改。
静态域和静态方法
1.静态域
每个类只会有一个静态域,即定义为static,静态域只属于类,不属于任何一个方法。每一个对象都会对所有的实例域都有一份自己的拷贝
class Employee{
private static int nextId = 1;
}
2.静态常量
静态常量不需要实例化一个对象,就可以使用一个类中的静态常量 例:
public class Math{
public static final double PI = 3.1415926;
}
使用时,
不需要Math math = new Math();
直接使用Math.PI即可以使用这个静态常量
final变量一般不可以修改,但在System中有一个setOut的方法,是一个本地方法,不是一个Java语言实现的方法
3.静态方法
不能向对象实施操作的方法,即没有隐式参数(没有this参数的方法),直接由类调用使用如:Math.pow(x,a)
使用条件
- 一个方法不需要访问对象状态,其所需参数是通过显示参数提供(Math.pow(x,a))
- 一个方法只需要访问类的静态域(Employee.getNextId)
4.工厂方法
类似LocalDate和NumberFormat的类使用静态工厂方法(factory method)来构造对象 例如:
LocalDate.now;
LocalDate.of;
方法参数
Java中的调用都是按值调用,方法得到的参数也都是一个拷贝,且方法不能修改任何传给他的任意参数变量的内容,只是将一个拷贝了的参数进行了值修改,而本身传进去的参数并没有改变。
当然也有例外,倘若传进去一个数组,因为数组在声明时,是内存给他分配了一块连续的内存空间,所以他的修改是直接寻找这块内存地址,进行修改,之后的方法参数使用其都是对其地址的引用,故修改的时候会去寻找那一段内存地址,进行修改。故数组可以被修改!!!
另外,若参数是一个对象,拷贝之后,且该对象是对其实例域的引用,因此其地址拷贝之后仍不会变,故在使用对象的参数使用其修改方法时,其对象内部对实例域的引用使其实例域发生改变。
方法参数的使用情况
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
对象的构造
重载
当多个方法有相同的名字、不同的参数,便产生了重载。
重载解析: 编译器再调用这些方法时,会根据你的参数类型和参数个数进行匹配,从而选择到适当的函数进行运行,但若找不到匹配的函数方法,则会产生错误。
方法的签名
签名包括:
- 方法名
- 参数类型
注:返回类型不是方法签名的一部分,故两个名字相同、参数类型也相同、只有返回类型不同的两个方法是一种方法。
默认域初始化
构造器中没有显式的初始化赋值,那么就会自动默认被赋值为:数值为0、布尔值为false,对象引用为null。 不推荐使用默认的自动初始化,推荐声明一个实例域的时候可以进行显式的初始化,提高代码的可读性。