多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗。
猫 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()方法:
- 当我们打印一个对象的引用时,实际上默认调用的就是这个对象的toString()方法。
- 当我们打印的对象所在的类没有重写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()方法---练习题:
1、GeometricObject类代码:
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;
}
}
-
- 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+"";//radius为double类型,需要转换为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 + "]";
}
}
3、TestCircle类(测试类):
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());
}
}