Java类和对象

Hello小伙伴们,C语言的更新暂时告一段落,从今天开始,小编会给大家分享自己的Java的学习过程,快来和小编一起学习吧!

大家一定有所耳闻,在Java中一切皆对象,那么今天小编就和大家介绍何为类和对象?


1. 面向对象的初步认知

1.1 什么是面向对象

Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2 面向对象与面向过程

假设:

下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

下图中汽车类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。


Java中的对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。

拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

对比现实对象和软件对象,它们之间十分相似。

软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

Java 中的类

类可以看成是创建 Java 对象的模板。

通过上图创建一个简单的类来理解下 Java 中类的定义:

public class Dog {
    String breed;
    int size;
    String colour;
    int age;
 
    void eat() {
    }
 
    void run() {
    }
 
    void sleep(){
    }
 
    void name(){
    }
}

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法,接下来我们学习如何定义类和使用。

 2.类定义和使用

2.1 简单认识类

类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥) ,描述完成后计算机就可以识别了:

比如:洗衣机,它是一个品牌,在 Java 中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色 ...
功能:洗衣,烘干、定时 ....

2.2 类的定义格式

那么我们该如何定义一个类呢,往下看

在Java中定义类时需要用到class关键字,具体语法如下

// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
class 定义类的关键字, ClassName 为类的名字, {} 中为类的主体。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法:
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}

3.类的实例化

 3.1 什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int double 类似,只不过 int double java 语言自 带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog 类和 Student 类。它们都是类 ( 一种新定 义的类型) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 )
用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象,举个例子:
class Dog {
    public String name;
    public String color;
    
    public void fun1() {
        System.out.println("汪汪汪!");
    }

    public void fun2() {
        System.out.println("摇尾巴!");
    }
}

public class Test_4 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.color = "黄色";
        System.out.println(dog.name);
        System.out.println(dog.color);
        dog.fun1();
        dog.fun2();
    }
}

输出结果:

 

注意事项

  • new 关键字用于创建一个对象的实例.
  • 使用 . 来访问对象中的属性和方法.
  • 同一个类可以创建多个实例.

 3.2类和对象的说明

1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
2. 类是一种自定义的类型 ,可以用来定义变量 .
3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

4.this引用

4.1 为什么要用this引用

我们先来举个例子:

class DateUtil {
    public int year;
    public int month;
    public int day;

    public void setDate(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }

    public void show() {
        System.out.println("年:" + year + "月:" + month + "日:" + day);
    }

}

public class Test_2 {
    public static void main(String[] args) {
        DateUtil dateUtil = new DateUtil();
        dateUtil.setDate(2022, 11, 4);
        dateUtil.show();
    }
}

这段代码我们可以看到一个DateUtil类下有多个成员变量和方法,通过一个新的对象去调用这些成员和方法,但是如果这里我们将SetDate中改写成如下代码:

public void setDate(int y, int m, int d) {
        year = year;
        month = month;
        day = day;
    }

结果:

我们可以看到,这样并不能给类里的成员变量实例化,是因为这里形参名和成员变量名相同,相当于形参给形参赋值,并没有达到预期的效果,那么在这里this的作用就出来了,我们只需要在这些成员变量前面加个this就好了,这样就能赋值并输出了,那么问题来了,什么事this引用呢???

4.2 什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

这里的this表示给当前的对象赋值;

4.3 this引用的特性

  • 1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

  • 2. this只能在"成员方法"中使用

  • 3. "成员方法"中,this只能引用当前对象,不能再引用其他对象

  • 4. this成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收

 5. 对象的构造及初始化

5.1 如何初始化对象

通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败:
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
public static void main(String[] args) {
Date d = new Date();
d.printDate();
d.setDate(2021,6,9);
d.printDate();
}
// 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

 5.2 构造方法

   5.2.1 概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次,举个例子:
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("Date(int,int,int)方法被调用了");
}

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

   5.2.2 特性

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

举个例子:

class DateUtil {
    public int year;
    public int month;
    public int day;

    public DateUtil() {
        System.out.println("调用了该方法");
    }

    public DateUtil(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了3个参数的构造方法!");
    }
    /*public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }*/

    public void show() {
        System.out.println("年:" + year + "月:" + month + "日:" + day);
    }

}

public class Test_2 {
    public static void main(String[] args) {
        DateUtil dateUtil = new DateUtil(2022, 11, 11);
        dateUtil.show();
    }
}

这里我们通过构造方法直接给成员变量初始化,而并没有调用setDate这个方法,这就是构造方法!


我们也可以通过this引用去调用构造方法:

class DateUtil {
    public int year;
    public int month;
    public int day;

    public DateUtil() {
        this(2022,11,11);
        System.out.println("调用了该方法");
    }

    public DateUtil(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了3个参数的构造方法!");
    }
    /*public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }*/

    public void show() {
        System.out.println("年:" + year + "月:" + month + "日:" + day);
    }

}

public class Test_2 {
    public static void main(String[] args) {
        DateUtil dateUtil = new DateUtil();
        dateUtil.show();
    }
}

这里可以发现,我们在主函数中的DateUtil()方法中并没有传参,而是通过构造方法,用this给成员变量初始化,这样输出也能达到预期的结果!

注:当通过this去调用构造方法时,this要放在第一行,否则代码编译不通过

 

5.3 默认初始化

如果在类里的成员变量没有赋值,编译器默认会赋一个初始值:

class DateUtil {
    public int year;
    public boolean month;
    public float day;

    public DateUtil() {

        System.out.println("调用了该方法");
    }

    public DateUtil(int year, boolean month, float day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了3个参数的构造方法!");
    }
    /*public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }*/

    public void show() {
        System.out.println("年:" + year + "月:" + month + "日:" + day);
    }

}

public class Test_2 {
    public static void main(String[] args) {
        DateUtil dateUtil = new DateUtil();
        //dateUtil.show();
        System.out.println(dateUtil.year);
        System.out.println(dateUtil.month);
        System.out.println(dateUtil.day);

    }

运行如下:


这里有张表供大家参考:

 

 

 6.总结

到这儿今天的主题就和大家介绍完了,小编也是刚刚学习java的小白,后续还会给大家分享Java的相关知识,一起学习,一起进步,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bc_小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值