Java进阶知识(一)

100 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

0. Introduction

这篇文章梳理了Java进阶知识中一些需要整理的概念,包括了面向对象、修饰符、异常等内容。仅作回顾复习之用。

1. What

  • 什么是面向对象?有哪些相关概念?

image.png

  • 修饰符有哪些?分别有什么作用?

image.png

  • 类有哪些部分组成?分别有什么特点?

image.png

- 异常简单分类

image.png

  • 操作字符串的类有哪些?它们有什么区别?

image.png

2. Why

相关面试题:

  1. 在静态方法中调用非静态成员为什么是非法的?
  2. 为什么父类要定义无参构造器?
  3. 什么是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。

效果:

image.png

参考代码:

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