Java SE 类和对象

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。再通过实例对象.成员变量或成员方法来定义属性或使用方法。最后的结果:
运行结果1

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.调用成员方法的对象 来表明引用指向当前对象。

注意:

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
  2. this只能在"成员方法"中使用;
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象;
  4. 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的值初始化,并且打印语句。
运行结果2
从运行结果可以看出,在构造方法中变量的值被成功初始化,其中的打印语句也被成功执行。

特性:

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行;
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次;
  4. 构造方法可以重载。(用户根据自己的需求提供不同参数的构造方法)

值得注意的是,当我们没有使用构造方法时,系统会自动生成一份不带参数的构造方法。
但是,一旦我们使用了构造方法,系统将不会提供这份默认的方法。

Java中,在方法内定义一个局部变量时,必须初始化,否则会编译失败。
运行结果3
但是,在上述Data或WashMachi方法中,定义成员变量时,未对其赋值初始化,为什么却可以直接使用呢?
这是由于new关键字的作用。
在使用了new关键字后,对象的空间已经被申请好,并且其包含的成员就已经设置好了初值。

数据类型默认值
byte0
char“\u0000”
short0
int0
long0L
float0.0f
double0.0
booleanfalse

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());
    }
}

运行结果4
要注意,不能在静态方法中访问任何非静态成员,也不能调用任何非静态方法。

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加载类时开辟空间并初始化的;
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并);
实例代码块只有在创建对象时才会执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值