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;
}