1. 方法重写
1.1 @Override注解
package com.qfedu.test1;
/**
* 企鹅类父类
* 共有的属性
* 名字
* 健康值
* 爱心值
* 行为
* 打印信息
* super访问父类的普通方法
*
*
*/
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;
}
/**
* 方法重写 overrides(覆盖)
* 1.存在于父子类之间
* 2.方法名相同
* 3.参数列表相同
* 4.返回值相同 (或者是其子类)
* 5.访问权限不能严于父类(不能窄化访问权限)
*
* 6.父类的静态方法 可以被继承 不能被重写
* 7.普通方法不能重写为静态方法
* 8.不能抛出比父类更多的异常
*
* @Override 注解加在方法上 表示此方法属于重写父类的方法
* 如果没有正确重写 将编译报错
* 此注解不会影响代码的功能
*
* 此注解可以提高代码的阅读性
*/
@Override
public void print() {
super.print();
System.out.println("狗狗的品种是:" + strain);
}
}
package com.qfedu.test1;
/**
* 企鹅类
* 属性:
* 性别
* 行为:打印方法 print()
* 无参构造
*
*/
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;
}
/**
* 方法重写 overrides(覆盖)
* 相当于覆盖父类的方法 所以如果需要父类的功能
* 必须将父类的方法调用一下
* 1.存在于父子类之间
* 2.方法名相同
* 3.参数列表相同
* 4.返回值相同 (或者是其子类)
* 5.访问权限不能严于父类(不能窄化访问权限)
*
* 6.父类的静态方法 可以被继承 不能被重写
* 7.普通方法不能重写为静态方法
* 8.不能抛出比父类更多的异常
*
*/
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类
3.1 重写toString
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的区别(面试题)
3.2.3 重写equals方法
package com.qfedu.test4;
/**
* 面试题:==和equals的区别?
* ==比较基本数据类型,比较的是值
* ==比较引用数据类型,比较的是地址
* equals本身也是比较地址,我们可以重写equals方法,按照我们制定的比较规则来比较
* String类就是对equals方法进行了重写,改为比较内容
*/
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");
// 以上两个对象有关系吗?没有关系
// 以上两个对象相同吗?不同 地址不同本质不同
// 在现实生活中如果有"两个人"名字和身份证号都一样,那么肯定是同一个人
// 所以我们应该让这两个对象 使用equals比较为true
System.out.println(p1 == p2); // 引用数据类型比较的是地址
System.out.println(p1.equals(p2));// false 比较的依然还是地址
}
}
3.3 重写hashCode方法
package com.qfedu.test5;
/**
* hashCode方法 此方法返回根据对象的地址等一些列信息计算出来的一个数值 int类型的 十进制数值
* hash 杂凑算法 根据杂乱的条件计算出来的一个数值 杂凑算法的特点:正向是快速 不可逆的
*
* 为什么要重写hashCode方法 ?
* 因为在一些散列的数据结构中,要求,如果两个对象equals比较为true
* 那么它们的hashCode必须相同
*
*/
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方法
package com.qfedu.test5;
/**
* 我们使用getClass方法 继续调用getName方法 获取当前对象的包名 + 类名
*/
public class TestGetClass {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.getClass().getName());
}
}