String类、toString方法、equals()方法

​​​​​​

多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。、
5,toString和equals方法
tostring是强行把其他类型转换为string类型,例如:
People  ple =new People();//People这个类
ple.toString//转化为String
equals比较2个字符串是否相等,
String a="123"
String b ="123"
a.equals(b),就是相等的。

  • String类:

package com.atguigu.String;

 

public class TestString {

    public static void main(String[] args) {

        //关于String

        String str1="AA";

        String str2="AA";

        String str3=new String("AA");

        System.out.println(str1==str2);   //true

        System.out.println(str1.equals(str2)); //true

        System.out.println(str1==str3);   //false                                 System.out.println(str1.equals(str3)); //true

    }

}

 

注:”==”号比较的是地址;equals()方法比较的是二者的内容。

 

 

 

 

 

 

 

 

 

 

 

 

(1)、Person p1=new Person();

       Person p2=new Person();

P1与p2指向都一样(即地址值相同);

(2)、String str1=”AA”;

       String str2=”AA”;

这二者地址值也相同。

 

 

 

  • equals()方法的练习:

getters and setters方法体现了面向对象的封装性。

练习6--习题1、

package com.atguigu.exercise;

 

public class TestOrder {

    public static void main(String[] args) {

        Order o1 = new Order(1001, "AA");

        Order o2 = new Order(1001, "AA");

        System.out.println(o1 == o2); // false

        System.out.println(o1.equals(o2)); // false(没有重写equals()方法,用的仍然是系统的,比较的是地址值)

        //重写了equals()方法,此处就会调用重写的equals()方法,返回值由false变为true

    }

}

 

class Order {

    private int orderId;

    private String orderName;

 

    // 添加有参的构造器,可以在声明一个Order型对象时直接为属性赋值

    public Order(int orderId, String orderName) {

        super();

        this.orderId = orderId;

        this.orderName = orderName;

    }

 

    // getters and setters方法体现了封装性

    public int getOrderId() {

        return orderId;

    }

 

    public void setOrderId(int orderId) {

        this.orderId = orderId;

    }

 

    public String getOrderName() {

        return orderName;

    }

 

    public void setOrderName(String orderName) {

        this.orderName = orderName;

    }

 

    // 重写equals()方法,

    //重写的这个方法里面比较的是两个Order对象的属性是否完全相同。相同的话返回true;

    public boolean equals(Object obj) {

        if (this == obj) {// 如果当前对象的引用地址与形参obj一样

            return true;

        } else if (obj instanceof Order) { // 传的形参obj是否是Order的一个实例

            Order o1 = (Order) obj;

            return this.orderId == o1.orderId && this.orderName.equals(o1.orderName);

 

        } else {

            return false;

        }

    }

}

练习6—习题2:

package com.atguigu.exercise;

 

public class TestMyDate {

    public static void main(String[] args) {

        MyDate m1=new MyDate(14,3,1976);

        MyDate m2=new MyDate(14,3,1976); 

        //"=="比较的是地址值,以上new了两个对象,在堆中对应两块,两者地址值不同。

        if(m1==m2) {

            System.out.println("m1==m2");

        }else {

            System.out.println("m1!=m2");

        }

       

        if(m1.equals(m2)) {

            System.out.println("m1 is equals to m2.");

        }else {

            System.out.println("m1 is not equals to m2");

        }

    }

}

class MyDate{

    private int day;

    private int month;

    private int year;

   

    public MyDate(int day, int month, int yeear) {

        super();

        this.day = day;

        this.month = month;

        this.year = yeear;

    }

   

    public int getDay() {

        return day;

    }

    public void setDay(int day) {

        this.day = day;

    }

    public int getMonth() {

        return month;

    }

    public void setMonth(int month) {

        this.month = month;

    }

    public int getYear() {

        return year;

    }

    public void setYear(int yeear) {

        this.year = yeear;

    }

 

    //手动生称equals()方法

//  public boolean equals(Object obj) {

//      if (this == obj) {// 如果当前对象的引用地址与形参obj(Object类型)一样

//          return true;

//      } else if (obj instanceof MyDate) { // 传的形参obj是否是MyDate的一个实例

//          MyDate m = (MyDate) obj;

//          return this.day==m.day && this.month==m.month && this.year==m.year;

//

//      } else {

//          return false;

//      }

//  }

   

    //关于equals()方法更严谨的写法

    //自动生成equals()方法

    @Override

    public boolean equals(Object obj) {

        if (this == obj)

            return true;

        if (obj == null)

            return false;

        if (getClass() != obj.getClass())

            return false;

        MyDate other = (MyDate) obj;

        if (day != other.day)

            return false;

        if (month != other.month)

            return false;

        if (year != other.year)

            return false;

        return true;

    }

   

}

HashSet存放的元素都是各自不相同元素。

  • toString()方法:
  1. 当我们打印一个对象的引用时,实际上默认调用的就是这个对象的toString()方法。
  2. 当我们打印的对象所在的类没有重写Object类中的toString()方法时,那么调用的就是Object类中定义的toString()方法,并返回此对象所在的类及对应的堆空间对象实体的首地址。

3、如果重写toString()方法,一定按照格式:public String toString(){  …  }

4同equals()方法一样重写时存在手动实现和自动调用两种:

      //手动实现(toString基本是返回属性值的)

      public String toString(){         return “Person:name=”+name;  …;      }

      //自动调用

      SourceàtoString

5、在没有重写toString()方法时,调用的话返回是地址值;重写了toString的话返回值是真正的数值。

toString()方法---练习题:

1GeometricObject类代码:

package com.atguigu.toString.exercise;

 

public class GeometricObject{

    protected String color;

    protected double weight;

    //构造方法

    public GeometricObject() {

        this.color="white";

        this.weight=1.0;

    }

    public GeometricObject(String color,double weight) {

        this.color=color;

        this.weight=weight;

    }

    public String getColor() {

        return color;

    }

    public void setColor(String color) {

        this.color = color;

    }

    public double getWeight() {

        return weight;

    }

    public void setWeight(double weight) {

        this.weight = weight;

    }

}

    1. Circle类代码:

package com.atguigu.toString.exercise;

 

public class Circle extends GeometricObject{

    private double radius;

    public Circle() {

//      this.color="white";

//      this.weight=1.0;   这两行可省略,因为构造函数中开始如果不显式的声明调用的是父类还是什么,默认的是调用的父类。

        this.radius=1.0;

    }

    public Circle(double radius) {

        this.radius=radius;

    }

   

    public Circle(double radius,String color,double weight) {

        super();

        this.radius=radius;

        this.radius = radius;

    }

    public double getRadius() {

        return radius;

    }

    public void setRadius(double radius) {

        this.radius = radius;

    }

    //计算圆的面积

    public Double findArea() {

        return 3.14*radius*radius;

    }

    /*

     * 手动重写

     *

    //重写equals()方法和toString()方法

    public boolean equals(Object obj) {

        if(this==obj)

            return true;

        else if(obj instanceof Circle) {

            Circle c1=(Circle)obj;

            return this.radius==c1.radius;

        }else {

            return false;

        }

    }

    public String toString() {//包装类

//      return radius+"";//radiusdouble类型,需要转换为String类型

        return String.valueOf(radius);

    }

    **/

 

    /*

     * 自动生成重写Souece—>hashCode() and equals();

     * SourceàtoString()

     * */

    @Override

    public boolean equals(Object obj) {

        if (this == obj)

            return true;

        if (obj == null)

            return false;

        if (getClass() != obj.getClass())

            return false;

        Circle other = (Circle) obj;

        if (Double.doubleToLongBits(radius) != Double.doubleToLongBits(other.radius))

            return false;

        return true;

    }

    @Override

    public String toString() {

        return "Circle [radius=" + radius + "]";

    }

}

3TestCircle(测试类)

package com.atguigu.toString.exercise;

 

public class TestCircle {

    public static void main(String[] args) {

        Circle c1=new Circle(2.3);

        Circle c2=new Circle(2.3);

        System.out.println(c1.equals(c2));

        System.out.println(c1.toString());

    }

}

 

猜你喜欢

转载自blog.csdn.net/qq_39044046/article/details/93876783
今日推荐