那个小白说他还没搞懂类和对象,我一怒之下把这篇文章扔给了他(1)

简介: 那个小白说他还没搞懂类和对象,我一怒之下把这篇文章扔给了他

二哥,我就是上次说你《教妹学Spring》看不懂的那个小白,没想到你还特意写了一篇入门级的 Java 基础知识,这次真的看懂了,感觉好棒。请原谅我上次的唐突,二哥能够照顾我们这些小白的学习进度,真的是良心了。

以上是读者 KEL 在上一篇基础知识文章发布后特意给我发来的信息,说实话,看完后蛮感动的,良心没有被辜负啊。于是,我愉快地决定了,每隔一两周就写一篇入门级的文章给小白们看。




类和对象是 Java 中最基本的两个概念,可以说撑起了面向对象编程(OOP)的一片天。对象可以是现实中看得见的任何物体(一只特立独行的猪),也可以是想象中的任何虚拟物体(能七十二变的孙悟空),Java 通过类(class)来定义这些物体,有什么状态(通过字段,或者叫成员变量定义,比如说猪的颜色是纯色还是花色),有什么行为(通过方法定义,比如说猪会吃,会睡觉)。


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


public class Pig {
    private String color;
    public void eat() {
        System.out.println("吃");
    }
}



默认情况下,每个 Java 类都会有一个空的构造方法,尽管它在源代码中是缺省的,但却可以通过反编译字节码看到它。


public class Pig {
    private String color;
    public Pig() {
    }
    public void eat() {
        System.out.println("吃");
    }
}



没错,就是多出来的那个 public Pig() {},参数是空的,方法体是空的。我们可以通过 new 关键字利用这个构造方法来创建一个对象,代码如下所示:


Pig pig = new Pig();

1

当然了,我们也可以主动添加带参的构造方法。

public class Pig {
    private String color;
    public Pig(String color) {
        this.color = color;
    }
    public void eat() {
        System.out.println("吃");
    }
}



这时候,再查看反编译后的字节码时,你会发现缺省的无参构造方法消失了——和源代码一模一样。


public class Pig {
    private String color;
    public Pig(String color) {
        this.color = color;
    }
    public void eat() {
        System.out.println("吃");
    }
}


这意味着无法通过 new Pig() 来创建对象了——编译器会提醒你追加参数。


image.png


比如说你将代码修改为 new Pig("纯白色"),或者添加无参的构造方法。


public class Pig {
    private String color;
    public Pig(String color) {
        this.color = color;
    }
    public Pig() {
    }
    public void eat() {
        System.out.println("吃");
    }
}



使用无参构造方法创建的对象状态默认值为 null(color 字符串为引用类型),如果是基本类型的话,默认值为对应基本类型的默认值,比如说 int 为 0,更详细的见下图。



image.png

接下来,我们来创建多个 Pig 对象,它的颜色各不相同。


public class PigTest {
    public static void main(String[] args) {
        Pig pigNoColor = new Pig();
        Pig pigWhite = new Pig("纯白色");
        Pig pigBlack = new Pig("纯黑色");
    }
}

你看,我们创建了 3 个不同花色的 Pig 对象,全部来自于一个类,由此可见类的重要性,只需要定义一次,就可以多次使用。


那假如我想改变对象的状态呢?该怎么办?目前毫无办法,因为没有任何可以更改状态的方法,直接修改 color 是行不通的,因为它的访问权限修饰符是 private 的。


最好的办法就是为 Pig 类追加 getter/setter 方法,就像下面这样:


public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}

通过 setColor() 方法来修改,通过 getColor() 方法获取状态,它们的权限修饰符是 public 的。


Pig pigNoColor = new Pig();
pigNoColor.setColor("花色");
System.out.println(pigNoColor.getColor()); // 花色
相关文章
|
7月前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
74 0
|
6月前
|
容器
一篇文章讲明白Fltk1.3系列教程(3)
一篇文章讲明白Fltk1.3系列教程(3)
49 0
|
6月前
|
JSON 网络协议 Shell
一文搞懂:【Day29】Soket编程
一文搞懂:【Day29】Soket编程
38 0
|
6月前
|
设计模式 Java
【Java设计模式 - 专栏开篇简介】 java设计模式开篇
【Java设计模式 - 专栏开篇简介】 java设计模式开篇
43 0
|
7月前
|
开发框架 .NET Linux
2024年最全C# 图解教程 第5版 —— 第1章 C# 和 ,2024年最新终于有人把Linux运维程序员必学知识点全整理出来了
2024年最全C# 图解教程 第5版 —— 第1章 C# 和 ,2024年最新终于有人把Linux运维程序员必学知识点全整理出来了
2024年最全C# 图解教程 第5版 —— 第1章 C# 和 ,2024年最新终于有人把Linux运维程序员必学知识点全整理出来了
|
7月前
|
C++
面试题:讲讲面向对象
面试题:讲讲面向对象
66 0
|
存储 安全 网络协议
小白带你学习LinuxSSH服务(二十三)
小白带你学习LinuxSSH服务(二十三)
74 0
|
存储 编译器 C语言
【C++初阶】二、类与对象(上篇)
目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1 计算类对象的大小 7.2 类对象的存储方式猜测 八、this 指针 8.1 this指针的引出 8.2 this 指针的特性 九、关于C++的代码风格
7039 0
【C++初阶】二、类与对象(上篇)
|
编译器 C++
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
编译器 C++
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)