类和对象的相关知识
类与对象
类是构造对象的模板
对象的几个特性:行为(对象可以使用哪些方法?)/状态(调用方法,对象会如何响应?)/标识(如何区分有相同行为、状态的不同对象?)
写面向对象程序的方式:先识别类,再为各个类写方法。
类之间的关系:依赖(一个类的方法使用或操控另一个类的对象)/聚合(has-a)/继承
封装
封装是处理对象的重要概念。
将数据与行为组合在一个包中,对对象使用者隐藏具体实现方式。
有些时候,可能想要获得或者设置实例字段的值。那么需要提供下面三项内容:
一个私有的数据字段;
一个公共的字段访问器方法;
一个公共的字段更改器方法。
类中变量的类型
1 字段/成员变量(类中的变量)
2 局部变量(代码块中的变量)
3 参数(方法声明中的变量)
字段(成员变量)
Java编程语言中类的一个成员。
从静态角度,分为静态/非静态字段
从对象和类的角度,分为实例字段(对象变量)/类字段(静态字段)
修饰符为final的变量是常量。分为静态(static final)/非静态(final)。常量也是字段。
static final修饰的常量必须在声明时初始化;
final修饰的实例常量必须在构造对象时初始化。
对象实例可以访问静态属性!!
一般类的组成
修饰符 class 类名{
字段
构造器
方法(实例方法+类方法/静态方法)
}
源代码
多个类可以放在一个源文件中
一个源文件只能有一个公共类(源文件名与该类名匹配)+任意数目非公共类
编译源文件:
javac一个.java文件名,如果使用到了别的类(A.java),寻找A.class,找不到或者.java较.class已更新,则搜索A.java进行编译。
也可以使用*通配符寻找全部编译
用var声明局部变量
但是参数和字段的类型必须声明。
使用对象:构造对象+调用方法
1 构造对象,指定其初始状态; 2 对对象调用类的方法
Java中,要用 构造函数 构造新对象。
如:
Date date = new Date();
new操作符+构造函数会构造一个新对象,而new操作符返回的值是对对象的引用。
date是对象变量,值是对新创建的对象的一个引用。
对象变量:引用了一个对象,不包含对象。任何对象变量的值都是对存储在另外一个地方某个对象的引用。
实例就是对象,比如构造一个新实例就是构造一个新对象。实例变量就是随着对象创建而创建的变量,能被实例/对象调用。类变量/静态变量就是随着类创建而创建的变量,能被类调用。
可以 使用预定义类/构造自定义类 构造对象。
构造函数/构造器(特殊的方法)
一种特殊的方法,用来构造并初始化对象。
1 与类同名。构造该类的对象时,构造器会运行,从而将实例字段(变量)初始化为希望的初始状态。
2 无返回值
3 每个类可以有大于等于一个构造函数(没有写默认有一个无参构造器)
4 构造函数可以有大于等于0个参数
5 与其他方法的不同:总是结合new操作符来调用;不能对一个已经存在的对象调用构造函数来重设实例变量。
方法
隐式参数和显式参数
隐式参数:又称方法调用的目标/接收者
在一个方法中,this指示隐式参数。(方法所处的类的对象)
显式参数:传参的参数。
静态字段与静态方法
静态字段:
一个字段被定义为static,则每个类只有一个这样的字段 (属于类,不属于单个对象) 非静态的实例字段,每个对象都有自己的一个副本
静态常量:
static final
静态方法:
不在对象上执行,无隐式参数
工厂方法: main方法:
静态方法;不对任何对象进行操作;执行并构造程序所需要的对象
更改器方法与访问器方法
前者:修改对象
后者:只访问对象,不修改对象
私有方法
私有方法常常作为辅助方法出现。
方法参数:将参数传递给方法
1 按值调用:接收调用者提供的值
2 按引用调用:接收调用者提供的地址
Java:按值调用!!方法得到的是参数值的一个副本。
比如说一个方法:
public void method(int x , Employee y){
...
}
此方法展示了参数变量的两种类型:基本数据类型+对象引用。
传递基本数据类型参数:
double percent = 10;
tripleValue(percent);
public static void tripleValue(double x){
x = 3 * x;
}
传参过程 :
x初始化为percent值的一个副本;
x→30,但percent仍为10;
方法结束后,参数变量x不再使用。
传递对象引用参数:
harry = new Employee(...);
tripleSalary(harry);
public static void tripleSalary(Employee x){
x.raiseSalary(200);
}
x初始化为harry值的一个副本,也就是x是harry引用的对象的一个新的引用;
raiseSalary方法应用于这个对象引用,x与harry同时引用的那个Employee对象的工资提高200;
方法结束后,参数变量x不再引用;对象变量harry仍然引用那个涨了200工资的对象。
证明Java是按值调用,而不是按引用调用
var a = new Employee("Alice",...);
var a = new Employee("Bob",...);
swap(a,b);
public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
}
最终,交换了x、y两个副本,而a、b没有交换。
总结——方法参数能干什么:
所以,Java中对方法参数:
1 方法不能修改基本数据类型的参数
2 方法可以修改对象参数的状态
3 方法不能让一个对象参数引用新的对象
对象构造的过程
重载(针对方法的机制)
有些类有多个构造器,或方法有相同的名字、不同的参数,这种功能叫重载。
Java可以重载任何方法。
重载解析:查找匹配的过程
三种初始化方式
默认字段初始化 与 显式字段初始化 与 初始化块
(其他字段在调用构造函数时赋值)
默认:构造器中如果没有显式设置字段初始值,则自动赋为默认值(0,false,null)
(方法中的局部变量必须明确初始化)
显式:直接为字段赋值/利用方法调用直接为字段赋值
初始化块:放在类中用{}括起来的一段初始化代码(静态则static{})
静态初始化块是最优先的,并且只会随着类执行一次。
顺序是先运行初始化块,再构造函数顺序向下
关于无参构造器
如果一个类没写构造函数,则会为你提供一个无参构造器,进行默认字段初始化
如果写了构造函数并有参(没写无参的),则直接调用无参不合法。
关于构造器内调用构造器
关键字 this:
1 隐式参数 2 构造器的第一个语句形如this(...),将调用同类另一构造器
类内如何定义参数名?(遮蔽)
因为参数(局部变量)会遮蔽同名的实例字段(成员变量),所以有两种方式:
1 令参数名不同
2 利用this.指示隐式函数,给其赋值
包
包将类组织在一个集合中。
包方便人组织代码,并将自己的代码与别人提供的代码分开管理。
使用包的主要原因是确保类名的唯一性。比如有两个人同时创建了Employee类,可以通过包名进行区分。
从编译器的角度,嵌套的包没有任何关系。如java.util和java.util.jar
类的导入
一个类可以使用所属包的所有类+其他包的公共类
在包中定位类是编译器的工作。类文件中的字节码总是使用完整的包名引用其他类。
访问其他包的公共类时,有两种调用方式:
1 使用完全限定名。形如:java.time.LocalDate today = java.time.LocalDate.now();
2 使用import语句(可以利用*导入包中所有类,也可以具体导入一个类)
ps:只能导入一个包。诸如java..*是不存在的
静态导入(用import语句导入静态方法与字段)
import static ....(如java.lang.System.*)
import static java.lang.Math.*;
sqrt(20);
在包中增加类
(编写源代码时),将包名放在源文件开头。
包访问的范围
public:由任意类使用
private:由定义它们的类使用
无标记:可以被同一个包中的所有方法访问
类路径
类存储在文件系统的子目录中;也可以存在JAR文件中。