编程语言
首页 > 编程语言> > Java面试题:每日三道题;

Java面试题:每日三道题;

作者:互联网

Java面试题

说明:

我是一个即将毕业的大学生,也将面临的找工作的问题,我希望找工作之前去积累一下自己的知识,每日三道题,不多也不少,重在理解透彻,不积跬步,无以至千里;不积小流,无以成江海,如果想飞的更远和更高,必须丰富自己的,从而在任何场面,轻松应付,所以希望通过写博客的方式从中巩固自己的知识,希望对小伙伴们也有帮助!

1.什么是面向对象?谈谈你对面向对象的理解

面向对象是相对于面向过程,面向过程指的功能行为,面向对象指将功能封装对象中,强调的是功能的对象

比如:洗衣机和洗衣服
面向过程会将任务拆解成一系列的步骤(函数):1.打开洗衣机–》2.放衣服–》放洗衣粉—》4.清洗—》5.烘干

面向对象会拆出人和洗衣机两个对象:
人:打开洗衣机,放衣服,放洗衣粉
洗衣机:清洗,烘干

从以上例子能看出,面向过程直接高效,而面向对象更易于复用,扩展和维护。
面向对象三大特征:
封装:在于明确标识出允许外部使用的所以成员函数和数据项;
内部细节对外部透明,外部调用无需修改或者关心内部实现
继承:继承父类(基类)的方法,并做出自己的改变或扩展
子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的
多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
要求:继承,方法重写,父类引用指向子类对象

父类类型 变量名=new 子类对象();
变量名.方法名();
无法调用子类特有的功能

2.JDK,JRE,JVM三者区别和联系

JDK(java Development kit) : jdk是提供给java开发人员使用的,其中包含了java的开发工具:编译工具(javac.exe)打包工具(jar.exe)等。它是Java开发运行环境。
JRE(java Runtime Environment):它是Java运行环境,如果你不需要开发只需要运行Java程序,那么你可以安装JRE。
例如:程序员开发出的程序最终卖给了用户,用户不用开发,只需要运行程序,所以用户在电脑上安装JRE即可。
jvm:java虚拟机

JDK包含了JRE。
JRE包含了JVM。
JDK>JRE>JVM

在这里插入图片描述

3.==和equals

  1. == 解读

对于基本类型和引用类型 == 的作用效果是不同的。

基本类型:比较的是栈中的值是否相同;
引用类型:比较的是堆中内存对象的地址是否相同;

下面通过代码去理解:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用(也就是堆中对象地址相同,如图一),所以 == 也是 true,而 new String()方法则重写开辟了内存空间(也就是对象地址不相同,如图二),所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
在这里插入图片描述
在这里插入图片描述

  1. equals 解读

equals 本质上就是 ==(如下图代码),只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较(也就是比较字符串的内容)。看下面的代码就明白了。

public boolean equals(Object obj) {
		return (this == obj);
}

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {
    public Cat(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Cat c1 = new Cat("ysy");
Cat c2 = new Cat("ysy");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) {
		return (this == obj);
}

图解:

在这里插入图片描述

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) {
  //两个对象地址是否一样,是,肯定是同一个对象
    if (this == anObject) {
        return true;
    }
      //两个对象地址是否一样,是,肯定是同一个对象
    if (anObject instanceof String) {
          //强转为String类型
        String anotherString = (String)anObject;
        int n = value.length;
          //两个字符串长度是否一样,不一样肯定不相等
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
             //字符串长度一样,比较里面得字符是否一对一的相同
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

总结== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

标签:面试题,Java,String,三道,equals,面向对象,true,JRE,name
来源: https://blog.csdn.net/qq_50231389/article/details/117773843