教妹学Java(二十三):怎么理解 Java 中对象和类的概念?

你好呀,我是沉默王二,CSDN 排名前十的博客专家。这是《教妹学 Java》专栏的第二十三篇,我们来理解一下 Java 中的对象和类,以及它们俩的概念——什么是对象?什么又是类?

本专栏中的代码已收录到 GitHub github.com/itwanger ,里面还有我精心为你准备的一线大厂面试题。

三妹上的洛阳理工,校区离我家很近, 所以每逢周末她都会来我家,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,以及父母给我们的这份血缘关系,我觉得义不容辞。

“二哥,这次我们要学习的内容是‘对象和类’,对吧?”看来三妹已经提前预习了我上次留给她的作业。

“是的,三妹。Java 是一门面向对象的编程语言,所以我们需要使用对象和类来设计程序。 ”我面带着朴实无华的微笑回答着她,“Java 中的对象既是物理实体也是逻辑实体,而 Java 中的类仅仅是逻辑实体。”

01、Java 中的对象是什么

具有状态和行为的实体被称为对象,例如铅笔、苹果、书本、书包、黑板,这些是物理存在的,有形的。

也可以是逻辑上存在的,我们按照想象力把它设计出来的。比如说支付宝、微信。

对象具有三种特征:

  • 状态:描述了对象给人的直观印象(名词),比如说人的名字、年纪、性别。

  • 行为:表示对象具有的功能(动词),比如说人可以吃饭、睡觉、打豆豆。

  • 定义:Java 虚拟机在内部会使用一个唯一标识(对外部是不可见的)来标记每一个对象。

02、Java 中的类是什么

类可以看做是创建对象的一个模板,我们来通过一个简单的例子理解一下类的定义。

/**
 * @author 沉默王二,一枚有趣的程序员
 */
public class Person {
    private String name;
    private int age;
    private int sex;

    private void eat() {

    }

    private void sleep() {

    }

    private void dadoudou() {

    }
}

一个类可以包含:

  • 字段
  • 方法
  • 构造方法

在 Person 类中,字段有 name、age 和 sex,它们也称为实例变量或者成员变量——在类内部但在方法外部,实例变量在编译时不占用内存空间,在运行时(对象实例化 new Person())获取内存——这也正是它被称作“实例”变量的原因。

方法有 eat()sleep()dadoudou(),表示 Person 这个对象可以做什么。

咦,没有构造方法呢?的确在 Person 类的源码文件(.java)中看不到,但在反编译后的字节码文件(.class)中是可以看得到的。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.itwanger.twentythree;

public class Person {
    private String name;
    private int age;
    private int sex;

    public Person() {
    }

    private void eat() {
    }

    private void sleep() {
    }

    private void dadoudou() {
    }
}

public Person(){} 就是默认的构造方法,因为是空的构造方法(方法体中没有内容),所以可以缺省。

03、如何创建 Java 对象

创建 Java 对象时,需要用到 new 关键字。

Person person = new Person();

这行代码就通过 Person 类创建了 Person 对象。所有对象在创建的时候都会在堆内存中分配空间

创建对象的时候,需要一个 main() 方法作为入口, main() 方法可以在当前类中,也可以在另外一个类中。

第一种:main() 方法直接放在 Person 类中。

public class Person {
    private String name;
    private int age;
    private int sex;

    private void eat() {

    }

    private void sleep() {

    }

    private void dadoudou() {

    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

输出结果如下所示:

null
0
0

第二种:main() 方法不在 Person 类中,而在另外一个类中。

实际开发中,我们通常不在当前类中直接创建对象并使用它,而是放在使用对象的类中,比如说 PersonTest 类。

可以把 PersonTest 类和 Person 类放在两个文件中,也可以放在一个文件(命名为 PersonTest.java)中,就像下面这样。

/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class PersonTest {
    public static void main(String[] args) {
        Person person = new Person();
    }
}

class Person {
    private String name;
    private int age;
    private int sex;

    private void eat() {

    }

    private void sleep() {

    }

    private void dadoudou() {

    }
}

04、如何初始化对象

在之前的例子中,程序输出结果为:

null
0
0

为什么会有这样的输出结果呢?因为 Person 对象没有初始化,因此输出了 String 的默认值 null,int 的默认值 0。

那怎么初始化 Person 对象(对字段赋值)呢?

第一种:通过对象的引用变量。

public class Person {
    private String name;
    private int age;
    private int sex;

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "沉默王二";
        person.age = 18;
        person.sex = 1;
        
        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

person 被称为对象 Person 的引用变量,见下图:

通过对象的引用变量,可以直接对字段进行初始化(person.name = "沉默王二"),所以以上代码输出结果如下所示:

沉默王二
18
1

第二种:通过方法初始化。

/**
 * @author 沉默王二,一枚有趣的程序员
 */
public class Person {
    private String name;
    private int age;
    private int sex;

    public void initialize(String n, int a, int s) {
        name = n;
        age = a;
        sex = s;
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.initialize("沉默王二",18,1);

        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

在 Person 类中新增方法 initialize(),然后在新建对象后传参进行初始化(person.initialize("沉默王二", 18, 1))。

第三种:通过构造方法初始化。

/**
 * @author 沉默王二,一枚有趣的程序员
 */
public class Person {
    private String name;
    private int age;
    private int sex;

    public Person(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public static void main(String[] args) {
        Person person = new Person("沉默王二", 18, 1);

        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

这也是最标准的一种做法,直接在 new 的时候把参数传递过去。

05、什么是匿名对象

匿名对象意味着没有引用变量,它只能在创建的时候被使用一次。

new Person();

可以直接通过匿名对象调用方法:

new Person().initialize("沉默王二", 18, 1);

06、一次性创建多个对象

可以通过下面的方式一次性声明多个基本类型变量:

int a=10, b=20; 

a 和 b 的类型一样,都是 int,就可以通过“,”的形式声明多个。一次性创建多个对象的方式和这个类似:

Person person1 = new Person(), person2 = new Person();

07、ending

“二哥,结束了吗?我还想学呢?”三妹虽然精神焕发,没有丝毫的疲惫,但我已经犯困了。

“三妹啊,哥要休息会,咱们下次再学好不好?”我站起来,转了转僵硬的脖子。。。。。。与此同时,耳朵的右后方传来了几声“叭叭叭”的声音。

二哥肝了两天两夜,《程序员不可或缺的软实力》第一版强势来袭,纯手敲,足足 20 万字精华文章,贯穿了我十余年的编程生涯,涉及到了生活和工作中的方方面面,如果你是迷茫的在校大学生,或者刚入职的新人,相信我的个人经历,可以给你带去一些思考,从而树立起正确的人生观和价值观。

那这份 PDF 该怎么获取呢?

链接:https://pan.baidu.com/s/1TA3txLvHxQNJEOJUHSZEqQ 密码:ps7z

如链接失效,请转至备用链接:https://shimo.im/docs/pJQv6qVcHqdYwrxx

最后,真心希望这份 PDF 能够对大家起到实质性的帮助,我也会在后面不断完善这本电子书,敬请期待。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉默王二

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

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

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

打赏作者

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

抵扣说明:

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

余额充值