我是一个即将毕业的大学生,也将面临的找工作的问题,我希望找工作之前去积累一下自己的知识,每日三道题,不多也不少,重在理解透彻,不积跬步,无以至千里;不积小流,无以成江海,如果想飞的更远和更高,必须丰富自己的,从而在任何场面,轻松应付,所以希望通过写博客的方式从中巩固自己的知识,希望对小伙伴们也有帮助!
面向对象是相对于面向过程,面向过程指的功能行为,面向对象指将功能封装对象中,强调的是功能的对象。
比如:洗衣机和洗衣服
面向过程会将任务拆解成一系列的步骤(函数):1.打开洗衣机–》2.放衣服–》放洗衣粉—》4.清洗—》5.烘干
面向对象会拆出人和洗衣机两个对象:
人:打开洗衣机,放衣服,放洗衣粉
洗衣机:清洗,烘干
从以上例子能看出,面向过程直接高效,而面向对象更易于复用,扩展和维护。
面向对象三大特征:
封装:在于明确标识出允许外部使用的所以成员函数和数据项;
内部细节对外部透明,外部调用无需修改或者关心内部实现
继承:继承父类(基类)的方法,并做出自己的改变或扩展
子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的
多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
要求:继承,方法重写,父类引用指向子类对象
父类类型 变量名=new 子类对象();
变量名.方法名();
无法调用子类特有的功能
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
对于基本类型和引用类型 == 的作用效果是不同的。
基本类型:比较的是栈中的值是否相同;
引用类型:比较的是堆中内存对象的地址是否相同;
下面通过代码去理解:
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。
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 比较的是值是否相等。