你好呀,我是沉默王二,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 能够对大家起到实质性的帮助,我也会在后面不断完善这本电子书,敬请期待。

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

  1. 教妹学Java(二十一):一文带你了解面向对象编程的所有概念

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 的博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我还力求把每一个 ...

  2. 教妹学Java(二十):一文带你彻底了解 Java 中的注释,干货了

    你好呀,我是沉默王二,一枚颜值与才华俱在的程序员.本篇教程通过我和三妹对话的形式来谈一谈"Java 中的注释". 教妹学 Java,没见过这么有趣的标题吧?"语不惊人死不 ...

  3. 教妹学Java(二十二):来吧,一文彻底搞懂Java命名约定

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我还力求把每一个知 ...

  4. 教妹学Java(十三):if-else 语句详解

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"if-else 语句". 教妹学 Java,没见过这么有趣的标题吧?& ...

  5. 教妹学Java(二十六):static 关键字解析

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十六篇,今天我们来谈谈 Java 的 static 关键字--什么是静态变量?什么是静态方 ...

  6. 教妹学Java(三十三):super 关键字的用法

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十七篇,今天我们来谈谈 Java 的 super 关键字--super 关键字有哪些用法? ...

  7. 教妹学Java(三十二):了解 Java 中的返回类型协变

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十七篇,今天我们来谈谈 Java 中的返回类型协变--Java 的返回值类型支持协变.换句 ...

  8. 教妹学Java(十九):continue 关键字详解

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 2019 年度的博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我 ...

  9. 教妹学Java(十四):switch 语句详解

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"switch 语句". 教妹学 Java,没见过这么有趣的标题吧?&q ...

最新文章

  1. 软件工程第二次课后作业——Gaoooo
  2. Web Api单元测试写法
  3. JPA注解@GeneratedValue
  4. 程序的灵魂-----算法
  5. 7.3 MASS批量修改数据(Excel文件上传数据)
  6. 删除出现次数最少字符串JAVA_牛客网——华为机试(题23:删除字符串中出现次数最少的字符)(Java)...
  7. axure 图片切换图片的交互_Axure教程:首页图片轮播
  8. 05-netty小例子
  9. Trick(十四)—— 判断是否序列中所有的元素都相同
  10. iTextSharp操作PDF
  11. 全网最全HTML基础
  12. xquery_使用XQuery查询DB2 XML数据
  13. 魔众抽奖系统 v2.0.0 上线超级砸金蛋抽奖方式
  14. Havel-Hakimi定理(判断一个度序列是否可图)
  15. 第7章:OFDM 信道估计与均衡(1)
  16. ionic3正式发布(ionic2升级到ionic3)
  17. python-如何爬取天猫店铺的商品信息
  18. sha256加密时报错 [TMA] Error: input is invalid type
  19. java Map的知识点
  20. 怎样修改日立uax规格表_日立电梯UAX电气原理图纸维修调试资料手册规格表.zip-3-1敷线检查.doc...

热门文章

  1. 实现文本复制或者剪切到剪切板-Clipboard.js
  2. undo保留时间的几个相关参数
  3. 2020年G3锅炉水处理考试题及G3锅炉水处理模拟考试
  4. forword和sendRedirect区别
  5. Javascript清除所有的cookie
  6. Flink SQL·validate
  7. jupyter的kernel功能:Interrupt、Restart、Clear Output、Run All
  8. 酷狗Andorid5.0新版 手机K歌上风突显
  9. Event-2(鼠标事件)
  10. SIGPIPE and EPIPE