
方法重写 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
3.2 重写equals方法我们直接输出一个对象,相当于调用此对象的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.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());
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)