方法重写 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条)