Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object。
在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更突出,因为 Java 就是一门面向对象的编程语言。
我们先来看下面的代码:
public class Main {
public static void main(String[] args) {
Person person = new Person();
// person.age = 1000; // 编译错误
// System.out.println(person.age); // 编译错误
person.setAge(1000);
System.out.println(person.getAge()); //
person.setAge(10);
System.out.println(person.getAge()); //
System.out.println(person.toString()); // Person@1b6d3586
}
}
class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0 || age > 100) {
return;
}
this.age = age;
}
}
}
public void setAge(int age) {
if (age < 0 || age > 100 ) {
return;
}
this.age = age;
}
}
在上面的代码中,我们定义了 get 和 set 方法来实现私有属性的获取和更改,起到了对私有属性的保护作用。
在上面的代码中,我们还写了一个 toString() 方法,但是我们并没有在 Person 类中定义该方法,这是因为当我们定义 Person 类的时候,系统会默认继承 Object 类,且 Object 类中有 toString() 方法,并且输出为一个 类名@地址,这个字符串没有什么实际意义。因此通常我们要使用一个类的 toString 方法时,就应当重写该方法,重写该方法后,返回的字符串没有严格的格式要求,将来可以根据需求而定,但是原则上该字符串应当包含当前对象的属性信息,只有当我们自定义的类需要重写该方法时,JAVA API 提供的类通常都已经重写了该方法。
下面我们将 toString() 方法进行重写:
public class Main {
public static void main(String[] args) {
Point point = new Point(1, 2);
String string = point.toString();
System.out.println(string); // (1,2)
}
}
class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point() {
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "(" + x + "," + y + ')';
}
}
在上面的代码中,我们定义了一个 Point 类,相当于二维坐标系上的一个点,我们通过重写 toString 方法实现了一个坐标点的位置。
在 Object 类中还有定义好的 equals 方法,意思是比较两个对象,如下:
public class Main {
public static void main(String[] args) {
Point point1 = new Point(1, 2);
Point point2 = new Point(1, 2);
System.out.println(point1 == point2); // false
System.out.println(point1.equals(point2)); // false
}
}
在上面的代码中,point1 == point2 其实比较的是两个类的引用地址,所以为 false,我们看一下 equals 方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
在上面的代码中,Object 类的 equals 方法其实也是相当于 == 的方法来进行比较,所以当我们使用 equals 方法时同样需要进行重写,他的作用是比较两个对象(当前对象与给定对象)内容是否一样,如下:
public class Main {
public static void main(String[] args) {
Point point1 = new Point(1, 2);
Point point2 = new Point(1, 2);
System.out.println(point1 == point2); // false
System.out.println(point1.equals(point2)); // true
}
}
class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point() {
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "(" + x + "," + y + ')';
}
public boolean equals(Object object) {
if (object == null) {
return false;
}
if (object == this) {
return true;
}
if (object instanceof Point) {
Point point = (Point) object; // 强转为point类型
return this.x == point.x && this.y == point.y;
}
return false;
}
}
当我们重写 equals 方法后,就可以获取我们想要的结果了,即上面代码第 6 行结果输出为 true。同样的,只有自己定义的类需要重写,JAVA API 提供的类基本都重写了 equals。
Java 从入门到进阶之路(十八)的更多相关文章
- Java 从入门到进阶之路(八)
在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法. 我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0. ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...
- Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...
- Java 从入门到进阶之路(二十二)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...
随机推荐
- uGUI源码调试
uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...
- Css3 里的弹性盒的比例关系
前两天朋友出去面试遇到了尴尬的问题,原题是:"在一个盒子里包裹着三个子元素,让子元素的宽度以1:1.1:2.1:3的关系依次展示" 这就尴尬了啊.................. ...
- EditPlus等编辑器选中列(块)的方法
EditPlus 1)菜单:编辑 -> 选择 -> 列选择2)先按下 Alt + C ,释放,然后移动鼠标或键盘上下左右键进行选择注意:在自动换行的模式下是不行的,改为不自动换行就行了. ...
- Virtual Judge HDU 1241 Oil Deposits
八方向 深搜 #include <iostream> #include<cstdio> #include<cstdlib> #include<algori ...
- 小议WebRTC拥塞控制算法:GCC介绍
网络拥塞是基于IP协议的数据报交换网络中常见的一种网络传输问题,它对网络传输的质量有严重的影响,网络拥塞是导致网络吞吐降低,网络丢包等的主要原因之一,这些问题使得上层应用无法有效的利用网络带宽获得高质 ...
- django 模型增加字段后迁移失败
任 务:已有models.py文件中定义了 ad类(用来描述广告数据库表结构).现在想增加四个新字段:ad_show_type,big_video_url,is_full_screen,vi ...
- react生命周期方法有哪些?
react生命周期方法有哪些? React 16.3+ getDerivedStateFromProps:在调用render()之前调用,并在每次渲染时调用.需要使用派生状态的情况是很罕见的 comp ...
- web开发中 前端模板->JavaScript->Controller->JavaScript相应 的交互方式
首先画张图了解当下流行的phpweb 数据交互套路: 1,模板与JavaScript的交互 给HTML标签赋予onlick事件,点击后触发js方法,jQuery收集页面信息,分析信息. 2,js与co ...
- Vue实例 动态组件实现选项卡
动态组件 选项卡 有n种实现方法 哈哈哈哈 <style> #app{ width: 260px; height: 200px; background: #fff; box-shadow: ...
- PHP高并发和大流量怎么解决?
PHP高并发和大流量的解决方案 一 高并发的概念 在互联网时代,并发,高并发通常是指并发访问.也就是在某个时间点,有多少个访问同时到来. 二 高并发架构相关概念 1.QPS (每秒查询率) : 每秒钟 ...