方法重写

方法重写,第1张

方法重写 1. 方法重写

方法重写 overrides(覆盖) 相当于覆盖父类的方法 所以如果需要父类的功能 必须将父类的方法调用一下

1.存在于父子类之间

2.方法名相同

3.参数列表相同

4.返回值相同 (或者是其子类)

5.访问权限不能严于父类(不能窄化访问权限)

6.父类的静态方法 可以被继承 不能被重写

7.普通方法不能重写为静态方法

8.不能抛出比父类更多的异常

1.1 @Override注解

@Override 注解加在方法上

表示此方法属于重写父类的方法

如果没有正确重写 将编译报错

此注解不会影响代码的功能

此注解可以提高代码的阅读性

package com.qfedu.test1;

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 Pet() {}
	
	public Pet(String name,int health,int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}
	
	
	void print() {
		System.out.println("宠物的名字是:" + name + ",健康值是:" + health);
		System.out.println("宠物的爱心值:" + love );
	}

}
package com.qfedu.test1;

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 name,int health,int love,String strain) {
		super(name, health, love);
		this.strain = strain;
	}

	
	@Override
	public void print() {
		super.print();
		System.out.println("狗狗的品种是:" + strain);
	}

}
package com.qfedu.test1;

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 name,int health,int love,String sex) {
		super(name, health, love); 
		this.sex = sex;
	}
	
	
	public void print() {
//		super.print();
		System.out.println("企鹅的性别是" + sex);
	}
	
}
package com.qfedu.test1;

public class Test {
	public static void main(String[] args) {
		Dog dog = new Dog("大黄", 100, 100, "大金毛");
		dog.print();
		
		Penguin p = new Penguin("大白", 100, 100, "雌");
		p.print();
	}
}
2. 重写和重载的区别(面试题)

方法重写和方法重载的区别

3. Object类

Object类是所有类的父类,我们编写的类默认继承自此类,所以我们可以直接使用继承自此类的方法

比如toString,equals等等

3.1 重写toString

我们直接输出一个对象,相当于调用此对象的toString方法,返回值为包名+类名+hash值

如果我们需要打印属性名属性值,就需要重写

package com.qfedu.test3;

public class Student {// extends Object 这一句写不写都一样
	private String name;
	private int age;
	private String sex;
	private String address;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public String toString() {
		//  super.toString() + "======"  实际开发不会使用父类的toString
		return  "Student[name= "+ name +",age = "+age+",address= "+ address+",sex = "+sex+"]";
	}
	
	
	public static void main(String[] args) {
		Student stu1 = new Student();
		stu1.setName("赵四");
		stu1.setAge(20);
		stu1.setAddress("象牙山");
		stu1.setSex("男人");
		
		System.out.println(stu1); // 当我们直接输出一个对象 相当于调用该对象的toString方法
		System.out.println(stu1.toString());// ctrl + 鼠标左键打开选项列表 默认就是第一个
    }
	
}

3.2 重写equals方法

3.2.1 模拟String类编写equals方法

package com.qfedu.test4;

public class MyString {
	public static void main(String[] args) {
		String str1 = "1hello";
		String str2 = "2hello";
		System.out.println(myEquals(str1, str2));

	}
	public static boolean myEquals(String  str1,String str2) {
		// 注意String类是length()方法  数组是length属性
		if(str1.length() != str2.length()) {
			return false;
		}
		char [] ch1 = str1.toCharArray(); // 转换为char数组
		char [] ch2 = str2.toCharArray();
		for(int i = 0;i < ch1.length;i++) { // 遍历数组 
			if(ch1[i] != ch2[i]) { // 同位置的元素进行比较
				return false; // 如果内容不容return false
			}
		}
		return true; // 代码能执行到这里 表示之前的return都没执行
	}
}

3.2.2 ==和equals的区别(面试题)

面试题:==和equals的区别?

==比较基本数据类型,比较的是值

==比较引用数据类型,比较的是地址

equals本身也是比较地址,我们可以重写equals方法,按照我们制定的比较规则来比较

String类就是对equals方法进行了重写,改为比较内容

3.2.3 重写equals方法

在现实生活中如果有"两个人"名字和身份z号都一样,那么肯定是同一个人

所以我们应该让这两个对象 使用equals比较为true 重写equals方法

package com.qfedu.test4;

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() {
	}
	public Person(String name, String idCard) {
		this.name = name;
		this.idCard = idCard;
	}
	
	 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("赵四", "4585689784512356898");
		Person p2 = new Person("赵四", "4585689784512356898");
		
		// 以上两个对象有关系吗?没有关系
		// 以上两个对象相同吗?不同 地址不同本质不同
		// 在现实生活中如果有"两个人"名字和身份z号都一样,那么肯定是同一个人
		// 所以我们应该让这两个对象 使用equals比较为true

		System.out.println(p1 == p2); // 引用数据类型比较的是地址
		System.out.println(p1.equals(p2));// false 比较的依然还是地址

	}	
}

3.3 重写hashCode方法

hashCode方法 此方法返回根据对象的地址等一些列信息计算出来的一个数值 int类型的 十进制数值

hash 杂凑算法 根据杂乱的条件计算出来的一个数值 杂凑算法的特点:正向是快速 不可逆的

为什么要重写hashCode方法 ?

因为在一些散列的数据结构中,要求,如果两个对象equals比较为true

那么它们的hashCode必须相同

package com.qfedu.test5;

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() {
	}
	public Person(String name, String idCard) {
		this.name = name;
		this.idCard = idCard;
	}
	
	 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 = 0;// 结果变量  用于作为返回值
		 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("赵四", "4585689784512356898X");
		Person p2 = new Person("赵四", "4585689784512356898");
		System.out.println(p1.equals(p2));
		
		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", idCard=" + idCard + "]";
	}
	
}

3.4 使用getClass方法

我们使用getClass方法 继续调用getName方法 获取当前对象的包名 + 类名

package com.qfedu.test5;

public class TestGetClass {
	public static void main(String[] args) {
		Person p = new Person();
		System.out.println(p.getClass().getName());
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5716617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存