1. 类定义的格式
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
类中的内容为描述类的成员的属性或方法等。例如洗衣机类。
public class WashMachine {
public double length;
public double width;
public double height;
public void washClothes(){
System.out.println("洗衣服");
}
}
在洗衣机类中,有长宽高三个成员变量(属性)和洗衣服的方法。
2. 类的实例化
当我们定义了一个类,就相当于定义了一种新的类型。我们可以将类名作为类型去定义一个新的实例,这个过程就被称为类的实例化。
依然拿洗衣机类作为例子:
public class WashMachine {
public String band;
public void washClothes(){
System.out.println(band+"洗衣服");
}
public static void main(String[] args) {
WashMachine machine1=new WashMachine();
machine1.band="美的洗衣机";
machine1.washClothes();
WashMachine machine2=new WashMachine();
machine2.band="海尔洗衣机";
machine2.washClothes();
}
}
我们可以看到,在main函数中,我们通过new关键字来创建了一个实例化对象machine1和2。再通过实例对象.成员变量或成员方法来定义属性或使用方法。最后的结果:
3. this引用
public class Data {
public int year;
public int month;
public int day;
public void setDay(int year,int month,int day){
year = year;
month = month;
day = day;
}
}
在setDay方法中,当我们的传入参数名与成员变量名相同时,我们会混淆。
当我们把参数名调整后,我们可以思考一下,如果有多个实例对象调用setDay方法,那么在setDay中,它是怎样知道调用它的是哪个对象呢?
public class Data {
public int year;
public int month;
public int day;
public void setDay(int y,int m,int d){
year = year;
month = month;
day = day;
}
public static void main(String[] args) {
Data data1=new Data();
Data data2=new Data();
Data data3=new Data();
data1.setDay(2024,7,13);
data2.setDay(2024,7,14);
data3.setDay(2024,7,15);
}
}
这时候就应该使用this关键字来分辨。
this关键字可以通过 this.调用成员方法的对象 来表明引用指向当前对象。
注意:
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
- this只能在"成员方法"中使用;
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象;
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。
4. 对象的构造及初始化
在Data类中,我们每次创建一次新的实例对象,就要使用一次setDay方法,比较麻烦。
这时候就应该使用构造方法。
public Data(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
System.out.println("构造方法被调用了");
}
public void printData(){
System.out.println("今天是"+year+"年"+month+"月"+day+"日");
}
public static void main(String[] args) {
Data data1=new Data(2024,7,15);
data1.printData();
}
在类中,我们创建了构造方法Data,将Data的值初始化,并且打印语句。
从运行结果可以看出,在构造方法中变量的值被成功初始化,其中的打印语句也被成功执行。
特性:
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行;
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次;
- 构造方法可以重载。(用户根据自己的需求提供不同参数的构造方法)
值得注意的是,当我们没有使用构造方法时,系统会自动生成一份不带参数的构造方法。
但是,一旦我们使用了构造方法,系统将不会提供这份默认的方法。
Java中,在方法内定义一个局部变量时,必须初始化,否则会编译失败。
但是,在上述Data或WashMachi方法中,定义成员变量时,未对其赋值初始化,为什么却可以直接使用呢?
这是由于new关键字的作用。
在使用了new关键字后,对象的空间已经被申请好,并且其包含的成员就已经设置好了初值。
数据类型 | 默认值 |
---|---|
byte | 0 |
char | “\u0000” |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
boolean | false |
5. 封装
面向对象程序三大特性:封装、继承、多态。 而封装指的就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
Java中主要通过类和访问权限实现封装性,访问权限用来控制方法或者字段能否直接在类外使用。
Java提供了四种访问权限符:public,private,protetcted,default。
注意:一般情况下成员变量设置为private,成员方法设置为public.
6. Static成员
static修饰的成员变量被称为静态成员变量。其最大的特性就是它不属于任何具体的对象,而是所有成员所共享的。
静态成员变量既可以通过对象访问,也可以通过类名访问,但一般推荐类名访问。
一般类中的成员变量都设置为private,那么private的静态成员变量该如何在类外访问呢?
在Java中,静态成员一般是通过静态方法来访问的。
public class WashMachine {
private static String factory="山西";
public static String getFactory(){
return factory;
}
}
public class TestWashMachine {
public static void main(String[] args) {
System.out.println(WashMachine.getFactory());
}
}
要注意,不能在静态方法中访问任何非静态成员,也不能调用任何非静态方法。
7. 代码块
代码化块又称为初始化块,属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过 { } 包围起来。但其和方法不同,没有方法名、返回、参数,只有方法体,且不用通过对象或类显式调用,而是在加载类时或创建对象时被隐式调用。
7.1 普通代码块
在方法中定义的代码块被称为普通代码块。
public class Main {
public static void main(String[] args) {
{
int a = 1;
System.out.println(a);
}
}
}
7.2 构造代码块
定义在类中的代码块被称为构造代码块,也称为实例代码块。构造代码块一般用于初始化实例成员变量。
public class Student {
private String name;
{
this.name = "bit";
System.out.println("构造代码块");
}
}
7.3 静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
public class Student {
private static String classRoom;
{
classRoom="429";
System.out.println("静态代码块");
}
}
总结:
静态代码块不管生成多少个对象,其只会执行一次;
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的;
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并);
实例代码块只有在创建对象时才会执行。