Java 类和对象中经典问题

这块也不知道该怎么总结,感受不少,但又不知道总结什么。可能高手到必定境界无招胜有招吧,哈哈,自吹了。java

总结本身以为比较出问题或者以前面试中影响比较深入的内容吧。面试

访问修饰符public,private,protected,以及不写(默认)时的区别?

修饰符 当前类 同包内 子类 其余类
private - - -
default - -
protected -
public

关于静态代码块、代码块、构造函数的执行顺序问题

public class Father {
    static {
        System.out.println("Father static");
    }
    {
        System.out.println("Father {}");
    }
    public Father() {
        System.out.println("Father()");
    }
}

public class Son extends Father {
    static {
        System.out.println("Son static");
    }
    {
        System.out.println("Son {}");
    }
    public Son() {
        System.out.println("Son()");
    }
    public static void main(String[] args) {
        Son son = new Son();
    }
}

打印结果:ide

输入图片说明

重写和重载

重载是同一个类中,而重写存在于子父类中。函数

知足条件:this

重写code

首先子类修饰符可见范围不能小于父类,返回值类型须要相同,方法名相同,方法的参数类型、个数、顺序须要相同,固然参数名容许不一样。对象

重载继承

方法名必须相同,方法参数的类型、个数或者顺序不能相同。注意:返回值类型不一样(特别注意:返回值类型能够是父类返回值类型的子类),其余相同不能构成重载。图片

public void sayHello(String name, Date time) {
        System.out.println("hello " + name + ",如今是" + time);
    }

    // 特别注意:
    // 返回值类型不一样是没法工程重载
    public Date sayHello(String name, Date time) {
        System.out.println("hello " + name + ",如今是" + time);
        return time;
    }

    // 参数顺序不一样
    public void sayHello(Date time, String name) {
        System.out.println("hello " + name + ",如今是" + time);
    }
    
    // 参数个数不一样
    public void sayHello(String name) {
        System.out.println("hello " + name);
    }

    // 参数类型不一样
    public void sayHello(String name, String context) {
        System.out.println("hello " + name + "," + context);
    }

final修饰的类、函数、变量的特色

  • final修饰的类不能被继承
  • final修饰的函数不能被重写
  • final修饰的变量的引用不能被修改,但能修改该引用的内容
private final List<String> list = new ArrayList<String>();
    
    // 特别注意:
    // 错误的修改final修饰变量的引用
    list = new ArrayList<String>();
    
    // 能够修改引用的内容
    public void test() {
        list.add("A");
    }

如何实现equals方法

public class Student {

    // 为了代码简约和正确性,不考虑对状态的封装
    public String name;
    public int age;

    @Override
    public boolean equals(Object o) {
        // 1. 判断引用的对象是否相同,相同则为相等
        if (this == o) return true;

        // 2. 判断传入对象是否为空,由于调用equals的对象确定不为空,若是object为空,则确定不等
        //    判断传入对象和this对象是否为同一个类构建的对象,若是不是,则确定不等
        if (o == null || getClass() != o.getClass()) return false;

        // 3. 若是是同一个类构建的对象,则能够转型为相同类的对象,方便观察其状态是否相同
        Student student = (Student) o;

        // 4. 观察状态是否相同。若是是基本数据类型,简单粗暴的使用== 。若是是对象,则还须要使用equals方法判断
        if (age != student.age) return false;
        return name.equals(student.name);

    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }
}

equals方法和hascode方法的关系

  • 若是两个对象调用equals返回true,则他们的hascode必须相同
  • 若是两个对象的hascode相同,并不能说明这两个对象equals
相关文章
相关标签/搜索