本文发表于本人博客

今天我来说说关于静态变量初始化、数组、==与equals的问题,看下面代码:

public class Test{
private final int age; private String name; public Test(){
age = 30;
} public Test(String name){
this.name = name;
}
}

我想上面的代码好多人都知道了会编译报错的,原因是在代餐构造函数中未对age进行复制操作。

对于终态变量final程序中是可以再2个地方赋值的,一是申明后赋值,二是构造函数中赋值,上面的代码带参构造修改成如下:

    public Test(String name){
age = 30;
this.name = name;
}

这样编译就没问题可以通过了。那现在我们把这个age变量的修饰符增加static,看代码:

public class Test{
private static final int age; private String name; public Test(){
age = 30;
} public Test(String name){
age = 30;
this.name = name;
}
}

说说这样编译能通过吗!这样也是不行的,分析下当这个age变量变味static时它已经不属于任何对象了是属于类Test的了,那么如果在构造对象的时候还去赋值修改原有的值那肯定不行了,它只有在申明时候赋值,代码修改如下:

public class Test{
private static final int age = 30; private String name; public Test(){
} public Test(String name){
this.name = name;
}
}

继续看下面代码,看看这个能编译吗?

public class Test{
public static final StringBuffer sb = new StringBuffer();
public static void main(String[] args){
sb.append("www.luoliang.me");
}
}

这个比较简单,竟然sb为类常量,那么由于是类,它的引用地址是不能再修改了,但是这个指向的地址的内容是可以被修改的。

继续看下面代码,试问编译通过吗?如果不通过,哪里有问题?

interface I{}
public class demo{
public static void main(String[] args){
I[] iArray = new I[2];
I i = new I();
}
}

上面的代码大家看了就知道,接口interface是不能实例化的,那么new I()肯定是不行的。至于这个new来实例化I的数组,这个可以吗,先解析下,由于数组里面的元素是对象,那么对象是可以为null的,这样的话new I[2]表示长度为2的I对象数组,至于数组的元素一定是要继承接口I了,比如:

class Test implements I{
}
iArray[0] = new Test();

现在我们来看看这个==与equals的问题,在网上也好多了,现在自己再复习下,看下面代码:

public class Test{
public static void main(String[] args){
String str1 = new String("luoliang.me");
String str2 = new String("luoliang.me");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
}

试问输出什么?这个倒是简单很多人都知道了,如果是基本类型==比较的是其值,如果是引用类型比较的是其地址。那equals这个方法呢,所有对象都是Object的子类,那我们查看下jdk源码中的Object,可以看到:

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

他们是直接比较的地址啊,是==。那字符串呢,先不说我们看看String类的equals方法:

    public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

可以看到起源码是先比较是否是同一个字符串,如果是的话返回true,如果不是的话继续比较他们各次的字符。那现在我们就知道答案了,输出如下:

false
true

接下来我们来看如下代码:

class Person{
public String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}

现在如果2个Person对象进行比较,如果是名称name相同则判断是同一个人,怎么做?先分析一下:判断是否同一个人,这个对象是继承基类Object的,本身有equals方法,那按照String类的方法重写Override一下应该就可以解决了,看下面:

class Person{
public String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof Person) {
Person person = (Person)anObject;
if(person.name.equals(this.name)){
return true;
}
}
return false;
}
}

调用如下:

        Person p1 = new Person("luoliang");
Person p2 = new Person("luoliang");
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));

输出结果:

false
true

这次先到这里。坚持记录点点滴滴!

Java基础知识陷阱(五)的更多相关文章

  1. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  2. Java基础知识陷阱(九)

    本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...

  3. Java基础知识陷阱(十)

    本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...

  4. java基础知识(五)java类

    类是java的核心和本质,是java语言的基础. 一.java中的类 1.类class 一个类可以包含局部变量.实例变量.类变量(静态变量) 一个类至少有一个构造方法,如果没有,系统会默认给出一个无参 ...

  5. Java基础知识陷阱(二)

    本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...

  6. Java基础知识陷阱(七)

    本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0. ...

  7. Java基础知识陷阱(六)

    本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; ...

  8. Java基础知识陷阱(四)

    本文发表于本人博客. 今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因? public class Test{ public static ...

  9. Java基础知识陷阱(三)

    本文发表于本人博客. 之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量.静态方法,先看下面的代码请问结果输出是什么?: class Person01{ private stat ...

随机推荐

  1. php -- PDO预处理

    可以使用多种方式实现预处理:指的是在绑定数据进行执行的时候,可以有多种方式. 预处理语句中为变量 使用数组指定预处理变量 1.准备预处理语句(发送给服务器,让服务器准备预处理语句) PDOStatem ...

  2. ie设置ActiveX控件不提示

    ie设置自动允许activex: 对安全设置-受信任的站点区域-对未标记为可安全执行脚本的ActiveX控件初始化并执形脚本(启用)

  3. 如今就报名上海ORACLE用户组2014年高峰论坛吧!

    COLLABORATE 14 – SHOUG Forum 上海ORACLE用户组2014年高峰论坛报名本次活动由ORACLE ACS高级服务部门与 SHOUG 上海ORACLE用户组合办. 大会议程包 ...

  4. uc 调试

    UC浏览器开发者版 目录[隐藏] 1 关于RI 2 准备工作 3 调试方式 相关下载 1 关于RI 目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机 ...

  5. Laravel5.1 关联模型之后操作

    之前写过关于模型关联的笔记,但是模型关联好后的一些使用没有介绍,今天补上 1 写入关联模型 1.1 使用Save方法(一对多) 我们准备了两个模型:Post和Comment. 它们的关系是一对多关系. ...

  6. ielowutil.exe应用程序错误解决方法

    转载: http://wenda.so.com/q/1484111785202192 控制台方法: .按住“Window”+“R”->输入“cmd”->确定 .输入“ ”->回车-& ...

  7. 第十篇:Linux中权限的再讨论( 上 )

    前言 在Linux系统中,用户分为 个权限位.好了,很多朋友对于Linux权限的了解就仅限于此了.但,Linux目录权限和文件权限一样吗?内核对于权限的检查过程又是怎样的? 如果你不清楚,本文将为你解 ...

  8. NUC972 MDK NON-OS

     NUC972直接可以在BSP包里模板进行编程,烧录用Nu writer  http://www2.keil.com/mdk5/legacy 下载对应的安装包的插件 是直接下载到DDR 里面去运行,所 ...

  9. 基于Consul+Upsync+Nginx实现动态负载均衡

    基于Consul+Upsync+Nginx实现动态负载均衡 1.Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/l ...

  10. 设置PYTHONIOENCODING

    PYTHONIOENCODING=utf8