Java类和对象详解


本文章,将带着大家正式进入Java类和对象。类和对象是面向对象语言必须要学习的知识点。

一、面向对象初步认识

1.1 什么是面向对象

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

1.2 面向对象与面向过程
我们原来所学的C语言就是面向过程的一门语言,注重过程,而我们现在所学的Java语言以及C++是面向对象的一门计算机语言。二者有一定的区别,面向过程语言更注重的是过程,而面向对象语言更注重结果。

(1)传统的洗衣过程
在这里插入图片描述
这种传统的方式,注重的是洗衣服的过程,少了一个环节可能就不行。但是不同的洗衣方式洗的方式,时间长度等等都是不同的,处理起来就比较麻烦,如果按照这种方式去写代码,将来扩展或者维护起来会比较麻烦。

(2)现代的洗衣过程
在这里插入图片描述
这样的洗衣方式与传统的洗衣方式比起来会方便许多,这样的洗衣过程就是人,衣服,洗衣机,洗衣粉四个对象互相协作完成的,人不需要关心洗衣机是如何洗衣服,如何甩干的。

以面向对象方式来处理问题,就不关注洗衣服的过程,只需将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。

二、类的定义和使用

2.1 简单认识类

类是用来对一个实体对象进行描述的,主要描述该实体(对象)具有哪些属性,特征,哪些功能,描述完计算机就可以识别了。

比如:人类,他是一种高级动物,在Java中可以看作是一个类别。
属性:鼻子,眼睛,嘴巴,胳膊,身体,头发等等…
功能:吃饭,睡觉,跑步,喝水,…

那么我们如何用Java语言来对上面类别进行定义呢?

2.2 类的定义格式

在Java中,定义类的时需要借助class关键字,具体用法如下:

//创建类
class ClassName{

        field;  //字段(属性)或者成员变量

        method;  //成员方法(行为)

}

class为定义类的关键字,ClassName为类的名字,{}为类的主体。

类中包含的内容为类的成员,属性主要是用来描述类的,称之为类的成员变量或类的属性。
成员变量(内部变量)是放在类内部,方法之外的变量。
方法主要说明类具有哪些功能,称为类的成员方法。

class Person{
    //属性
    public String name;
    public int age;

    //行为方法
    
    //睡觉
    public void sleep() {
    }
    //吃饭
    public void eat() {
    }
}

上面就是人这个类的定义格式。
注意:

  • 类名注意采用大驼峰定义。
  • 成员前写法统一为public,后面文章会解释。
  • 此处写的方法不带static关键字。

我们刚刚在一个Java文件中定义了多个类,我们要注意的是:

在这里插入图片描述
根据以上步骤修改即可,当我们以这样的方式更改public所修饰的类名时,系统会默认也把文件名也修改了。(这种方法只适用于一个Java文件中只有一个类的时候)

三、类的实例化

3.1 什么是类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:Dog类和Person类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。

用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。

class Dog{
    public String name;  //姓名
    public String color;  //颜色

    public void barks() {
        System.out.println("汪汪叫~");
    }
    public void wag() {
        System.out.println("摇尾巴~");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1 = new Dog();  //实例化
        dog1.name = "阿黄";
        dog1.color = "黄色";
        System.out.println(dog1.name);
        System.out.println(dog1.color);
        dog1.barks();
        dog1.wag();
        System.out.println("========================");
        Dog dog2 = new Dog();
        dog2.name = "阿黑";
        dog2.color = "黑色";
        System.out.println(dog2.name);
        System.out.println(dog2.color);
        dog2.barks();
        dog2.wag();
    }
}

如上代码,我们定义一个狗类之后,在main主方法中通过new关键字去实例化这个狗类。然后再去给这个实例对象初始化,并调用其中的成员方法。运行结果如下。
在这里插入图片描述

注意:

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

3.2 类和对象的说明

  • 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员。
  • 类是一种自定义的类型,可以用来定义变量。
  • 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。

如下图所示, 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
在这里插入图片描述

四、对象的构造及初始化

4.1 如何初始化对象

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {
	int a;
	System.out.println(a);
}

在这里插入图片描述
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如下代码:

class Student {
    public String name;//姓名
    public int age;//年龄
    public void setStudent(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public void printStudent() {
        System.out.println("姓名:"+name+"\n年龄:"+age);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setStudent("小魏",20);
        s1.printStudent();
    }
}

需要调用之前写的setStudent方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

  • 每次对象创建好后调用setStudent方法设置具体日期,比较麻烦,那对象该如何初始化?
  • 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

4.2 构造方法

(1) 概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

class Student {
    public String name;//姓名
    public int age;//年龄
    public Student() { //构造方法
        this.name = "大强";
        this.age = 21;
        System.out.println("Student()");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        //s1.setStudent("小魏",20);
        s1.printStudent();
    }
}

如上就是一个不带参数的构造方法,大家仔细观察会发现所写的方法没有返回值,甚至连类型也没有写。那么构造方法是什么时候运行的呢,是如何被调用的呢。
在这里插入图片描述
大家看代码中被红框圈住的一行代码,我这样是为了更好的给大家讲清楚,构造方法是什么时候被调用的。
在这里插入图片描述
当我们运行代码后,我们会发现我们构造方法中所写的那行打印的函数在最前面。
在这里插入图片描述
经过我们打断点验证,我们会发现,构造方法在实例化对象的时候就会被调用。构造方法可以帮我们初始化对象成员变量。
那么问题又来了,我们原来没有写构造方法,为什么没有报错,还是可以正常编译运行。
因为对象的产生,换句话说:实例化一个对象的时候,有两步是很关键的:

  • 为对象分配内存
  • 调用合适的构造方法

当我们没有写任何一个构造方法的时候,那么Java编译器会默认自动提供一个不带参数的构造方法。但是这个构造方法没有做任何事情。

总结:我们写自己写构造方法时,编译器会调用我们所写的构造方法,如果我们没写构造方法时,编译器会调用自己默认给的构造方法

构造方法不止一个,我们可以根据自己的需求编写不同的构造方法。也根据自己的需求调用不同的构造方法。这些构造方法之间是重载的关系。

例如,除了上面那种不带参数的构造方法,我们还可以写含有参数的构造方法。如下图所示。
在这里插入图片描述
这样的好处就是我们不用在实例完对象之后再进行初始化,而是在实例化对象的同时传入参数,直接就调用构造方法就可以进行初始化。具体代码如下图所示。
在这里插入图片描述

注意:如果我们写自己的构造方法了,编译器则不会给我们默认提供不带参数的构造方法,(救急不救穷)也就是说,如果我们只写一个含参的构造方法,但是我们在实例化对象的时候,不想传入参数,想调用无参的构造方法,这是行不通的,编译器会报错。如下图所示。

在这里插入图片描述
总结:当一个构造方法都没有的时候,编译器会默认自动给我们提供构造方法,如果我们一旦有一个构造方法之后,编译器便不会再给我们提供构造方法。
注意:构造方法的作用就是对对象中成员进行初始化,并不负责给对象开辟空间。

(2) 特性

  • 名字必须与类名相同
  • 没有返回值类型,设置为void也不行
  • 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
  • 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
  • 构造方法中,可以通过this调用其他构造方法来简化代码。(如下图)
    在这里插入图片描述
    我们可以借助this在构造方法中调用其他的构造方法。上图代码运行结果如下。
    在这里插入图片描述
    注意:this语句只能在所在构造方法的第一行,否则会报错。
  • 构造方法绝大多数是用public来修饰的,特殊情景才会被private修饰。

4.3 默认初始化

在上面我们提到,为什么局部变量在使用前一定要进行初始化,但是成员变量不用呢?
其实是在我们new对象的时候,JVM为成员变量分配好了初始值(原因比较复杂,但我们知道结果就可以)。也就是我们所说的默认初始化。
**即:对象空间被申请好之后,对象中包含的成员已经设定好了初始值。比如:

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

4.4 就地初始化

就地初始化就是在声明成员变量时,直接进行赋初始值。
如下代码所示。

public class Date {
	public int year = 1900;
	public int month = 1;
	public int day = 1;
}

当然,不管是默认初始化,还是就地初始化,以及我们通过构造方法进行初始化,这些都需要我们根据我们不用的应用场景来编写不同的代码。

好啦,以上就是Java类和对象的详细介绍,相信这篇文章能给大家带来帮助。如果觉得博主写的不错的,可以留下你们的关注和点赞,和博主一起共同进步,一起努力。谢谢大家!也欢迎大家到评论下留言讨论。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

褪色~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值