方法重写和多态

1. 实现方法重写

[面试题]

**方法重载:**发生在同一个类中,出现的方法名相同,参数列表不同的情况!与返回值类型(构造方法没有返回值类型)和访问修饰符无关!

**方法重写:**发生在子类和父类之间,当子类继承了父类的方法信息之后,如果觉得不够强大,可以进行优化、重写!方法名相同。参数列表也相同,返回值类型相同或者为其子类,访问修饰符不能严于父类!

注解@override 为了帮助你检验是否是方法重写![推荐]

比较项位置方法名参数表返回值访问修饰符
方法重写子类相同相同相同或是其子类不能比父类更严格
方法重载同类相同不相同无关无关

2. 深入理解继承相关概念

3. 了解Object类

超级类、祖宗类!

你定义的每个类其实都直接或间接继承自Object类。

[面试题]equals和==的区别?

  • equals默认情况下调用的比较就是==

  • ==如果比较基本数据类型 比较的是值内容。如果比较引用数据类型 比较的是地址值。

    // Object里的默认实现
    public boolean equals(Object obj) {
         return (this == obj);
    }
    
  • equals在字符串(String)中被重写了,所以可以被用来比较字符串的内容。

    public boolean equals(Object anObject) {
        	// 判断地址值是否相同  如果地址值相同肯定是同一个
            if (this == anObject) {
                return true;
            }
        	// 判断是否是字符串类型的数据 如果是字符串类型的数据才能比较
            if (anObject instanceof String) {
                // 转换为字符串(向下转型)
                String anotherString = (String)anObject;
                // 获取value的长度  /** The value is used for character storage. */
                // 获取的是当前字符串的字符长度
                int n = value.length;
                // anotherString.value.length 获取要比较的字符串长度
                // 如果相同 那么继续往下比
                if (n == anotherString.value.length) {
                    // 先将两个字符数组存储起来
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    // 循环遍历两个数组
                    /**
                    for(int i = 0; i < v1.length; i++){
                        if(v1[i] != v2[i]){
    						return false;
                        }
                    }
                    */
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true; // 结束循环 两个字符串内容相同
                }
            }
            return false;
       }
    

我们重写的equals:

public class Student {

	public int id;
	public String name;
	public int age;
}	
	// Alt+Shift+S  -> h
	@Override
	public boolean equals(Object obj) {
        // 比较地址值
		if (this == obj)
			return true;
        // 比较是否为空  java.lang.NullPointerException 
		if (obj == null)
			return false;
        // 获取类型  == instanceof
		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;
	}

4. 会使用重写实现多态机制

多态:多种形态。 父类的引用指向子类的对象。

  • 父类的引用作为方法的形参
  • 父类的引用作为方法的返回值类型
  • (多态)父类在调用方法时 如果子类有重写过的方法 会执行子类重写后的
/**
 * 主人类
 * @author Charles
 *
 */
public class Master {

	/*public void feedMonkey(Monkey monkey) {
		
	}
	
	public void feedTiger(Tiger tiger) {
		
	}*/
	
	// 多态:父类的引用/声明   指向了子类的对象
	// 多态应用1.父类的引用可以作为方法的形参
	// Pet pet = new Pet();
	// Pet pet = new Monkey();
	// Pet pet = new Tiger();
	public void feedPet(Pet pet) {
		// 父类的引用无法直接调用子类特有的内容
		// instanceof 判断对象是否是某个类型
		if(pet instanceof Monkey) {
			System.out.println("香蕉香蕉!");
		}else if(pet instanceof Tiger) {
			System.out.println("猴子猴子!");
		}
	}
	
	/*public Monkey getMonkey() {
		return new Monkey();
	}
	
	public Tiger getTiger() {
		return new Tiger();
	}*/
	// 多态应用2.父类的引用可以作为方法的返回值类型
	public Pet getPet(int choice) {
		if(choice == 1) {
			return new Monkey();
		}else if(choice == 2) {
			return new Tiger();
		}
		return null;
	}
	
}

5. 会使用instanceof运算符

instanceof(…的对象/实例):用来判定是否是某个类型的对象。

String str1 = "xxx";

str1(对象) instanceof String(类型) 表示判断str1是否是字符串类型

6. 会使用向上、向下转型

类型转换。

自动类型转换

强制类型转换

Pet pet = new Monkey(); // 自动类型转换 向上转型

// 父类的引用无法调用子类的特有特征 所以需要强转

Monkey mon = (Monkey)pet; // 强制类型转换 向下转型

一般配合instanceof进行转型!

if(pet instanceof Monkey){

Monkey mon = (Monkey)pet;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值