【腾讯云】11.11 云上盛惠,云产品限时抢购,1核2G云服务器首年88元

搜搜吧

查看: 7|回复: 0

[资讯] 零基础学Java:对象和类

[复制链接]
  • TA的每日心情
    奋斗
    前天 13:34
  • 签到天数: 703 天

    [LV.9]以坛为家II

    超级钻石贵宾会员

    1万

    主题

    2万

    帖子

    5万

    积分

    Rank: 1

    UID
    15343
    威望
    -561
    贡献
    8107
    在线时间
    372 小时
    注册时间
    2015-10-12
    发表于 5 天前 | 显示全部楼层 |阅读模式

    fb417954bd83a1da723011fab0f3ec78.jpg-wh_651x-s_1471306666.jpg

    “二哥,我那天在图书馆复习上一节你讲的内容,刚好碰见一个学长,他问我有没有‘对象’,我说还没有啊。结果你猜他说什么,‘要不要我给你 new 一个啊?’我当时就懵了,new 是啥意思啊,二哥?”三妹满是疑惑的问我。

    “哈哈,三妹,你学长还挺幽默啊。new 是 Java 中的一个关键字,用来把类变成对象。”我笑着对三妹说,“对象和类是 Java 中最基本的两个概念,可以说撑起了面向对象编程(OOP)的一片天。”

    01、面向过程和面向对象

    三妹是不是要问,什么是 OOP?

    OOP 的英文全称是 Object Oriented Programming,要理解它的话,就要先理解面向对象,要想理解面向对象的话,就要先理解面向过程,因为一开始没有面向对象的编程语言,都是面向过程。

    举个简单点的例子来区分一下面向过程和面向对象。

    有一天,你想吃小碗汤了,怎么办呢?有两个选择:

    1)自己买食材,豆腐皮啊、肉啊、蒜苔啊等等,自己动手做。

    2)到饭店去,只需要对老板喊一声,“来份小碗汤。”

    第一种就是面向过程,第二种就是面向对象。

    面向过程有什么劣势呢?假如你买了小碗汤的食材,临了又想吃宫保鸡丁了,你是不是还得重新买食材?

    面向对象有什么优势呢?假如你不想吃小碗汤了,你只需要对老板说,“我那个小碗汤如果没做的话,换成宫保鸡丁吧!”

    面向过程是流程化的,一步一步,上一步做完了,再做下一步。

    面向对象是模块化的,我做我的,你做你的,我需要你做的话,我就告诉你一声。我不需要知道你到底怎么做,只看功劳不看苦劳。

    不过,如果追到底的话,面向对象的底层其实还是面向过程,只不过把面向过程进行了抽象化,封装成了类,方便我们的调用。

    02、类

    对象可以是现实中看得见的任何物体,比如说,一只特立独行的猪;也可以是想象中的任何虚拟物体,比如说能七十二变的孙悟空。

    Java 通过类(class)来定义这些物体,这些物体有什么状态,通过字段来定义,比如说比如说猪的颜色是纯色还是花色;这些物体有什么行为,通过方法来定义,比如说猪会吃,会睡觉。

    来,定义一个简单的类给你看看。

    • /**
    • * 微信搜索「沉默王二」,回复 Java
    • *
    • * @author 沉默王二
    • * @date 2020/11/19
    • */
    • public class Person {
    •     private String name;
    •     private int age;
    •     private int sex;
    •     private void eat() {
    •     }
    •     private void sleep() {
    •     }
    •     private void dadoudou() {
    •     }
    • }

    一个类可以包含:

    • 字段(Filed)
    • 方法(Method)
    • 构造方法(Constructor)

    在 Person 类中,字段有 3 个,分别是 name、age 和 sex,它们也称为成员变量——在类内部但在方法外部,方法内部的叫临时变量。

    成员变量有时候也叫做实例变量,在编译时不占用内存空间,在运行时获取内存,也就是说,只有在对象实例化(new Person())后,字段才会获取到内存,这也正是它被称作“实例”变量的原因。

    方法 3 个,分别是 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(){} 就是默认的构造方法,因为是空的构造方法(方法体中没有内容),所以可以缺省。Java 聪明就聪明在这,有些很死板的代码不需要开发人员添加,它会偷偷地做了。

    03、new 一个对象

    创建 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 类中,而在另外一个类中。

    9d34f6214fe9549e49a6db98fa0f1ce0.png-wh_600x-s_4064251011.png

    实际开发中,我们通常不在当前类中直接创建对象并使用它,而是放在使用对象的类中,比如说上图中的 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 的引用变量,见下图:

    4231fb357804f3436cd10da4351528da.png-wh_600x-s_2309883792.png

    通过对象的引用变量,可以直接对字段进行初始化(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 的时候把参数传递过去。

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

    • new Person();

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

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

    “好了,三妹,关于 Java 中的对象和类就先说这么多吧。”转动了一下僵硬的脖子后,我对三妹说。

    “好的,二哥,你辛苦了,我来给你按摩下。”

    本文转载自微信公众号「沉默王二」,可以通过以下二维码关注。转载本文请联系沉默王二公众号。


    搜搜吧社区温馨提示:
    搜搜吧(www.sosoba.org)十分重视网络版权及其他知识产权的保护,针对网络侵权采取如下版权政策:
    1、本站有理由相信网友侵犯任何人的版权或作品,(图文,文字,下载,视频,非法传播),本站有权不事先通知即删除涉嫌侵权的作品和内容
    2、本站将采取必要的网络技术手段,确认为侵权作品或内容的用户有权进行警告、屏蔽、删除的行为,尽可能的防止侵权行为的发生
    3、搜搜吧影视资源均收集自互联网,没有提供影片资源存储,也未参与录制上传,若本站收录的资源涉及您的版权或知识产权或其他利益,我们会立即删除
    4、搜搜吧,删帖,投诉,举报,侵权,若本站侵犯您的权益,附上身份及权利证明,请直接发送邮件到 kefu-sosoba@qq.com 我们将在一个工作日内删除
    过年了,祝各位新年快乐
    Powered by www.sosoba.org Copyright © 2013-2020 搜搜吧社区 小黑屋|手机版|地图|联系站长|腾讯云代金券|帮助中心|公共DNS|seo优化服务|搜搜吧
    广告服务/项目合作/会员购买:QQ 侵权举报邮箱: kefu-sosoba@qq.com  搜搜吧建站时间:创建于2013年07月23日
    免责声明:本站所有的内容均来自互联网以及第三方作者自由发布,版权归原作者版权所有,搜搜吧不承担任何的法律责任,若有侵权请来信告知,我们立即删除!

    GMT+8, 2020-11-25 05:15 , Processed in 0.102891 second(s), 9 queries , MemCache On.

    快速回复 返回顶部 返回列表