那个小白说他还没搞懂类和对象,我一怒之下把这篇文章扔给了他
二哥,我就是上次说你《教妹学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();
当然了,我们也可以主动添加带参的构造方法。
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()来创建对象了——编译器会提醒你追加参数。
比如说你将代码修改为
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,更详细的见下图。
接下来,我们来创建多个 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()); // 花色
为什么要这样设计呢?可以直接将 color 字段的访问权限修饰符换成是 public 的啊,不就和 getter/setter 一样的效果了吗?
因为有些情况,某些字段是不允许被随意修改的,它只有在对象创建的时候初始化一次,比如说猪的年龄,它只能每年长一岁(举个例子),没有月光宝盒让它变回去。
private int age; public int getAge() { return age; } public void increaseAge() { this.age++; }
你看,age 就没有 setter 方法,只有一个每年可以调用一次的
increaseAge()方法和 getter 方法。如果把 age 的访问权限修饰符更改为 public,age 就完全失去控制了,可以随意将其重置为 0 或者负数。
访问权限修饰符对于 Java 来说,非常重要,目前共有四种:public、private、protected 和 default(缺省)。
一个类只能使用
public或者
default修饰,public 修饰的类你之前已经见到过了,现在我来定义一个缺省权限修饰符的类给你欣赏一下。
class Dog { }
哈哈,其实也没啥可以欣赏的。缺省意味着这个类可以被同一个包下的其他类进行访问;而 public 意味着这个类可以被所有包下的类进行访问。
假如硬要通过 private 和 protected 来修饰类的话,编译器会生气的,它不同意。
private 可以用来修饰类的构造方法、字段和方法,只能被当前类进行访问。protected 也可以用来修饰类的构造方法、字段和方法,但它的权限范围更宽一些,可以被同一个包中的类进行访问,或者当前类的子类。
可以通过下面这张图来对比一下四个权限修饰符之间的差别:
- 同一个类中,不管是哪种权限修饰符,都可以访问;
- 同一个包下,private 修饰的无法访问;
- 子类可以访问 public 和 protected 修饰的;
- public 修饰符面向世界,哈哈,可以被所有的地方访问到。
好了,我亲爱的读者朋友,本文到此就打算戛然而止了,有什么不满意的,尽管留言,我保证给你上墙的机会。
感谢阅读
我在上大专的时候就学了 Java,但由于基础差,学历低的原因在工作中吃了不少亏。没办法,只能后天弥补。输出倒逼输入,于是我就开启了自己的逆袭之路,不断地学习 Java 核心知识,并将所有心得都写成了文章,发布在博客平台上,没想到,这种坚持不懈的努力成就了一个更好的自己。
如果你也不甘平庸,不想被学历限制自我,那就请和我一起打怪进阶吧!
我不仅分享有趣的技术,还分享有益的程序人生,这些都将会帮助你从一名“屌丝”程序员进阶成为一名优秀的程序员。
非常期待和你的交流,送上我的微信号吧,qing_geee,有任何问题都欢迎随时和我交流,另外,我还组建了一些高质量的技术交流群,感兴趣的可以说下我邀请你加入。
我所有的文章都会第一时间发布在“沉默王二”公众号和 CSDN 博客,如果你恰好喜欢我的文章的话,请微信搜索“沉默王二”吧。
回复关键字“面试”,可以免费获取一份价值连城的面试攻略,美团大佬整理的。
另外回复“并发”,还可以获取一份阿里大牛整理的 Java 并发编程实战指南,只给首次关注的你哦!
- 点赞
- 收藏
- 分享
- 文章举报
- 小白文章之---Spring表达式(SpEl)获取对象值
- 一篇文章带你搞懂JS对象的自我销毁
- 一篇文章带你搞懂JS对象的自我销毁
- 一篇文章轻松搞懂原型对象和原型链
- 一篇文章搞懂Python的类与对象名称空间
- 【小白笔记】PHP学习之路 (23) --对象 __set __get 类和对象的检测
- jquery中怎样把字符串解析成json【前端$.parseJSON(字符串)返回json对象详细看文章内容】
- 面向对象:一切条条框框都不抵,遇见那个恰好的你
- 新人小白的第一篇文章
- 小白文章之---React前端框架和Spring Boot 后端框架调试
- 一篇文章搞懂:词法作用域、动态作用域、回调函数及闭包
- 小白文章之---Spring框架切面编程增强处理
- Reference counted Objects (引用计数对象) - 文章翻译
- 收藏javascript对象文章
- 一篇文章快速搞懂JS中var、let、const的异同之处
- 搞懂Java分布式锁实现看这篇文章就对了
- Java从小白到大佬(面向对象第二部分)
- 搞懂python中的可迭代对象和迭代器对象(即迭代器)
- 一篇文章搞懂装饰器所有用法(建议收藏)
- [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章