本文已参与[新人创作礼]活动,一起开启掘金创作之路。
0. Introduction
这篇文章梳理了Java进阶知识中一些需要整理的概念,包括了面向对象、修饰符、异常等内容。仅作回顾复习之用。
1. What
- 什么是面向对象?有哪些相关概念?
- 修饰符有哪些?分别有什么作用?
- 类有哪些部分组成?分别有什么特点?
- 操作字符串的类有哪些?它们有什么区别?
2. Why
相关面试题:
- 在静态方法中调用非静态成员为什么是非法的?
- 为什么父类要定义无参构造器?
- 什么是hashCode?为什么重写equals方法要重写hashCode方法?
3. How
面试题回答:
- 在静态方法中调用非静态成员为什么是非法的?
答:因为调用非静态成员需要先创建对象,而使用静态方法不依赖于对象,调用静态方法时可能对象还未创建。
- 为什么父类要定义无参构造器?
答:因为子类执行构造方法时,如果没有用super()调用父类的特定构造器,就会默认调用父类的无参构造器,找不到时就会发生错误。
- 为什么重写equals方法要重写hashCode方法?
hash函数的作用是把任意长度的输入,通过散列算法得到散列值,是一种压缩映射,不同的hash函数有不同的算法。所有的hash值组成了hash表,每个对象的hashcode,就是该对象物理地址转换后,在hash表中的位置。hashCode使得查找更快捷。
两个对象相等,hashCode就相同;hashCode相同,两个对象不一定相同,只是在hash表中的位置相同。所以,在重写equals方法时,必须要重写hashCode方法,让相同的对象在hash表中处于相同的位置,以提高效率(否则可能导致HashMap、HashSet等不能正常运作,还可能内存泄露),这是通用约定。
4. Practice
题目:编程实现主人喂养宠物以及陪宠物玩耍的场景。
描述:主人Master有feed和play两种方法,宠物Pet有Dog和Cat类。主人feed触发宠物都有的eat方法,主人play对应每类宠物独有的动作方法,狗是catchDisc,猫是catchMouse。
效果:
参考代码:
Pet类
package Polymorphism;
public class Pet {
private String name;
public Pet() {
}
public Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat() {
}
}
Dog类
package Polymorphism;
public class Dog extends Pet {
public Dog() {
}
public Dog(String name) {
super(name);
}
public void catchDisc() {
System.out.println("玩抓飞盘");
}
@Override
public void eat() {
System.out.println("狗狗在啃骨头");
}
}
Cat类
package Polymorphism;
public class Cat extends Pet {
public Cat() {
}
public Cat(String name) {
super(name);
}
public void catchMouse() {
System.out.println("玩抓老鼠");
}
@Override
public void eat() {
System.out.println("猫咪在吃鱼");
}
}
Master类
package Polymorphism;
public class Master {
private String name;
public Master() {
}
public Master(String name) {
this.name = name;
}
public void feed(Pet pet) {
if (pet instanceof Dog) {
System.out.println(name + "喂养的是一只叫" + ((Dog) pet).getName() + "的狗狗");
} else if (pet instanceof Cat) {
System.out.println(name + "喂养的是一只叫" + ((Cat) pet).getName() + "的猫咪");
}
//重写的方法无需进行类型转换
pet.eat();
}
public void play(Pet pet) {
//特有方法,需要向下转型
if (pet instanceof Dog) {
System.out.print(name + "陪一只叫" + ((Dog) pet).getName() + "的狗狗");
((Dog) pet).catchDisc();
} else if (pet instanceof Cat) {
System.out.print(name + "陪一只叫" + ((Cat) pet).getName() + "的猫咪");
((Cat) pet).catchMouse();
}
}
}
Test类
package Polymorphism;
public class Test {
public static void main(String[] args) {
Master master = new Master("王五");
Dog dog = new Dog("旺财");
Cat cat = new Cat("大黄");
master.feed(dog);
master.feed(cat);
master.play(dog);
master.play(cat);
}
}