zoukankan      html  css  js  c++  java
  • Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object。

    在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更突出,因为 Java 就是一门面向对象的编程语言。

    我们先来看下面的代码:

     1 public class Main {
     2     public static void main(String[] args) {
     3         Person person = new Person();
     4 //        person.age = 1000; // 编译错误
     5 //        System.out.println(person.age); // 编译错误
     6         person.setAge(1000);
     7         System.out.println(person.getAge()); // 0
     8 
     9         person.setAge(10);
    10         System.out.println(person.getAge()); // 10
    11 
    12         System.out.println(person.toString()); // Person@1b6d3586
    13     }
    14 }
    15 
    16 class Person {
    17     private int age;
    18 
    19     public int getAge() {
    20         return age;
    21     }
    22 
    23     public void setAge(int age) {
    24         if (age < 0 || age > 100) {
    25             return;
    26         }
    27         this.age = age;
    28     }
    29 }
    30     }
    31 
    32     public void setAge(int age) {
    33         if (age < 0 || age > 100 ) {
    34             return;
    35         }
    36         this.age = age;
    37     }
    38 }

    在上面的代码中,我们定义了 get 和 set 方法来实现私有属性的获取和更改,起到了对私有属性的保护作用。

    在上面的代码中,我们还写了一个 toString() 方法,但是我们并没有在 Person 类中定义该方法,这是因为当我们定义 Person 类的时候,系统会默认继承 Object 类,且 Object 类中有 toString() 方法,并且输出为一个 类名@地址,这个字符串没有什么实际意义。因此通常我们要使用一个类的 toString 方法时,就应当重写该方法,重写该方法后,返回的字符串没有严格的格式要求,将来可以根据需求而定,但是原则上该字符串应当包含当前对象的属性信息,只有当我们自定义的类需要重写该方法时,JAVA API 提供的类通常都已经重写了该方法。

     下面我们将 toString() 方法进行重写:

     1 public class Main {
     2     public static void main(String[] args) {
     3         Point point = new Point(1, 2);
     4         String string = point.toString();
     5         System.out.println(string); // (1,2)
     6     }
     7 }
     8 
     9 class Point {
    10     private int x;
    11     private int y;
    12 
    13     public int getX() {
    14         return x;
    15     }
    16 
    17     public void setX(int x) {
    18         this.x = x;
    19     }
    20 
    21     public int getY() {
    22         return y;
    23     }
    24 
    25     public void setY(int y) {
    26         this.y = y;
    27     }
    28 
    29     public Point() {
    30     }
    31 
    32     public Point(int x, int y) {
    33         this.x = x;
    34         this.y = y;
    35     }
    36 
    37     public String toString() {
    38         return "(" + x + "," + y + ')';
    39     }
    40 }

    在上面的代码中,我们定义了一个 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 方法的源码:

    1   public boolean equals(Object obj) {
    2         return (this == obj);
    3     }

    在上面的代码中,Object 类的 equals 方法其实也是相当于 == 的方法来进行比较,所以当我们使用 equals 方法时同样需要进行重写,他的作用是比较两个对象(当前对象与给定对象)内容是否一样,如下:

     1 public class Main {
     2     public static void main(String[] args) {
     3         Point point1 = new Point(1, 2);
     4         Point point2 = new Point(1, 2);
     5         System.out.println(point1 == point2); // false
     6         System.out.println(point1.equals(point2)); // true
     7     }
     8 }
     9 
    10 class Point {
    11     private int x;
    12     private int y;
    13 
    14     public int getX() {
    15         return x;
    16     }
    17 
    18     public void setX(int x) {
    19         this.x = x;
    20     }
    21 
    22     public int getY() {
    23         return y;
    24     }
    25 
    26     public void setY(int y) {
    27         this.y = y;
    28     }
    29 
    30     public Point() {
    31     }
    32 
    33     public Point(int x, int y) {
    34         this.x = x;
    35         this.y = y;
    36     }
    37 
    38     public String toString() {
    39         return "(" + x + "," + y + ')';
    40     }
    41 
    42     public boolean equals(Object object) {
    43         if (object == null) {
    44             return false;
    45         }
    46         if (object == this) {
    47             return true;
    48         }
    49         if (object instanceof Point) {
    50             Point point = (Point) object; // 强转为point类型
    51             return this.x == point.x && this.y == point.y;
    52         }
    53         return false;
    54     }
    55 }

    当我们重写 equals 方法后,就可以获取我们想要的结果了,即上面代码第 6 行结果输出为 true。同样的,只有自己定义的类需要重写,JAVA API 提供的类基本都重写了 equals。

  • 相关阅读:
    图论
    后缀数组专题
    AC自动机
    线段树·二
    nginx实现负载均衡
    关于mysql binlog二进制
    linux下每次git clone无需多次输入账号密码
    Centos7 yum安装 MySQL5.7.25
    docker基本操作和部署
    composer update 或者 composer install提示killed解决办法
  • 原文地址:https://www.cnblogs.com/weijiutao/p/11927146.html
Copyright © 2011-2022 走看看