栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

方法重写与多态(Java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

方法重写与多态(Java)

方法重写和多态 1. 重写equals方法

从现实生活的角度出发,在生活中,如果有"两个人",名字和身份证号都相同 那么这"两个人"肯定是同一个人,所以我们应该让这两个人比较为true ==属于运算符 我们无法改变比较规则 但是 equals可以 所以我们就重写equals

package com.edu.test1;

public class Person {
    private String name;
    private String idCard;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
    
    public Person(String name, String idCard) {
        this.name = name;
        this.idCard = idCard;
    }
    public Person() {
    }
    
     public boolean equals(Object obj) {
         if(this == obj) {
             return true;
         }
         
         Person p =(Person)obj; // 强制类型转换
         
         if(this.getName().equals(p.getName()) && this.getIdCard().equals(p.getIdCard())) {
             return true;
         }
         return false;
     }
    
    
    
    public static void main(String[] args) {
        Person p1 = new Person("赵四", "56121578432132656323231");
        Person p2 = new Person("赵四", "5612157843213265632323");
        
        // 从现实生活的角度出发,在生活中,如果有"两个人",名字和身份证号都相同
        // 那么这"两个人"肯定是同一个人,所以我们应该让这两个人比较为true
        // ==属于运算符 我们无法改变比较规则 但是 equals可以  所以我们就重写equals
        System.out.println(p1 == p2); 
        System.out.println(p1.equals(p2)); 
        
        Person p3 = new Person("广坤", "5623789756345987231");
        Person p4 = new Person("广坤", "5623789756345987231");
        
        System.out.println(p3.equals(p4));  
        
    }
}
2. 重写hashCode方法

hashCode 是根据对象的地址等信息使用hash算法所计算出来的一个十进制的数值

杂凑算法的特点:正向是快速的 不可逆的

实际开发中,我们重写了equals,通常都要重写hashCode方法

回顾,本身equals方法的作用是比较什么的呢?本身比较地址

地址相同的"两个对象",hash值肯定是相同,但是目前我们重写了equals方法

导致目前 equals方法按照内容(名字和身份证号)来比较,内容相同则比较为true

但是hashCode却不相同,我们应该继续保持这种规则:

equals比较为true,hash值必须相同

在一些散列数据结构中,是以两个对象equals比较为true,并且hashCode相同来认为是重复的对象

不允许重复添加

package com.edu.test2;

public class Person {
    private String name;
    private String idCard;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
    
    public Person(String name, String idCard) {
        this.name = name;
        this.idCard = idCard;
    }
    public Person() {
    }
    
     public boolean equals(Object obj) {
         if(this == obj) {
             return true;
         }
         
         Person p =(Person)obj; // 强制类型转换
         
         if(this.getName().equals(p.getName()) && this.getIdCard().equals(p.getIdCard())) {
             return true;
         }
         return false;
     }
     
     public  int hashCode() {
         int prime = 31; // 权重 (决定性因素)
         int result = 1;
         result = prime * result + (this.getName() == null ? 0 : this.getName().hashCode());
         result = prime * result + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
         return result;
     }
​
    
    public static void main(String[] args) {
        Person p1 = new Person("赵四","2356457845129");
        Person p2 = new Person("赵四","235645784512");
        System.out.println(p1.equals(p2));
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        
        
    }
}
​
3. 为什么使用31计算hash值(了解)

为什么使用31作为计算权重 ?

不是必须使用31的 使用31的原因如下:

31是一个特殊的质数 任何数乘以31 等于这个数 左移5位 减去这个数本身

总结:使用31计算hash值效率比较高

左移几位表示乘以2的几次方 右移几位表示除以2的几次方

n * 31 = (n << 5) - n

package com.edu.test2;

public class TestPrime {
    public static void main(String[] args) {
        int num =3;
        System.out.println(num * 31);
        System.out.println((3 << 5) -3);
        
        
        
    }
}
​
4. 使用getClass方法

getClass方法用于返回当前对象的类型 返回值为Class类型

使用这个方法可以获取当前对象的信息

package com.edu.test3;

public class Test1 {
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        System.out.println(test1.getClass().getName());
    }
}
​
5. 多态

多态:多种形态

生活中的多态:指同一个事物/动作,因为环境的不同,产生不同的效果

程序中的多态:指同一段代码,因为实际参数或者返回值的不同,产生完全不同的效果

多态的两种表现形式:

1.父类作为形参,子类作为实参。

父类引用指向子类对象( Pet pet = new Dog(); double a = 20;)属于自动向上转型,此时可以调用的是子类重写父

类的方法和继承自父类的方法 ,不能访问子类独有的方法

2.父类作为返回值,实际返回值为子类类型

package com.edu.test5;

public class Pet {
    private String name;
    private int health;
    private int love;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getHealth() {
        return health;
    }
    public void setHealth(int health) {
        this.health = health;
    }
    public int getLove() {
        return love;
    }
    public void setLove(int love) {
        this.love = love;
    }
    
    public void print() {
        System.out.println("宠物的名字是:" + name + ",健康值是:" + health + ",爱心值是:" + love );
    }
    
    public void cure() {
        System.out.println("给宠物看病");
    }
    
    
    public Pet() {
    }
    
    public Pet(String name, int health, int love) {
        this.name = name;
        this.health = health;
        this.love = love;
    }   
}
package com.edu.test5;
​
public class Cat extends Pet{
    private String furColor;
    
    public String getFurColor() {
        return furColor;
    }
​
​
    public void setFurColor(String furColor) {
        this.furColor = furColor;
    }
​
    public Cat() {
    }
    public Cat(String name, int health, int love,String furColor) {
        super(name, health, love);
        this.furColor = furColor;
    }
​
​
    public void cure() {
        System.out.println("猫咪看病,打针,吃小鱼");
        this.setHealth(100);
    }
}   
​
package com.edu.test5;

public class Dog extends Pet{
    
    private String strain;
    
    public String getStrain() {
        return strain;
    }
    public void setStrain(String strain) {
        this.strain = strain;
    }
    
    public Dog() {
    }
    
    public Dog(String strain,String name,int health,int love) {
        super(name, health, love);
        this.strain = strain;
    }
    
    public void cure() {
        super.cure();
        System.out.println("狗狗看病,吃药打针,吃骨头,健康值恢复");
        this.setHealth(100);
        this.setLove(100);
    }
}
​
package com.edu.test5;

public class Penguin extends Pet{
    private String sex;
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Penguin() {}
    
    
    
    public Penguin(String sex,String name,int health,int love) {
        super(name, health, love);
        this.sex = sex;
    }
    public void cure() {
        System.out.println("企鹅看病,疗养,输液,吃小鱼,健康值恢复");
        this.setHealth(100);
        this.setLove(100);
    }
    
}
​
package com.edu.test5;

public class TestPet {
	public static void main(String[] args) {
		Master zhaosi = new Master();
		zhaosi.setName("赵四");
		
		
		Dog dog = new Dog("金毛", "大黄", 65, 65);
		Penguin penguin = new Penguin("雄", "小黑", 70, 65);
		Cat cat = new Cat("小绿", 20, 20, "红色");
		
		zhaosi.toHospital(dog); // 向上转型  子类类型自动提升父类类型
		zhaosi.toHospital(penguin);
		zhaosi.toHospital(cat);
		
		System.out.println(dog.getHealth());
		System.out.println(penguin.getHealth());
		
		
		
		
	}
}

6.案例
package com.edu.test6;

public class Computer {
	public void study() {
		System.out.println("敲代码学习");
	}
}
class BookComputer extends Computer{
	@Override
	public void study() {
		super.study();
		System.out.println("笔记本敲代码很方便");
	}
}

class PadComputer extends Computer{
	@Override
	public void study() {
		super.study();
		System.out.println("平板电脑敲代码不舒服");
	}
}


class DesktopComputer extends Computer{
	@Override
	public void study() {
		super.study();
		System.out.println("台式机显示器很大,敲代码很刺激");
	}
}

class Student{
	public void gotoQianFeng(Computer computer) {
		computer.study();
	}
}
package com.qfedu.test6;


public class Test {
	public static void main(String[] args) {
		Student zhaosi = new Student();
		BookComputer huawei =new  BookComputer();
		DesktopComputer hp = new DesktopComputer();
		PadComputer lenovo =new PadComputer();
		
		
		
		zhaosi.gotoQianFeng(huawei);
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845826.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号