12.方法重写和多态

方法重写和多态

一.方法重写的作用和使用

@Override 规范上 推荐加上 校验是否是方法重写。
**方法重写:**子类 继承了 父类的方法后,如果发现在需求下,父类的某些方法不太强大,我们就可以在子类中进行重写。

/**
* 宠物自白
*/
@Override // 注解不报错 说明你写的就是方法重写 (规范:必须要加)
public void showMyself() {
super.showMyself();
System.out.println(“我的品种:”+breed);
}

[方法重写和方法重载的区别(面试题)]
方法重写的特点:
在继承中的子类中,子类继承了父类的方法后,方法名相同,参数列表也相同
方法的返回值类型不能大于父类
方法的访问修饰符不能严于父类(父类是默认的 你写的是私有的)
**了解:**不能比父类跑出更多更大的异常
方法重载的特点:
在同一个类中,方法名相同,参数列表不同(类型,个数,顺序不同…),这种情况就是方法重载。与方法的返回值类型和访问修饰符无关。

二.深入理解继承并了解Object类

**Object:**是Java中最顶级的类,超类(super class)
任何类都是直接或者间接继承自Object。
Ctrl+T:查看继承体系
Ctrl+shift+T:搜索类
Ctrl+O:查看本类中左右属性和方法
Object它有很多方法,只要是定义一个类,这些方法都可以被定义的类继承过去。

1.toString();//转换为字符串
public String toString() { // 默认输出当前对象的伪地址值
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
2.equals();//判断相等
public boolean equals(Object obj) { // 默认是用==来进行比较的
return (this == obj);
}
3.hashCode();//获取哈希值
4.getClass();//获取字节码对象

这些方法在Object中都有基本的实现内容,但是我们的需求一直多变,所以Object中的方法,不太适合,那么就可以进行方法重写。
**例如:**String类默认重写了equals()方法

[==和equals的区别(面试题)]
如果比较基本数据类型,比较的是值内容
而如果比较引用数据类型,比较的是内存地址
equals方法,默认情况下(Object)和
是一样的
但是在String中重写了equals之后就可以进行比较内容了
(最终的最终比较的是两个字符串中字符数组而已)

String:字符串 它本质上就是一个字符数组。
下方是字符串重写的equals方法:
例如调用:
String name = “xxx”;
String name1 = “xxx”;
name.equals(name1);


public boolean equals(Object anObject) {
// 比较内存地址 如果地址值相同 说明是同一个 那么直接返回true
if (this == anObject) {
return true;
}

    // 判断anObject 是不是字符串类型的 如果不是没法比 直接结束
    if (anObject instanceof String) {
        // 如果anObject是一个字符串类型  那么首先向下类型转换为String
        String anotherString = (String)anObject;
        // 获取this它的value数组(字符数组)的长度
        int n = value.length;
        // 判断是否字符串的长度一致  如果不一致 直接结束
        if (n == anotherString.value.length) {
            // 比较字符是否完全一致
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                // 只要其中发现不一样的字符  立马结束
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            // 如果一切正常  返回true
            return true;
        }
    }
    return false;
}

Alt+Shift+s h 生成重写后的hashCode和equals方法。

三.理解重写equals()方法

.
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}.

四.多态的作用和使用(初级使用)

多态的通俗解释:父类的引用可以传入子类对的对象。

如何使用多态

1.编写宠物主人类,在宠物主人类给不同的宠物喂食.
public class Master{

public void feedDog(Dog dog){
    dog.eat();
}
public void feedPenguin(Penguin penguin){
    penguin.eat();
}
....

}
2.缘由:发现如果未来还要领养更多的宠物,那么肯定要增加更多的喂食方法!
使用多态来进行优化。 父类的引用作为方法的形参。
public class Master{
// 父类的引用可以传入子类的对象
public void feedDog(Pet pet){
pet.eat();
}
}
3.导致的缘由(牵连):因为这时候调用的是Pet这个父类中的通用方法,所以导致不同的宠物,吃食是一样的,但是显然不可能。
父类的方法不够强大时,子类要进行方法重写!
在多态的场景下,如果调用方法,实际执行的是子类重写后的方法。
public class Pet{
public void eat(){

}

}
public class Dog{
@Override
public void eat(){
syso(“吃骨头!”);
}
}
public class Penguin{
@Override
public void eat(){
syso(“吃鱼!”);
}
}
4.牵连导致!我们发现父类中的eat()方法,根本就没有必要再进行实现!里面多一行代码都是浪费。
但是这个方法是不能被删除的,因为父类的引用要调用,子类还要进行重写。
将此方法定义为抽象方法。
由它又导致,这个类变为了抽象类。
public abstract class Pet{
// 抽象方法没有方法体 而且 必须被子类重写
public abstract void eat();
}
2.父类的引用作为方法的返回值类型
1.编写宠物商店类,宠物商店有不同宠物的领养方法。
public class PetStore {
/**
* 领养狗
* @return
*/
public Dog getDog() {
Dog dog = new Dog();
return dog;
}

/**
 * 领养企鹅
 * @return
 */
public Penguin getPenguin() {
    Penguin penguin = new Penguin();
    return penguin;
}

}
2.缘由:未来可能宠物店有更多的宠物可以被领养,那么就需要编写N多个方法用于不同宠物的领养。
使用多态来优化,因为最终无论是返回什么宠物,它们都是Pet类的子类。]
public class PetStore{
// 父类的引用作为方法的返回值类型。
public Pet getPet(int choose){
if(choose == 1){
return new Dog();
}else if(choose == 2){
return new Penguin();
}else{
return null;
}
}
}
3.编写测试类进行领养测试
public class Test{
public static void main(String[] args){
PetStore petStore = new PetStore();
// Pet pet = new Dog();
Pet pet = petStore.getPet(1);
pet.setName(“小哈”);
pet.eat();
}
}

五.掌握instanceof关键词

instance:实例
instanceof:…的实例

判断某个对象是否是某个类型的实例
语法: 对象名 instanceof 类型

六.掌握向上和向下转型

之所以要进行类型转换,原因就是因为父类的引用无法访问子类特有的内容,所以才需要进行转换。

**类型转换:**强制类型转换 和 自动类型转换
1.强制类型转换: Dog dog = (Dog)pet; // int num = (int)10.1;
2.自动类型转换: Pet pet = new Dog(); // double num = 10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值